理解容器之間的連通性 - 天天5分鐘玩轉 Docker 容器技術(34)

經過前面小節的實踐,當前 docker host 的網絡拓撲結構以下圖所示,今天咱們將討論這幾個容器之間的連通性。web

163.png

兩個 busybox 容器都掛在 my_net2 上,應該可以互通,咱們驗證一下:docker

可見同一網絡中的容器、網關之間都是能夠通訊的。網絡

my_net2 與默認 bridge 網絡能通訊嗎?ui

從拓撲圖可知,兩個網絡屬於不一樣的網橋,應該不能通訊,咱們經過實驗驗證一下,讓 busybox 容器 ping httpd 容器:spa

確實 ping 不通,符合預期。操作系統

「等等!不一樣的網絡若是加上路由應該就能夠通訊了吧?」我已經聽到有讀者在建議了。設計

這是一個很是很是好的想法。code

確實,若是 host 上對每一個網絡的都有一條路由,同時操做系統上打開了 ip forwarding,host 就成了一個路由器,掛接在不一樣網橋上的網絡就可以相互通訊。下面咱們來看看 docker host 滿不知足這些條件呢?orm

ip r 查看 host 上的路由表:
ip

# ip r

......

172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1

172.22.16.0/24 dev br-5d863e9f78b6  proto kernel  scope link  src 172.22.16.1

......


172.17.0.0/16 和 172.22.16.0/24 兩個網絡的路由都定義好了。再看看 ip forwarding:

# sysctl net.ipv4.ip_forward

net.ipv4.ip_forward = 1


ip forwarding 也已經啓用了。

條件都知足,爲何不能通行呢?

咱們還得看看 iptables:

# iptables-save

......

-A DOCKER-ISOLATION -i br-5d863e9f78b6 -o docker0 -j DROP

-A DOCKER-ISOLATION -i docker0 -o br-5d863e9f78b6 -j DROP

......


緣由就在這裏了:iptables DROP 掉了網橋 docker0 與 br-5d863e9f78b6 之間雙向的流量

從規則的命名 DOCKER-ISOLATION 可知 docker 在設計上就是要隔離不一樣的 netwrok。

那麼接下來的問題是:怎樣才能讓 busybox 與 httpd 通訊呢?

答案是:爲 httpd 容器添加一塊 net_my2 的網卡。這個能夠經過docker network connect 命令實現。

咱們在 httpd 容器中查看一下網絡配置:

容器中增長了一個網卡 eth1,分配了 my_net2 的 IP 172.22.16.3。如今 busybox 應該可以訪問 httpd 了,驗證一下:

busybox 可以 ping 到 httpd,而且能夠訪問 httpd 的 web 服務。當前網絡結構如圖所示:

下一節咱們討論容器間通訊的三種方式

二維碼+指紋.png

相關文章
相關標籤/搜索