天天看點

容器間通信的三種方式 - 每天5分鐘玩轉 Docker 容器技術(35)

容器之間可通過 IP,Docker DNS Server 或 joined 容器三種方式通信。

從上一節的例子可以得出這樣一個結論:兩個容器要能通信,必須要有屬于同一個網絡的網卡。

滿足這個條件後,容器就可以通過 IP 互動了。具體做法是在容器建立時通過 <code>--network</code> 指定相應的網絡,或者通過 <code>docker network connect</code> 将現有容器加入到指定網絡。可參考上一節 httpd 和 busybox 的例子,這裡不再贅述。

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

從 Docker 1.10 版本開始,docker daemon 實作了一個内嵌的 DNS server,使容器可以直接通過“容器名”通信。方法很簡單,隻要在啟動時用 <code>--name</code> 為容器命名就可以了。

下面啟動兩個容器 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 容器之間可以通過 127.0.0.1 直接通信。請看下面的例子:

先建立一個 httpd 容器,名字為 web1。

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

然後建立 busybox 容器并通過 <code>--network=container:web1</code> 指定 jointed 容器為 web1:

請注意 busybox 容器中的網絡配置資訊,下面我們檢視一下 web1 的網絡:

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

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

不同容器中的程式希望通過 loopback 高效快速地通信,比如 web server 與 app server。

希望監控其他容器的網絡流量,比如運作在獨立容器中的網絡監控程式。

容器之間的通信我們已經搞清楚了,接下來要考慮的是容器如何與外部世界通信?這将是下一節的主題。

本文轉自CloudMan6 51CTO部落格,原文連結:http://blog.51cto.com/cloudman/1943323