2017-04-21 131 views
0

我有兩個不同的Docker容器,每個人都有不同的圖像。容器中的每個應用程序都使用無衝突的端口。看到docker-compose.yml如何在兩個不同Docker容器之間共享本地主機?

version: "2" 

services: 

    service_a: 
    container_name: service_a.dev 
    image: service_a.dev 
    ports: 
     - "6473:6473" 
     - "6474:6474" 
     - "1812:1812" 
    depends_on: 
     - postgres 
    volumes: 
     - ../configs/service_a/var/conf:/opt/services/service_a/var/conf 

    postgres: 
    container_name: postgres.dev 
    hostname: postgres.dev 
    image: postgres:9.6 
    ports: 
     - "5432:5432" 
    volumes: 
     - ../configs/postgres/scripts:/docker-entrypoint-initdb.d/ 

我可以從主機(Mac OS)中,例如成功地捲曲的每個圖像curl -k https://localhost:6473/service_a/api/version的作品。我想要做的是能夠參考postgres容器從service_a容器通過localhost好像這兩個容器是一個,他們共享相同的localhost。我知道這是可能的,如果我使用主機名postgres.devservice_a容器內,但我希望能夠使用localhost。這可能嗎?請注意,我並不是很熟悉網絡或Docker。

Mac版:10.12.4

泊塢版本:多克爾版本17.03.0策,建立60ccb22

我已經做了一些比較以前的研究,也沒有找到一個解決方案。 相關:https://forums.docker.com/t/localhost-and-docker-compose-networking-issue/23100/2

+0

幾個(不同程度的hackiness)這樣做的方式,但你怎麼想呢? – johnharris85

+0

我會重申,你爲什麼要這麼做?用'localhost'搞亂只會造成混淆。在同一個容器中運行這兩個進程可以達到同樣的效果,而不會出現這種冒犯。 – Matt

+0

我的用例是這樣的:爲了某些安全目的,這兩個服務必須部署在同一個主機上,所以現實世界中的'service_a'將被配置爲只偵聽'localhost/127.0.0.1'。理想情況下,我會創建一個Docker鏡像來同時擁有postgres和service_a,但這似乎不可行,因此我的方法在這裏。 – kolistivra

回答

1

正確方法:不要使用本地主機。相反,使用docker內置的DNS聯網功能,並通過服務名稱引用容器。你甚至不應該設置容器名稱,因爲這會打破縮放。


糟糕的方法:如果你不想使用泊塢窗網絡功能,則可以切換到主機網絡,但關閉一個很重要的特徵和其他泊塢窗功能,如連接容器的選擇一起在自己的孤立網絡將不再工作。與聲明,結果會是什麼樣子:

version: "2" 

services: 

    service_a: 
    container_name: service_a.dev 
    image: service_a.dev 
    network_mode: "host" 
    depends_on: 
     - postgres 
    volumes: 
     - ../configs/service_a/var/conf:/opt/services/service_a/var/conf 

    postgres: 
    container_name: postgres.dev 
    image: postgres:9.6 
    network_mode: "host" 
    volumes: 
     - ../configs/postgres/scripts:/docker-entrypoint-initdb.d/ 

注意,我刪除端口出版從容器到主機,因爲你在一個集裝箱網絡已不再。而且我刪除了主機名設置,因爲你不應該從一個碼頭工人容器主機本身的主機名更改。

您參考的鏈接的論壇帖子顯示了當它是虛擬機時,主機無法與本地主機通信。這是一個預期的限制,但容器本身就可以互相交談爲localhost。如果您使用基於VirtualBox的安裝與docker-toolbox,您應該能夠通過virtualbox IP與容器交談。


確實是錯誤的方法:濫用容器網絡模式。該模式可用於調試容器網絡問題和專用用例,實際上不應該用於避免重新配置應用程序以使用DNS。而當你停止數據庫時,你會打破你的其他容器,因爲它將失去它的網絡名稱空間。

爲此,您可能需要運行兩個單獨的docker-compose.yml文件,因爲在執行任何操作之前,docker-compose將檢查網絡的存在。先從Postgres的容器:

version: "2" 
services: 
    postgres: 
    container_name: postgres.dev 
    image: postgres:9.6 
    ports: 
     - "5432:5432" 
    volumes: 
     - ../configs/postgres/scripts:/docker-entrypoint-initdb.d/ 

然後你就可以在同一網絡中的命名空間進行第二次服務:

version: "2" 
services: 
    service_a: 
    container_name: service_a.dev 
    image: service_a.dev 
    network_mode: "container:postgres.dev" 
    ports: 
     - "6473:6473" 
     - "6474:6474" 
     - "1812:1812" 
    volumes: 
     - ../configs/service_a/var/conf:/opt/services/service_a/var/conf 
+0

我認爲這是正確的路要走;不幸的是Docker for Mac似乎與'主機'網絡有關:https://forums.docker.com/t/should-docker-run-net-host-work/14215和https://forums.docker.com/ t/beta-9-and-localhost-connection-via-net-host/10471/15 – kolistivra

+0

論壇帖子指出了嘗試從主機訪問localhost的容器的問題。這個問題和這個答案覆蓋了從容器到localhost的容器。但是我會重申一下,請不要這樣做,如果它壞了,你會保留所有的東西。 – BMitch

相關問題