簡體   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