2017-05-02 49 views
1

我想在一個容器中運行的MongoDB,這個工程:「--link」似乎並沒有工作,以連接兩個Docker容器

docker run -p 27017:27017 --name cdt -d mongo 

然後我想在另一個容器中運行的服務器,像所以:

docker run --name foo --link cdt:mongo exec /bin/bash -c "node server.js" 

Node.js的服務器嘗試做一個MongoDB的連接localhost:27017,但它無法進行連接。

任何人都知道爲什麼會發生這種情況?我沒有正確連接容器?

請注意,我可以成功連接到以外的容器,但不能從「foo」容器內的服務器連接到mongodb容器。

回答

5

所以localhost從容器始終(99.5%的時間)指的是到容器本身。這也是99.5%的時間不是你想要的。如果您使用這樣的links,則需要將localhost:27017更改爲mongo:27017,因爲這正是您將鏈接「掛載」爲(--link cdt:mongo)的原因。

更好的選擇是使用Docker網絡而不是鏈接(已棄用)。所以:

$ docker network create my-net 
$ docker run --name cdt --net my-net -d mongo 
$ docker run --name foo --net my-net exec /bin/bash -c "node server.js" 

現在你通過cdt:27017是指你的數據庫作爲容器的名稱通過在同一網絡上的DNS解析成。請注意,如果您不打算連接外部世界,則不需要公開端口,但同一網絡上的容器之間的互連不需要端口映射。

+0

謝謝!!它會是cdt:27017還是my-net:27017?爲什麼會是cdt:27017? –

+1

'cdt',因爲它是容器的名稱('--name cdt')。該名稱將被添加到DNS查找。您還可以通過添加別名('--alias')來添加更多可解析的名稱。 'my-net'就是您將容器連接到的網絡的名稱。 – johnharris85

+0

瞭解它,謝謝,我希望它是網絡的名稱(因爲這是共享的),而不是名稱的MongoDB容器,但我會生活 –