2014-12-20 47 views
2

應用程序服務器作爲一個Docker容器運行,並在另一個容器中運行數據庫。獲得數據庫服務器的IP地址爲:與Docker跨容器通信

sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' db 

設置JDBC資源的應用服務器來指向數據庫給出「java.net.ConnectException」。

鏈接容器不是一個選項,因爲它只適用於相同的主機。

如何確保數據庫容器的IP地址對應用程序服務器容器可見?

+2

你嘗試過這樣的:https://docs.docker.com/articles/ambassador_pattern_linking/ –

回答

0

鏈接容器不是一個選項,因爲它只適用於相同的主機。

那麼你說你的應用程序是在碼頭服務器1上運行的容器,而你的數據庫是碼頭服務器2上的容器?如果是這樣,你就像普通的遠程主機一樣對待它。您的數據庫端口需要在Docker服務器2上公開,並且該IP:端口需要通過環境變量配置到您的應用程序服務器中。

+0

他們都在同一主機上運行。如何將db容器的IP公開到同一主機上的應用服務器容器? –

+0

他們是在同一主機上還是不在你的意見和問題是矛盾的 –

+0

首先,他們在同一主機上,但我想要一個可以跨越多個主機的解決方案。 –

0

每個主機碼頭子網絡是Private Network。也許可以讓這個地址可路由,但這會很痛苦。由於容器IP不是靜態的,因此更加複雜。

您需要做的是將端口/服務發佈到主機(通過dockerfile中的PORT和docker運行中的-p)然後您只需執行host-> host。您可以通過IP,環境變量或舊的DNS解析主機。

+0

暴露端口很簡單。如何將db容器的IP公開到同一主機上的應用服務器容器? –

+0

將端口發佈到主機後,它就是主機。 Docker負責路由以將其發送到容器。 – user2105103

1

如果要在遠程主機上的碼頭集裝箱之間建立私人網絡連接,您可以使用weave在碼頭集裝箱之間設置覆蓋網絡。如果您不需要專用網絡,只需使用-p開關顯示端口,並將主機的地址配置爲所需泊塢窗容器中的目標IP。

+0

我是否需要配置容器的地址,然後使其可訪問? –

+0

不,它的IP地址與您的主機相同。使用-p HOST_PORT:CONTAINER_PORT。 (如果你在boot2docker上,這不是真的,因爲你需要做更多的轉發) –

1

解決此問題的一個簡單方法是使用Weave。它允許您創建許多可以跨越多個主機以及數據中心的特定於應用程序的網絡。它也有一個非常整齊的基於DNS的服務發現機制。

我應該放棄,我是Weave工程團隊之一。

0

事情很少失蹤了未允許跨容器通信:

  • WildFly未綁定到0.0.0.0並因此只接受上eht0請求。這是使用「-b 0.0.0.0」修復的。
  • 防火牆不允許容器通信。這是使用刪除「systemctl停止防火牆; systemctl禁用防火牆」
  • 虛擬盒圖像所需的唯一主機適配器

在此之後,容器是能夠溝通。完整的細節,請訪問:

http://blog.arungupta.me/2014/12/wildfly-javaee7-mysql-link-two-docker-container-techtip65/