繁体   English   中英

让docker容器按名称相互查看(ping)的问题

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

我有三个码头工人,

  1. java容器(JC):用于我的java应用程序(spring boot)
  2. elasticsearch container(EC):用于ElasticSearch
  3. 测试容器(TC):使用ping测试对测试容器进行故障排除

目前,JC无法通过“名称”看到EC。 当我说“看”时,我的意思是如果我在JC上对EC进行ping: unknown host ,我会得到一个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 build -no-cache -t myapp-image .

另请注意,我安装了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容器不能?

更多信息。

  • VirtualBox 5.0.10
  • Docker 1.9.1
  • 编织1.4.0
  • CentOS 7.1.1503
  • 在部署到AWS之前,我在Windows 10桌面上的CentOS VM中运行docker作为暂存环境

任何帮助表示赞赏。

在同一个--link守护程序中,使用旧的--link选项来更新每个组件的/ 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应该可以工作。

如果没有,请检查是否由于基本映像和安全问题:请参阅“ 解决原子主机上容器中的Ping问题 ”。
JC基于docker/_java:8 ,它本身基于jessie-curljessie

此默认网络中的容器可以使用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“桥接”与自定义桥接网络导致主机文件和SSH_CLIENT env变量不同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM