4

我有三个码头集装箱,

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

目前,JC 无法通过“名称”看到 EC。当我说“看到”时,我的意思是如果我在 JC 上对 EC 执行 ping 操作,我会得到一个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 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 容器不能?

更多信息。

  • 虚拟盒子 5.0.10
  • 码头工人 1.9.1
  • 编织 1.4.0
  • CentOS 7.1.1503
  • 在部署到 AWS 之前,我在 Windows 10 桌面上的 CentOS VM 中运行 docker 作为暂存环境

任何帮助表示赞赏。

4

2 回答 2

3

在同一个 docker 守护进程中,使用--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

然后, adocker exec JC ping -c 2 EC应该工作。

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

于 2015-12-19T06:12:24.517 回答
0

此默认网络中的容器能够使用 IP 地址相互通信。Docker 不支持默认桥接网络上的自动服务发现。如果您想与此默认桥接网络中的容器名称进行通信,则必须通过旧版 docker run --link 选项连接容器。 docs.docker.org

它也应该使用新的网络工作。

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

没有一个特定的选项可以将此行为应用于默认网络(AFAICT from 查看docker network inspect)。我猜它只是由选项“com.docker.network.bridge.default_bridge”触发的。

在另一个问题的第一部分,建议在 Docker 1.9 中对此进行了更改。请注意,Docker 1.9 是他们在稳定版本中打开新网络系统的时候。我从上面引用的用户指南部分在 1.8 版中不存在。Docker 1.9.0“桥”与自定义桥网络导致主机文件和 SSH_CLIENT 环境变量的差异

于 2016-01-14T13:05:32.197 回答