容器間通訊的三種方式
轉自:https://www.cnblogs.com/CloudMan6/p/7096731.html
容器之間可通過 IP,Docker DNS Server 或 joined 容器三種方式通訊。
IP 通訊
從上一節的例子可以得出這樣一個結論:兩個容器要能通訊,必須要有屬於同一個網路的網絡卡。
滿足這個條件後,容器就可以通過 IP 互動了。具體做法是在容器建立時通過 --network
指定相應的網路,或者通過 docker network connect
將現有容器加入到指定網路。可參考上一節 httpd 和 busybox 的例子,這裡不再贅述。
Docker DNS Server
通過 IP 訪問容器雖然滿足了通訊的需求,但還是不夠靈活。因為我們在部署應用之前可能無法確定 IP,部署之後再指定要訪問的 IP 會比較麻煩。對於這個問題,可以通過 docker 自帶的 DNS 服務解決。
從 Docker 1.10 版本開始,docker daemon 實現了一個內嵌的 DNS server,使容器可以直接通過“容器名”通訊。方法很簡單,只要在啟動時用 --name
為容器命名就可以了。
下面啟動兩個容器 bbox1 和 bbox2:
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 容器非常特別,它可以使兩個或多個容器共享一個網路棧,共享網絡卡和配置資訊,joined 容器之間可以通過 127.0.0.1 直接通訊。請看下面的例子:
先建立一個 httpd 容器,名字為 web1。
docker run -d -it --name=web1 httpd
然後建立 busybox 容器並通過 --network=container:web1
指定 jointed 容器為 web1:
請注意 busybox 容器中的網路配置資訊,下面我們檢視一下 web1 的網路:
看!busybox 和 web1 的網絡卡 mac 地址與 IP 完全一樣,它們共享了相同的網路棧。busybox 可以直接用 127.0.0.1 訪問 web1 的 http 服務。
joined 容器非常適合以下場景:
-
不同容器中的程式希望通過 loopback 高效快速地通訊,比如 web server 與 app server。
-
希望監控其他容器的網路流量,比如執行在獨立容器中的網路監控程式。