Quiero crear y ejecutar Docker usando el cliente Docker Java. Quiero ejecutar algo como esto:
docker run -d -p 4444:4444 --name selenium-hub selenium/hub:2.53.0¿Cómo implementar este comando en el cliente docker-java? Aquí está mi código hasta ahora :
CreateContainerResponse response = dockerClient.createContainerCmd("selenium/hub") .withName(name) .exec();En realidad IDK cómo especificar -d (para ejecutar en segundo plano). y P. por favor, ayúdame. Lo siento, soy nuevo en Docker.
docker-java versión 3.1.0 ha movido el método withPortBindings de la clase CreateContainerCmd a la clase HostConfig .
Aquí está la forma actualizada de hacerlo:
ExposedPort tcp4444 = ExposedPort.tcp(4444); Ports portBindings = new Ports(); portBindings.bind(tcp4444, Ports.Binding.bindPort(4444)); // create container from image CreateContainerResponse container = dockerClient.createContainerCmd("selenium/hub:2.53.0") .withExposedPorts(tcp4444) .withHostConfig(newHostConfig() .withPortBindings(portBindings)) .withName("selenium-hub") .exec(); // start the container dockerClient.startContainerCmd(container.getId()).exec();Como nota al margen, tuve que mirar las pruebas unitarias en el repositorio docker-java para encontrar cómo hacer esto. Parece que ese es el lugar para ir a encontrar ejemplos de trabajo.
docker-java tiene un buen wiki en https://github.com/docker-java/docker-java/wiki . La búsqueda de "puerto" me dio esto:
Cree un nuevo contenedor Docker e inícielo con puertos expuestos
ExposedPort tcp22 = ExposedPort.tcp(22); ExposedPort tcp23 = ExposedPort.tcp(23); Ports portBindings = new Ports(); portBindings.bind(tcp22, Ports.Binding(11022)); portBindings.bind(tcp23, Ports.Binding(11023)); CreateContainerResponse container = dockerClient.createContainerCmd("busybox") .withCmd("true") .withExposedPorts(tcp22, tcp23) .withPortBindings(portBindings) .exec();
Revisé algunas pruebas en docker-java y parece que solo hiciste la mitad del trabajo para ejecutar un contenedor, porque solo creaste el contenedor y no lo iniciaste . Según lo que veo en esta prueba ( https://github.com/docker-java/docker-java/blob/069987852c842e3bba85ed3325a8877c36f9e87f/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java#L69 ), su código debería verse así:
ExposedPort tcp4444 = ExposedPort.tcp(4444); Ports portBindings = new Ports(); portBindings.bind(tcp4444, Ports.Binding(4444)); // Create the container (it will not be running) CreateContainerResponse container = dockerClient.createContainerCmd("selenium/hub") .withName(name) .withExposedPorts(tcp4444) .withPortBindings(portBindings) .exec(); // Actually run the container dockerClient.startContainerCmd(container).exec();Por lo que puedo decir, no hay razón para ejecutarlo explícitamente en modo separado porque se iniciará de forma asíncrona de forma predeterminada.
Encontré la solución... si alguien encuentra una mejor, publíquela aquí. Ya modifiqué el código para que quede así:
ExposedPort tcp4444 = ExposedPort.tcp(4444); Ports portBindings = new Ports(); portBindings.bind(tcp4444,Ports.Binding.bindPort(4444)); CreateContainerResponse response = dockerClient. createContainerCmd("selenium/hub") .withName(name) .withImage("selenium/hub:"+version) .withExposedPorts(tcp4444) .withPortBindings(portBindings) .withAttachStderr(false) .withAttachStdin(false) .withAttachStdout(false) .exec();`