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

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

IP 通訊

從上一節的例子能夠得出這樣一個結論:兩個容器要能通訊,必需要有屬於同一個網絡的網卡。docker

知足這個條件後,容器就能夠經過 IP 交互了。具體作法是在容器建立時經過 --network 指定相應的網絡,或者經過 docker network connect 將現有容器加入到指定網絡。可參考上一節 httpd 和 busybox 的例子,這裏再也不贅述。網絡

Docker DNS Server

經過 IP 訪問容器雖然知足了通訊的需求,但仍是不夠靈活。由於咱們在部署應用以前可能沒法肯定 IP,部署以後再指定要訪問的 IP 會比較麻煩。對於這個問題,能夠經過 docker 自帶的 DNS 服務解決。app

從 Docker 1.10 版本開始,docker daemon 實現了一個內嵌的 DNS server,使容器能夠直接經過「容器名」通訊。方法很簡單,只要在啓動時用 --name 爲容器命名就能夠了。oop

下面啓動兩個容器 bbox1 和 bbox2:
ui

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

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

而後,bbox2 就能夠直接 ping 到 bbox1 了: orm

使用 docker DNS 有個限制:只能在 user-defined 網絡中使用。也就是說,默認的 bridge 網絡是沒法使用 DNS 的。下面驗證一下: server

建立 bbox3 和 bbox4,均鏈接到 bridge 網絡。

docker run -it --name=bbox3 busybox

docker run -it --name=bbox4 busybox

bbox4 沒法 ping 到 bbox3。

171.png

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 容器很是適合如下場景:

  1. 不一樣容器中的程序但願經過 loopback 高效快速地通訊,好比 web server 與 app server。

  2. 但願監控其餘容器的網絡流量,好比運行在獨立容器中的網絡監控程序。

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

二維碼+指紋.png

相關文章
相關標籤/搜索