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容器非常適合以下場景:
- 不同容器中的程序希望通過loopback高效快速地通信,比如web Server與App Server.
- 希望監控其他容器的網絡流量,比如運行在獨立容器中的網絡監控程序。