2016-08-13 203 views
4

我和搬運工網絡試驗,我似乎無法找到一種方式來實現以下目標:溝通,從泊塢窗泊塢容器主機

開始在主機中一個簡單的netcat的服務器:

nc -l -p 5555 

然後在內通過與該服務器通信一個碼頭集裝箱,例如

# grab the docker network interface ip 
hostip=$(ip route | awk '/docker0/ { print $NF }') 
# pass in the docker network interface as a host and try a curl command 
docker run --add-host=docker:"${hostip}" --rm -it hiromasaono/curl curl docker:5555 

curl請求只是掛起並且主機netcat服務器沒有收到請求。

如果我不是用--net=host選項啓動泊塢窗,它的工作原理:

docker run --net=host --rm -it hiromasaono/curl curl 127.0.0.1:5555 

和netcat的服務器接收

GET/HTTP/1.1 
User-Agent: curl/7.35.0 
Host: 127.0.0.1:5555 
Accept: */* 

如何從泊塢窗容器內進行通信,以簡單的主機netcat的服務器沒有使用--net=host(默認爲--net=bridge)?

(供參考:我運行搬運工服務器/客戶端1.11.2)

Potentailly相關資源我研究在尋找一個答案:

回答

-1

爲了解決這個問題,有幾件事情需要考慮。

  1. Netcat必須監聽所有接口(或至少在Docker客戶端可以連接的接口上)。不在本地主機上。 在運行netcat -l -p 5555後,如果在另一個終端中運行netstat -a -l -n | grep 5555,則應該看到0.0.0.0:5555*:5555。如果您看到127.0.0.1:5555,那麼它將無法工作,並且在查看Docker之前需要先解決此問題。
  2. Docker必須能夠ping到docker主機,並且它不能解析爲127.0.0.1。嘗試docker run --net=host --rm -it hiromasaono/curl ping docker。如果你看到它正在pinging 127.0.0.1那麼你的配置是錯誤的,你需要修復這一行:hostip=$(ip route | awk '/docker0/ { print $NF }')。如果它不是127.0.0.1,但ping不成功,那麼你的網絡設置是錯誤的或者hostip是錯誤的。
+0

感謝您的回覆。 1.看起來不錯: 'tcp 0 0 0.0.0.0:5555 0.0.0.0:* LISTEN' 2.如果docker主機名設置爲「在我的問題 –

+0

中描述可以有防火牆阻止端口5555上的請求嗎?如果docker主機名不是指向127.0.0.1,並且您能夠ping從Docker容器內指向的IP,那麼我的猜測就是主機上的防火牆。 –

+0

再次感謝您的迴應:據我所知,我沒有任何防火牆活動。您是否能夠成功地與Docker容器中的主機的「LISTEN」端口進行通信? –

0

據我瞭解,基於兩點意見[1][2],以下非官方的破解似乎是爲我工作今天(2016.10的。27):

Dockerfile於需要連接到多克爾主機的應用程序,添加以下行:

... 
# netstat 
RUN apt-get update && apt-get install net-tools -y 
... 
CMD (netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2" dockerhost"}' >> /etc/hosts) && \ 
     ...old CMD line... 
... 

這似乎讓泊塢窗主機提供給我從容器內 as dockerhost


注到未來的讀者:又見https://github.com/docker/docker/issues/23177 —寫作的,這個問題仍然是開放的,所以有一個非零的機會,它可能會在未來的某個時刻成爲官方和取代的任何變通辦法;儘管它也可能像其前輩們一樣被封閉和解散。