4

我們dockerizing我們的微觀服務的應用程序,我遇到了一些問題的發現。可以(或應該)2個碼頭集裝箱通過本地主機互相交互?

該應用程序的配置如下:

當一個服務是「非本地」模式啓動,它使用領事作爲它的發現註冊表。 當服務以「本地」模式啓動時,它會自動綁定每個服務的地址(例如,tcp:// localhost:61001,tcp:// localhost:61002等等硬編碼地址)

dockerizing應用程序(僅適用於本地模式,現在)每個服務是一個容器後(策劃泊塢窗圖像與碼頭工人,撰寫,並與泊塢窗機,如果該事項) 但由於他們是一個服務不能與其他服務進行交互不在同一臺機器上,tcp:// localhost:61001顯然不起作用。

使用與links泊塢窗,撰寫並指定localhost作爲一個別名(服務是:localhost)沒有工作。有2種容器可以「共享」相同的本地主機嗎?

如果沒有,什麼是接近最好的方法? 我想過使用每個服務的特定主機名,然後在docker-compose的鏈接部分指定主機名。 (但我懷疑這是優雅的解決方案) 或者可能使用碼頭版Consul並與其集成?

此文章:How to share localhost between two different Docker containers?提供了一些有關爲什麼localhost不應該被搞砸的見解 - 但我仍然對這裏的正確方法感到困惑。

謝謝!

+0

綁定到0.0.0.0而不是localhost,然後通過鏈接共享,如前所述。您不需要手動指定主機名,默認情況下它是容器名稱。 – jordanm

回答

2

但是一個服務不能與另一個服務交互,因爲它們不在同一臺機器上,並且tcp:// localhost:61001顯然不起作用。

其實他們可以。你是對的,tcp://localhost:61001將無法​​正常工作,因爲在容器中使用localhost將指的是容器本身,類似於默認情況下localhost在任何系統上的工作方式。這意味着您的服務無法共享相同的主機。如果你想要它們,你可以爲兩種服務使用一個容器,但這實際上並不是最好的設計,因爲它違背了Docker Compose的一個主要目的。

做理想的方式是搬運工,撰寫的鏈接,引導你引用顯示瞭如何定義它們,但實際上使用都需要在URL中使用鏈接的容器的名稱如果鏈接容器的名字在原始容器的/etc/hosts中定義了一個IP映射(不是它實際上是這樣做的,只是讓您明白)。如果您想將其更改爲與鏈接容器名稱不同的內容,則可以使用鏈接別名,這在您引用的相同指南中進行了解釋。

例如,一個docker-compose.yml文件是這樣的:

a: 
    expose: 
    - "9999" 
b: 
    links: 
    - a 

隨着a監聽0.0.0.0:9999b可以ab內發出請求tcp://a:9999互動。這也將是可能的外殼爲b和運行

ping a 

這將發送從b容器ping請求a容器。

因此,最後嘗試用請求URL中的localhost替換爲鏈接容器的文本名稱(或鏈接別名,如果鏈接是使用別名定義的)。這意味着,

tcp://<container_name>:61001 

應改爲工作的

tcp://localhost:61001 

只要確保你定義docker-compose.yml的鏈接。

希望這有助於

2

在生產,千萬不要用碼頭工人或碼頭單獨組成。使用管絃樂隊(牧場主,碼頭羣,k8s,...)並在那裏部署你的堆棧。 Orchestrator將負責網絡問題。您的容器可以相互鏈接,因此您可以直接通過名稱訪問它們(不必太在意ip)。

在本地主機,使用搬運工撰寫來啓動你的容器和使用環節。不要使用本地端口,而要使用鏈接的名稱。 (如果您的容器A需要訪問端口1234上的容器B,則執行鏈接B與名爲BBBB的A鏈接,並使用tcp:// BBBB:1234從A訪問容器)

如果您確實想要將端口綁定到您的本地主機並使用它,通過您的主機IP訪問端口,而不是本地主機。

+0

爲什麼不應該在生產中使用docker-compose? – MatTheWhale

+1

如果一個容器崩潰,則不會自動重啓。如果一個容器重新啓動,您必須重新啓動所有容器以重新同步鏈接(其他容器保留舊的IP)。你只能使用一臺主機,規模很難,... – wargre

1

如果改變了硬編碼地址是不是現在的選擇,也許你可以修改你的容器啓動腳本中的每個本地容器轉發轉發端口到其他機器所需要的服務。

雖然這會產生一些複雜性,因爲您必須在每個容器中設置ssh並管理相應的密鑰。

想想吧,如果加密不是問題,ssh是沒有必要的。使用socatredirprobably be enough

socat TCP4-LISTEN:61001,fork TCP4:othercontainer:61001 
相關問題