1. 程式人生 > 實用技巧 >容器網路(三)容器間通訊

容器網路(三)容器間通訊

以下操作僅僅為了說明容器間的互訪原理

一、同宿主機容器間通訊

1、在同一網橋

建立網橋my_net1,網段172.16.0.0/16
#
docker network create --driver bridge --subnet 172.16.0.0/16 --gateway 172.16.0.1 my_net01 啟動容器1 # docker run -it --rm --network=my_net01 busybox / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:10:00:02 inet addr:172.16.0.2 Bcast:172.16.255.255 Mask:255.255.0.0 …… 啟動容器2
# docker run -it --rm --network=my_net01 busybox / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:10:00:03 inet addr:172.16.0.3 Bcast:172.16.255.255 Mask:255.255.0.0 …… 宿主機,可以看到網橋上有兩張網絡卡 # brctl show bridge name bridge id STP enabled interfaces br-443f050b6ca3 8000.0242dee2c26a no vethed8ac3b vethf1258ae
測試連通性 / # ping 172.16.0.3 PING 172.16.0.3 (172.16.0.3): 56 data bytes 64 bytes from 172.16.0.3: seq=0 ttl=64 time=0.904 ms 64 bytes from 172.16.0.3: seq=1 ttl=64 time=0.177 ms

在同一個網橋上的兩個容器,分配到的IP地址屬於同一網段,是直接就可以互訪的

2、在不同網橋

建立網橋my_net2,網段172.18.0.0/16
#
docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 my_net02


建立容器3 # docker run -it --rm --network=my_net02 busybox / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:12:00:02 inet addr:172.18.0.2 Bcast:172.18.255.255 Mask:255.255.0.0 …… 宿主機檢視網橋資訊 # brctl show bridge name bridge id STP enabled interfaces br-443f050b6ca3 8000.0242dee2c26a no vethed8ac3b vethf1258ae br-d32523fc2826 8000.0242594398dd no vetheec7c7a docker0 8000.024244c8bf47 no 開啟linux核心的資料轉發 # sysctl net.ipv4.ip_forward=1 可以檢視到iptable,可以看到預設不同網橋的容器是不允許互相訪問的 # iptables -S …… -A FORWARD -j DOCKER-ISOLATION-STAGE-1 …… -A DOCKER-ISOLATION-STAGE-1 -i br-d32523fc2826 ! -o br-d32523fc2826 -j DOCKER-ISOLATION-STAGE-2 -A DOCKER-ISOLATION-STAGE-1 -i br-443f050b6ca3 ! -o br-443f050b6ca3 -j DOCKER-ISOLATION-STAGE-2 …… -A DOCKER-ISOLATION-STAGE-2 -o br-d32523fc2826 -j DROP -A DOCKER-ISOLATION-STAGE-2 -o br-443f050b6ca3 -j DROP …… 我們需要把以下兩條規則刪除 # iptables -D DOCKER-ISOLATION-STAGE-2 -o br-d32523fc2826 -j DROP # iptables -D DOCKER-ISOLATION-STAGE-2 -o br-443f050b6ca3 -j DROP 容器已經實現互通了 / # ping 172.16.0.2 PING 172.16.0.2 (172.16.0.2): 56 data bytes 64 bytes from 172.16.0.2: seq=497 ttl=63 time=0.615 ms 64 bytes from 172.16.0.2: seq=498 ttl=63 time=0.193 ms 64 bytes from 172.16.0.2: seq=499 ttl=63 time=0.194 ms

資料流程圖如下:

二、處於不同宿主機間的容器通訊

要實現不同宿主機間容器的通訊,需滿足如下條件

  • 多臺宿主機必須要處於同一個區域網,因為需要配置靜態路由到對應的宿主機
  • 不同的網橋的IP地址段不能衝突
  • 開啟ip_forward流量轉發
  • 關閉iptables的nat和禁止訪問的規則

資料流程圖如下:

節點10.30.20.87

# docker network create --driver bridge --subnet 172.10.0.0/16 --gateway 172.10.0.1 my_net01
# route add -net 172.11.0.0/16 gw 10.30.20.93
# sysctl net.ipv4.ip_forward=1
# docker run -it --network=my_net01 busybox
/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr 02:42:AC:0A:00:02  
          inet addr:172.10.0.2 Bcast:172.10.255.255 Mask:255.255.0.0

……

節點10.30.20.93

# docker network create --driver bridge --subnet 172.11.0.0/16 --gateway 172.11.0.1 my_net02
# route add -net 172.10.0.0/16 gw 10.30.20.87
# sysctl net.ipv4.ip_forward=1
# docker run -it --network=my_net02 busybox
/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr 02:42:AC:0B:00:02  
          inet addr:172.11.0.2  Bcast:172.11.255.255  Mask:255.255.0.0

……

刪除nat和配置允許轉發的策略

節點10.30.20.87

# iptables -S -t nat

……

-A POSTROUTING -s 172.10.0.0/16 ! -o br-a3d2032ddd68 -j MASQUERADE

……

# iptables -t nat -D POSTROUTING -s 172.10.0.0/16 ! -o br-a3d2032ddd68 -j MASQUERADE

# iptables -A FORWARD -o br-a3d2032ddd68 -j ACCEPT

節點10.30.20.93

# iptables -S -t nat

……

-A POSTROUTING -s 172.11.0.0/16 ! -o br-568e8e2a15b4 -j MASQUERADE

……

# iptables -t nat -D POSTROUTING -s 172.11.0.0/16 ! -o br-568e8e2a15b4 -j MASQUERADE

# iptables -A FORWARD -o br-568e8e2a15b4 -j ACCEPT

測試容器間的互聯

/ # ping 172.11.0.2
PING 172.11.0.2 (172.11.0.2): 56 data bytes
64 bytes from 172.11.0.2: seq=0 ttl=62 time=0.883 ms
64 bytes from 172.11.0.2: seq=1 ttl=62 time=0.443 ms
64 bytes from 172.11.0.2: seq=2 ttl=62 time=0.521 ms