2016-12-15 212 views
7

我真的不明白這裏發生了什麼。我只是單純的想一個公佈的端口從一個碼頭工人,容器內進行的HTTP請求,另一個搬運工容器,通過主機,使用主機的公網IP爲什麼我不能通過主機捲起另一個碼頭集裝箱

這是我的設置。我有我的開發機器。我有一個有兩個容器的碼頭主機。 CONT_A和監聽端口上發佈的網絡服務3000

DEV-MACHINE 

HOST (Public IP = 111.222.333.444) 
    CONT_A (Publish 3000) 
    CONT_B 

enter image description here

在我的開發機(一個完全不同的機器)

我可以捲曲沒有任何問題

curl http://111.222.333.444:3000 --> OK 

當我SSH進入主機

我可以當我執行內部CONT_B

不可能的,只是超時沒有任何problesm

curl http://111.222.333.444:3000 --> OK 

捲曲。萍雖然好...

docker exec -it CONT_B bash 
$ curl http://111.222.333.444:3000 --> TIMEOUT 
$ ping 111.222.333.444 --> OK 

爲什麼?

的Ubuntu 16.04,多克爾1.12.3(默認網絡設置)

+0

我想這可能是因爲碼頭工人如何處理網絡使用iptables的路橋網絡。我將不得不查看它,但我猜你所提供的IP地址可能是從主機看到的IP地址,而不是在碼頭網絡內分配的「內部IP」。 ping可能解決的原因是因爲它解析爲docker主機(而不是容器)。但是,實現這一目的的docker方式是不將端口發佈到容器A中,而是使覆蓋網絡https://docs.docker.com/engine/userguide/networking/。 –

+2

@RikNauta我使用的IP地址是**公共主機ip **。當然這應該總是正確解決,除非它與內部碼頭網絡有某些衝突。這是一個'104 ....'ip地址。 – pqvst

+0

這應該工作。有一個用戶級代理進程docker運行以監聽主機並將tcp連接轉發到容器中。在Docker 1.11中有相同的工作嗎? docker守護進程中是否將'userland-proxy'設置爲false? – Matt

回答

2

我知道這是不嚴格問題的答案,但有解決您的問題更多克爾十歲上下的方式。我會忘記發佈端口進行集裝箱間通信。相反,使用碼頭羣創建覆蓋網絡。你可以找到完整指南here但在本質上,你做到以下幾點:

//create network  
docker network create --driver overlay --subnet=10.0.9.0/24 my-net 
//Start Container A 
docker run -d --name=A --network=my-net producer:latest 
//Start Container B 
docker run -d --name=B --network=my-net consumer:latest 

//Magic has occured 
docker exec -it B /bin/bash 
> curl A:3000 //MIND BLOWN! 

內。然後容器是你可以捲曲主機A和它會爲你解決(甚至當你開始做縮放等)

如果你不熱衷於使用碼頭工人蜂擁而上,你仍然可以使用泊塢傳統的聯繫,以及:

docker run -d --name B --link A:A consumer:latest 

這將在您的容器鏈接任何裸露(未出版)端口。

最後,如果你開始移動到生產......忘記鏈接&覆蓋網絡完全...使用Kubernetes :-)有點難度初始設置,但他們引進了一堆概念&工具,使連接&縮放容器集羣更容易!但這只是我個人的看法。

+2

當你在一臺主機上時,它甚至不需要是覆蓋網絡,默認橋接驅動程序將工作文件。 – BMitch

0

我有一個類似的問題,我已經在一個容器中的nginx服務器(讓我們稱之爲它的網絡)與多個服務器塊,裝在另一個容器的cron(可以稱之爲的cron)。我使用docker撰寫。我想不時地從cron到web使用curl來執行一個應用程序的某個php腳本。它應該看起來如下:

curl http://app1.example.com/some_maintance.php 

但是我總是在一段時間後得到主機無法訪問。

首先解決方案是更新/ cron中容器etc/hosts文件,並添加:

1.2.3.4 app1.example.com 

其中1.2.3.4是Web容器的IP,和它的工作 - 但這是一個黑客 - 也如據我所知,不鼓勵這種手動更新。您應該在docker compose中使用extra_hosts,這需要顯式IP地址而不是容器名稱來指定IP地址。

我試圖使用自定義網絡解決方案,正如我所看到的是解決這個問題的正確方法,但我從來沒有在這裏取得成功。如果我學會了如何做到這一點,我保證更新這個答案。

最後我用捲曲的能力來指定服務器的IP地址,我通過域名作爲單獨的參數頭:

curl -H'Host: app1.example.com' web/some_maintance.php 

不是很漂亮,但確實工作。

(這裏的網絡是我nginx的容器的名稱)

相關問題