2017-02-19 104 views
1

我有一個節點應用程序在一個docker容器中運行,另一個是mongo數據庫,第三個是redis數據庫。在開發過程中,我希望使用這三個容器(不會污染我的系統和數據庫安裝),但在生產中,我希望在本地安裝數據庫,並在泊塢窗中安裝應用程序。不同容器上的Docker應用程序和數據庫

該應用程序假定數據庫正在本地主機上運行。我知道我可以將端口從容器轉發到主機,但是我可以在容器之間轉發端口,以便應用程序可以訪問數據庫嗎?端口轉發不同容器上的相同端口會產生衝突。

我也知道容器將在同一個橋接網絡上,並使用「curl」命令,我發現它們已連接,並且可以使用它們的相關IP地址訪問它們。但是,我希望能夠在不改變代碼中的「localhost」規範的情況下使這個項目工作。

有沒有辦法轉發這些端口?也許在我的應用程序的dockerfile中使用iptables?例如,我希望應用程序的容器能夠使用「localhost:27017」訪問mongoDB,即使它們位於不同的容器中。

我使用Docker for Mac(V 1.13.1)。在生產中,我們將在Ubuntu服務器上使用Docker。

我是一個小菜鳥。感謝您的幫助。

+0

對於訪問數據庫,它是'localhost'還是可以有'db:port'和'redis:port'是至關重要的?然後,根據設置(例如[訪問機器的本地主機](http://stackoverflow.com/a/24326540/2127492)),設置'db'和'redis'的值。 – jrbeverly

+3

您可以使用環境變量來保存這些值地址。 – hya

+0

@Ken你解決了你的問題嗎? – Salem

回答

1

泊塢窗只允許你映射的集裝箱港口到主機端口(而不是相反),但也有一些方法來實現這一目標:

  • 您可以使用--net=host,這將使得容器使用主機網絡而不是默認網橋。您應該注意,這可能會引發一些安全問題(因爲容器可能會訪問您在主機中運行的任何其他服務)...

  • 您可以在容器中運行某些內容以將本地端口映射到遠程端口(例如rinetd或ssh隧道)。這基本上會創建一個映射localhost:SOME_PORT - >HOST_IP_IN_DOCKER0:SOME_PORT

  • 正如在評論中指出,創建一些腳本,提取IP地址(例如:ifconfig docker0 | awk '/inet addr/{print substr($2,6)}'),然後揭露這是一個環境變量。 假設腳本在名爲getip命令wrappen,你可以像這樣運行:

    $ docker run -e DOCKER_HOST=$(getip) ... 
    

    ,然後在容器內使用名爲DOCKER_HOST的的環境變量到你的服務連接。

相關問題