如何创建和启动具有特定端口的 Docker 容器,分离模式使用 docker-java
How To Create And Start Docker Container with specific port, detached mode using docker-java
我想创建 运行 docker 使用 docker java 客户端。我想要 运行ning 这样的东西 :
docker run -d -p 4444:4444 --name selenium-hub selenium/hub:2.53.0
如何在docker-java客户端实现这个命令?到目前为止,这是我的代码:
CreateContainerResponse response = dockerClient.createContainerCmd("selenium/hub")
.withName(name)
.exec();
实际上我不知道如何指定 -d(对于 运行ning 在后台)。和-p。
请帮我。抱歉,我是 Docker.
的新人
docker-java 在 https://github.com/docker-java/docker-java/wiki 上有一个不错的 wiki。搜索 "port" 得到了这个:
Create new Docker container and start it with exposed ports
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();
我查看了 docker-java 中的一些测试,看起来你只做了 运行 容器的一半工作,因为你只 创建了 容器但没有启动它。根据我在此测试 (https://github.com/docker-java/docker-java/blob/069987852c842e3bba85ed3325a8877c36f9e87f/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java#L69) 中看到的内容,您的代码应如下所示:
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();
据我所知,没有理由在分离模式下显式 运行 它,因为默认情况下它将异步启动。
找到解决方案...如果有人找到更好的解决方案,请post在这里。我已经将代码修改成这样:
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();`
docker-java 版本 3.1.0 已将 withPortBindings
方法从 CreateContainerCmd
class 移动到 HostConfig
class.
更新后的方法如下:
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();
作为旁注,我不得不去查看 docker-java 存储库中的单元测试,以便找到如何执行此操作。看来这是寻找工作示例的地方。
您可以像下面这样使用主机配置来绑定端口 1234(相当于 -p 1234:1234)
HostConfig hostConfig = HostConfig.newHostConfig().withPortBindings(PortBinding.parse("1234:1234"));
dockerClient.createContainerCmd(..).withHostConfig(hostConfig);
我想创建 运行 docker 使用 docker java 客户端。我想要 运行ning 这样的东西 :
docker run -d -p 4444:4444 --name selenium-hub selenium/hub:2.53.0
如何在docker-java客户端实现这个命令?到目前为止,这是我的代码:
CreateContainerResponse response = dockerClient.createContainerCmd("selenium/hub")
.withName(name)
.exec();
实际上我不知道如何指定 -d(对于 运行ning 在后台)。和-p。 请帮我。抱歉,我是 Docker.
的新人docker-java 在 https://github.com/docker-java/docker-java/wiki 上有一个不错的 wiki。搜索 "port" 得到了这个:
Create new Docker container and start it with exposed ports
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();
我查看了 docker-java 中的一些测试,看起来你只做了 运行 容器的一半工作,因为你只 创建了 容器但没有启动它。根据我在此测试 (https://github.com/docker-java/docker-java/blob/069987852c842e3bba85ed3325a8877c36f9e87f/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java#L69) 中看到的内容,您的代码应如下所示:
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();
据我所知,没有理由在分离模式下显式 运行 它,因为默认情况下它将异步启动。
找到解决方案...如果有人找到更好的解决方案,请post在这里。我已经将代码修改成这样:
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();`
docker-java 版本 3.1.0 已将 withPortBindings
方法从 CreateContainerCmd
class 移动到 HostConfig
class.
更新后的方法如下:
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();
作为旁注,我不得不去查看 docker-java 存储库中的单元测试,以便找到如何执行此操作。看来这是寻找工作示例的地方。
您可以像下面这样使用主机配置来绑定端口 1234(相当于 -p 1234:1234)
HostConfig hostConfig = HostConfig.newHostConfig().withPortBindings(PortBinding.parse("1234:1234"));
dockerClient.createContainerCmd(..).withHostConfig(hostConfig);