让 docker 个容器按名称相互查看 (ping) 时出现问题

Problems getting docker containers to see (ping) each other by name

我有三个 docker 个容器,

  1. java 容器 (JC):用于我的 java 应用程序(spring 启动)
  2. elasticsearch 容器 (EC):用于 ElasticSearch
  3. 测试容器 (TC):测试容器以通过 ping 测试进行故障排除

目前,JC 无法通过 "name" 看到 EC。当我说 "see" 时,我的意思是如果我对 JC 执行 ping 到 EC,我会得到 ping: unknown host。有趣的是,如果我在 TC 上对 EC 执行 ping 操作,我确实会收到响应。

这是我启动容器的方式。

  1. docker run -dit --name JC myapp-image
  2. docker run -d --name EC elasticsearch:1.5.2 elasticsearch -Des.cluster.name=es
  3. 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 图像。

另请注意,我安装了 Docker Weave Net,这似乎无助于让 JC 通过名称查看 EC。另一方面,我试着找到每个容器的IP地址如下。

  1. docker inspect -f '{{ .NetworkSettings.IPAddress }}' JC --> 172.17.0.4
  2. docker inspect -f '{{ .NetworkSettings.IPAddress }}' EC --> 172.17.0.2
  3. 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 容器不能?

更多信息。

感谢任何帮助。

在同一个 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, itself based on jessie-curl, jessie.

Containers in this default network are able to communicate with each other using IP addresses. Docker does not support automatic service discovery on the default bridge network. If you want to communicate with container names in this default bridge network, you must connect the containers via the legacy docker run --link option. docs.docker.org.

它应该也可以使用新网络。

docker network create -d bridge non-default
docker run --net non-default ...

没有将此行为应用于默认网络的特定选项(AFAICT 来自 docker network inspect)。我猜它只是由选项 "com.docker.network.bridge.default_bridge".

触发的

在另一个问题的第一部分,建议这已在 Docker 1.9 中更改。请注意,Docker 1.9 是他们在稳定版本中启用新网络系统的时候。我从上面引用的用户指南部分在 1.8 版中不存在。