我想使用Java库以主机模式创建Docker容器
https://github.com/spotify/docker-client
在我的容器中存在我的应用程序,该应用程序在运行后应打开20202容器到下一个使用的端口。所以我要做的代码是
Map<String, List<PortBinding>> portBindings = Maps.newHashMap();
portBindings.put("20202", Lists.newArrayList(PortBinding.of("localhost", "20202")));
HostConfig hostConfig = HostConfig.builder()
.networkMode("host")
.portBindings(portBindings)
.build();
ContainerConfig config = ContainerConfig.builder()
.hostConfig(hostConfig)
.image("myImage")
.exposedPorts("20202")
.cmd("myProg", "arg1", "arg2"))
.build();
DefaultDockerClient.fromEnv().build();
client.pull(config.image());
ContainerCreation creation = client.createContainer(config);
client.startContainer(creation.id());
ContainerInfo info = client.inspectContainer(creation.id());
我在日志中看到了如何从本地注册表中提取图像,但是当我的主程序尝试在创建的容器中运行命令时,出现以下异常
org.apache.http.client.ClientProtocolException:URI没有指定有效的主机名:http://:20202
当我的程序运行此容器后,我从命令行检查了手册是否存在容器,并且端口是否在本地打开127.0.0.1:20202并且还可以,
容器存在并正在运行(我在之后看到了它们docker ps)
端口已打开,正在侦听,我使用netstat -altp--->检查
tcp 0 0 127.0.0.1:20202 0.0.0.0:* LISTEN 23839/myProg
我可以使用我的程序 127.0.0.1:20202
我看到问题是在我的主程序中尝试ContainerInfo使用以下方法获取有关主机的信息时
ContainerInfo info = client.inspectContainer(creation.id());
String host = info.networkSettings().ipAddress(); // host is empty
所以问题是,如何把对ContainerInfo有关信息localhost或127.0.0.1当我设置主机模式的HostConfig?为什么这不是自动发生的?
呼如林
相关分类