1. 程式人生 > >docker+openvswitch實現主機與容器的網絡通信

docker+openvswitch實現主機與容器的網絡通信

wget 支持 結構 docker命令 alt gin inf sta 網絡通信

主要用到openvswitch和netns網絡名稱空間的相關知識還有ip命令的使用。

實驗環境的結構圖如下:

技術分享圖片

思路如下:

  1. 安裝openvswitch
  2. ovs創建br0,br1,並啟動兩個不加載網絡的docker容器
  3. 將容器關聯網橋br0,並設置ip、vlan
  4. 創建veth0與veth1網卡對
  5. 創建netns名稱空間,並添加veth0.0和veth1.0接口,並配置相關信息
  6. 將veth0.1和veth1.1分別橋接至br0,br1,並配置相關信息
  7. 添加SNAT和DNAT規則
  8. 給br1配置ip測試連通

具體步驟如下

1.安裝openvswitch

# yum install -y openvswitch

下載OpenvSwitch項目提供的支持Docker容器的輔助腳本ovs-docker:

# wget https://github.com/openvswitch/ovs/raw/master/utilities/ovs-docker

# chmod a+x ovs-docker

此處腳本最好放在/root目錄下,後續使用ovs-docker命令需要用到

技術分享圖片

2.ovs創建br0,br1,並啟動兩個不加載網絡的docker容器

# ovs-vsctl add-br br0

# ovs-vsctl add-br br0

# ip link set br0 up

# ip link set br1 up

# docker run –it –privileged=true –net=none –name box1 busybox:latest /bin/sh

# docker run –it –privileged=true –net=none –name box2 busybox:latest /bin/sh

通過ctrl p+ctrl q可以退出容器並且不關閉容器

技術分享圖片

3.將容器關聯網橋br0,並設置ip、vlan

# ./ovs-docker add-port br0 eth0 box1 –ipaddress=10.0.0.1/24 –gateway=10.0.0.253

# ./ovs-docker set-vlan br0 eth0 box1 5

# ./ovs-docker add-port br0 eth0 box2 –ipaddress=10.0.0.2/24 –gateway=10.0.0.253

# ./ovs-docker set-vlan br0 eth0 box2 5

此時可以先測試容器的互通性,兩容器相互ping測試。

技術分享圖片

4.創建veth0與veth1網卡對

# ip link add veth0.0 type veth peer name veth0.1

# ip link add veth1.0 type veth peer name veth1.1

註意開啟:net.ipv4.ip_forward=1

5.創建netns名稱空間,並添加veth0.0和veth1.0接口,並配置相關信息

# ip netns add r1        創建netns名稱空間r1

# ip link set veth0.0 netns r1    添加兩個接口

# ip link set veth1.0 netns r1

# ip netns exec r1 ip link set veth0.0 up 啟動兩個接口

# ip netns exec r1 ip link set veth1.0 up

# ip netns exec r1 ip addr add 192.168.2.221/24 dev veth1.0 給veth1.0添加ip

# ip netns exec r1 ifconfig veth1.0:1 192.168.1.223/24 up 配置兩個浮動ip

# ip netns exec r1 ifconfig veth1.0:2 192.168.1.224/24 up

# ip netns exec r1 ip addr add 10.0.0.253/24 dev veth0.1 配置容器的網關地址

6.將veth0.1和veth1.1分別橋接至br0,br1,並配置相關信息

# ovs-vsctl add-port br0 veth0.1

# ovs-vsctl add-port br1 veth1.1

# ip link set veth0.1 up

# ip link set veth1.1 up

# ovs-vsctl set port veth0.1 tag=5 tag實際就是配置vlan,否則在vlan 5的容器內流量不會經過此接口

技術分享圖片

此時可以測試容器的通信(容器內ping 10.0.0.253,ping 192.168.1.221)

7.添加SNAT和DNAT規則

SNAT:使得容器box1和box2能訪問外網

# ip netns exec r1 iptables –t nat –A POSTROUTING –s 10.0.0.1/32 –j SNAT –-to-source 192.168.2.223

# ip netns exec r1 iptables –t nat –A POSTROUTING –s 10.0.0.2/32 –j SNAT –-to-source 192.168.2.224

DNAT:使得外網能夠訪問容器

# ip netns exec r1 iptables –t nat –A PREROUTING –d 192.168.2.223/32 –j DNAT –-to-destination 10.0.0.1

# ip netns exec r1 iptables –t nat –A PREROUTING –d 192.168.2.224/32 –j DNAT -–to-destination 10.0.0.2

8.給br1配置IP並測試整個通信

# ifconfig br1 192.168.1.122

技術分享圖片

最後網橋br0和br1的接口信息:

技術分享圖片

測試整個網絡的通信

在容器中(box1):ping 10.0.0.2,ping 10.0.0.253,ping 192.168.1.221,ping 192.168.1.223,ping 192.168.1.224,ping 192.168.1.122,ping 192.168.1.222(本機ip)

在本機中(192.168.1.222):ping 192.168.1.122,ping 192.168.1.223,ping 192.168.1.224,ping 192.168.1.221

技術分享圖片

技術分享圖片

以上

docker+openvswitch實現主機與容器的網絡通信