2017-07-28 113 views
0

我有一個docker映像,我將使用它來創建新容器。我有一臺PostgreSQL數據庫在我的機器上運行,我想連接到我的未來容器。Docker,將主機IP地址添加到新容器中

我知道新創建的容器將位於172.17.0.0/16網絡中,所以我在PostgreSQL配置中爲我的listen_addresses參數添加了該網絡。

現在,爲了創建容器我需要寫是這樣的:

docker run --add-host=connection_name:connection_ip container_name 

connection_ip我什麼樣的解決我應該寫?我應該寫localhost還是需要寫靜態IP地址才能從外部訪問?

回答

1

如果您希望您的容器在任何地方都能正常工作,您不應該依賴本地生成的網絡的IP地址(例如172.17.0.0/16):一些高級Docker引擎管理系統(如Kubernetes)會進行更改到那些默認網絡,並且一些雲Docker託管環境也會這樣做。

Docker特別處理您對集裝箱與主機通信的需求,其選項爲--network。當運行一個新的Docker容器時,它允許您指定要鏈接的網絡名稱,而不需要提供任何IP地址。

您需要一個相當於的近期 Docker引擎(至少版本1.9),以便此選項可用。

下面是如何使用這個新選項可以解決你的問題:

我們假設你的主機被命名爲爲myhost(該hostname命令的輸出)。

你必須啓動你的容器是這樣的:

docker run --network host container_name 

--network參數,host的價值,意味着你要這個容器連接到主機。

現在,從您的容器內部,主機名爲myhost。此外,IP地址已映射到容器的/etc/hosts中的主機名稱myhost,該IP地址分配在網絡127.0.0.0/8中。

因此,從主機的角度來看,從容器到myhost:5432的postgresql連接將看起來來自127.0.0.0/8。 然後,您只需要將127.0.0.0/8添加到您的listen_addresses postgresql參數中即可。

+0

那麼,我應該寫入'connection_ip'? –

+0

Nothing:不要使用'--add-host'。使用我寫的命令:'docker run --network host container_name' –

+0

因此,在我的continer中,我必須寫PostgreSQL的連接我只寫'localhost:5432'? –

0

您應該在您的PostgreSQL配置中使用0.0.0.0作爲listen_addresses,以偵聽兩個接口的

如果您確實想要在特定IP地址上運行,則必須創建一個包含docker network create的網絡,並使用--ip選項執行docker-run或docker-create。

0

要從容器連接到Postgres數據庫,您可以從entrypoint腳本中檢索默認網關IP地址。

從您可以ip route show

# ip route show 
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2 

檢索泊塢窗主機IP容器然後默認路由是你的主機IP(這裏172.17.0.1)

在這一點上,要注意主機的可以阻止連接的防火牆

在您的入口點腳本中,您可以使用ip route檢索主機IP show | awk'/ default/{print $ 3}'。然後,您可以通過環境變量傳遞此IP並在應用程序中檢索它。

相關問題