2017-07-17 46 views
2

我有一個Docker容器必須與其他主機中的非dockerized應用程序和docker容器進行通信的情況。如何使碼頭集裝箱與非碼頭應用程序交談?

假設有三臺服務器A,B和C.服務器A有兩個運行JBoss App Server容器的Docker容器。服務器B,非docker主機擁有MySQL DB。服務器C有另一組容器。

我希望JBoss應用程序服務器容器與位於另一主機上的MySQL DB連接並從數據庫中提取信息。 JBoss還必須談論服務器C中的容器。

如何使這發生?

PS:我是新來的碼頭工人在橋/用戶自定義橋接網絡

回答

4

容器可以自動訪問外面的世界。這是通過IP僞裝發生的,Docker會照顧它。

  • MySQL數據庫是在服務器B
  • 服務器A具有以到達MySQL數據庫運行服務器B的路由。
  • 2容器是在服務器A

假設以上所述,2個容器應能達到MySQL數據庫。

還有一個相關的常見問題有關在localhost中訪問服務的容器。您可以參考這裏的討論(From inside of a Docker container, how do I connect to the localhost of the machine?

回答到更新的問題:

當您在羣模式把容器覆蓋網絡,它還會創建一個橋接網絡(docker_gwbridge)。此橋默認情況下創建用於外部訪問。你是正確的,在這種情況下,容器是覆蓋和橋接網絡的一部分。使用覆蓋網絡,服務器A中的容器可以與服務器C中的容器進行通信。對於服務器A中的容器到達DB(非容器化應用程序),您只需要可以從容器內部直接訪問的DB的IP地址和端口。只要數據庫IP地址可以從服務器A訪問,它也可以從使用橋網絡在服務器A中運行的容器內訪問。你不需要任何特殊的DNS標誌或其他任何東西。

+0

嗨@Sreeni不可能在疊加模式下做到這一點?還有一個查詢。運行命令中DNS標誌的用途是什麼?我可以在docker run命令中提供--dns標誌指向駐留在服務器B中的數據庫嗎? –

+0

嗨Aditya,你可以使用覆蓋網絡連接2個容器,但你需要使用網橋來達到DB的IP。在覆蓋網絡中,docker_gwbridge提供外部連接。 DNS標誌允許您使用外部DNS服務器。默認情況下,docker在Docker引擎中使用dns服務器,並在其中找不到名稱,它使用主機的DNS服務器。我在這裏捕獲了常見的Docker網絡問題和解決方案(https://www.slideshare.net/SreenivasMakam/docker-networking-common-issues-and-troubleshooting-techniques)。請看看它是否有幫助。 – Sreeni

+0

嗨@Sreeni我編輯了原始問題。 AFAIK,容器可以是多個網絡的一部分。因此,A和C服務器中的容器可以利用覆蓋。雖然A和MySQL DB中的容器可以利用用戶定義的橋接網絡。我對麼?但是我仍然困惑如何讓容器指向非dockerized應用程序?有沒有特定的命令來實現這一點,或者是否有任何特定的標誌,如--dns?我很抱歉拿出很多問題:) –