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. 希望監控其他容器的網絡流量,比如運行在獨立容器中的網絡監控程序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM