我有三个泊坞容器,
目前,JC无法通过“名称”查看EC。当我说“看”时,我的意思是如果我在JC上对EC进行ping操作,我会得到一个ping: unknown host
。有趣的是,如果我对TC的EC进行ping操作,我会得到回复。
以下是我启动容器的方法。
docker run -dit --name JC myapp-image
docker run -d --name EC elasticsearch:1.5.2 elasticsearch -Des.cluster.name=es
docker run --rm --name TC -it busybox:latest
然后,为了从JC ping EC,我发出以下命令。
docker exec JC ping -c 2 EC
我得到ping: unknown host
对于TC,由于我已经在shell,我可以做一个ping -c 2 EC
,我得到2个回复。
我想也许这与我的Java应用程序有关,但我对此表示怀疑,因为我修改了我的Dockerfile
以便站起来容器。 Dockerfile
如下所示。
FROM java:8
VOLUME /tmp
请注意,您可以按docker build -no-cache -t myapp-image .
创建上述泊坞窗图片。
另请注意,我安装了Docker Weave Net,这似乎无助于让JC按名称查看EC。另一方面,我试图找到每个容器的IP地址如下。
docker inspect -f '{{ .NetworkSettings.IPAddress }}' JC
- > 172.17.0.4
docker inspect -f '{{ .NetworkSettings.IPAddress }}' EC
- > 172.17.0.2
docker inspect -f '{{ .NetworkSettings.IPAddress }}' TC
- > 172.17.0.3
我当然可以通过IP地址从JC ping EC:docker exec JC ping -c 2 172.17.0.2
。但是让容器通过IP地址看到彼此并没有帮助,因为我的Java应用程序需要主机名引用作为其配置的一部分。
有关正在发生的事情的任何想法?它是容器图像本身吗?为什么busybox容器映像能够按名称ping ElasticSearch容器,但java容器不能?
更多信息。
感谢任何帮助。
答案 0 :(得分:3)
在同一个docker守护程序中,使用old --link
option来更新每个组件的/ etc / hosts,并确保可以ping另一个组件:
docker run -d --name EC elasticsearch:1.5.2 elasticsearch -Des.cluster.name=es
docker run -dit --name JC --link ED myapp-image
docker run --rm --name TC -it busybox:latest
然后,docker exec JC ping -c 2 EC
应该有用。
如果没有,请检查这是否是因为基本图像和安全问题:请参阅" Addressing Problems with Ping in Containers on Atomic Hosts"。
JC基于docker/_java:8
,基于jessie-curl
,jessie
。
答案 1 :(得分:0)
此默认网络中的容器可以使用IP地址相互通信。 Docker不支持默认网桥上的自动服务发现。如果要与此默认桥接网络中的容器名称进行通信,则必须通过旧版docker run -link选项连接容器。 docs.docker.org
它也可以使用新网络。
docker network create -d bridge non-default
docker run --net non-default ...
没有将此行为应用于默认网络的特定选项(通过查看docker network inspect
来确认AFAICT)。我猜它只是由“com.docker.network.bridge.default_bridge”选项触发。
在另一个问题的第一部分中,建议在Docker 1.9中对此进行更改。请注意,Docker 1.9是他们在稳定版本中打开新网络系统的时候。我在上面引用的用户指南部分在1.8版中不存在。 Docker 1.9.0 "bridge" versus a custom bridge network results in difference in hosts file and SSH_CLIENT env variable