Docker容器間通信

IP通信

從前面的例子可以得出這樣一個結論:兩個容器要能通信,必須要有屬於同一個網絡的網卡。滿足這個條件後,容器就可以通過IP交互了。具體做法是在容器創建時通過-network指定相應的網絡,或者通過docker network connect將現有容器加入到指定網絡。可參考上一節

Docker網絡(host、bridge、none)詳細介紹

Docker DNS Server

通過IP訪問容器雖然滿足了通信的需求,但還是不夠靈活。因爲在部署應用之前可能無法確定IP,部署之後再指定要訪問的IP會比較麻煩。對於這個問題,可以通過docker自帶的DNS服務解決。

從Docker 1.10版本開始,docker daemon實現了一個內嵌的DNS server,使容器可以直接1通過“容器名”通信。方法很簡單,只要在啓動時用-name爲容器命名就可以了。

docker run -it --network=my_net2 --name=bbox1 busybox 
docker run -it --network=my_net2 --name=bbox2 busybox

然後,bbox2就可以直接ping到bbox1了

使用docker DNS有個限制:只能在user-defined網絡中使用。也就是說,默認的bridge網絡是無法使用DNS的。

下面驗證一下:創建bbox3和bbox4,均連接到bridge網絡。

docker run -it --name=bbox3 busybox 
docker run -it --name=bbox4 busybox

bbox4無法ping到bbox3

 

Joined容器

joined容器非常特別,它可以使兩個或多個容器共享一個網絡棧,共享網卡和配置信息,joined容器之間可以通過127.0.01直接通信。

請看下面的例子:先創建一個httpd容器,名字爲web1。

docker run -d -it --name=web1 =httpd

然後創建busybox容器並通過-network-container:webl指定joined容器爲webl,

docker run -it --network=container:web1 busybox

 

請注意busybox器中網配置息,下面我們查看一下webl的網絡,

看!busybox和webl的網卡mac地址與IP完全一樣,它們共享了相同的網絡棧。
busybox可以直接用127.0.0.1訪問webl的http服務

joined容器非常適合以下場景:

  1. 不同容器中的程序希望通過loopback高效快速地通信,比如web Server與App Server.
  2. 希望監控其他容器的網絡流量,比如運行在獨立容器中的網絡監控程序。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章