Docker 跨节点网络方案配置

实验目的

  1. 如何创建veth pair设备?
  2. 了解容器网络namespace机制,如:
    如何将虚拟网络设备配置给某个容器专用?
    宿主机如何管理容器的网络?
  3. openvswitch虚拟交换机的操作

实验环境

  1. 两台宿主机,host1(192.168.1.10)、host2(192.168.1.14)
  2. 每台宿主机已安装docker、openvswitch

实现效果

  1. 两个在不同宿主机上的容器可以互通
  2. 处于不同vlan的容器无法互通

网络配置图

Docker 跨节点网络方案配置_第1张图片

配置过程

Host1

#创建ovs网桥和vxlan接口
ovs-vsctl add-br ovs-br0
ovs-vsctl add-port ovs-br0 vxlan-192.168.1.14 -- set interface vxlan-192.168.1.14 type=vxlan option:remote_ip="192.168.1.14"
#创建容器1并获取其pid,pid用来后续操作该容器的namespace
docker run -tid --net=none --name=container1 centos:latest /bin/bash
pid=$(docker inspect -f '{{.State.Pid}}' container1)
#将该容器namespace软连接至/var/run/netns目录,使得ip netns可操作,ip netns是从/var/run/netns目录获取namespace
mkdir -p /var/run/netns
ln -s /proc/$pid/ns/net /var/run/netns/$pid
#创建veth pair,一端接入交换机
ip link add name vethC1Host mtu1500 type veth peer name vethC1Container mtu 1500
ovs-vsctl add-port ovs-br0 vethC1Host tag=1
ip link set vethC1Host up
#veth pair的另一端作为容器的网卡
ip link set vethC1Container netns $pid
#重命名容器网卡并配置ip
ip netns exec $pid ip link set dev vethC1Container name eth0
ip netns exec $pid ip addr add 192.168.0.1/24 dev eth0
ip netns exec $pid ip link set eth0 up

#创建容器2并获取其pid,pid用来后续操作该容器的namespace
docker run -tid --net=none --name=container2 centos:latest /bin/bash
pid=$(docker inspect -f '{{.State.Pid}}' container2)
#将该容器namespace软连接至/var/run/netns目录,使得ip netns可操作,ip netns是从/var/run/netns目录获取namespace
mkdir -p /var/run/netns
ln -s /proc/$pid/ns/net /var/run/netns/$pid
#创建veth pair,一端接入交换机
ip link add name vethC2Host mtu1500 type veth peer name vethC2Container mtu 1500
ovs-vsctl add-port ovs-br0 vethC1Host tag=2
ip link set vethC2Host up
#veth pair的另一端作为容器的网卡
ip link set vethC2Container netns $pid
#重命名容器网卡并配置ip
ip netns exec $pid ip link set dev vethC2Container name eth0
ip netns exec $pid ip addr add 192.168.0.2/24 dev eth0
ip netns exec $pid ip link set eth0 up

Host2

#创建ovs网桥和vxlan接口
ovs-vsctl add-br ovs-br0
ovs-vsctl add-port ovs-br0 vxlan-192.168.1.10 -- set interface vxlan-192.168.1.10 type=vxlan option:remote_ip="192.168.1.10"
#创建容器3并获取其pid,pid用来后续操作该容器的namespace
docker run -tid --net=none --name=container3 centos:latest /bin/bash
pid=$(docker inspect -f '{{.State.Pid}}' container3)
#将该容器namespace软连接至/var/run/netns目录,使得ip netns可操作,ip netns是从/var/run/netns目录获取namespace
mkdir -p /var/run/netns
ln -s /proc/$pid/ns/net /var/run/netns/$pid
#创建veth pair,一端接入交换机
ip link add name vethC3Host mtu1500 type veth peer name vethC3Container mtu 1500
ovs-vsctl add-port ovs-br0 vethC3Host tag=1
ip link set vethC3Host up
#veth pair的另一端作为容器的网卡
ip link set vethC1Container netns $pid
#重命名容器网卡并配置ip
ip netns exec $pid ip link set dev vethC3Container name eth0
ip netns exec $pid ip addr add 192.168.0.3/24 dev eth0
ip netns exec $pid ip link set eth0 up

#创建容器4并获取其pid,pid用来后续操作该容器的namespace
docker run -tid --net=none --name=container4 centos:latest /bin/bash
pid=$(docker inspect -f '{{.State.Pid}}' container4)
#将该容器namespace软连接至/var/run/netns目录,使得ip netns可操作,ip netns是从/var/run/netns目录获取namespace
mkdir -p /var/run/netns
ln -s /proc/$pid/ns/net /var/run/netns/$pid
#创建veth pair,一端接入交换机
ip link add name vethC4Host mtu1500 type veth peer name vethC4Container mtu 1500
ovs-vsctl add-port ovs-br0 vethC4Host tag=2
ip link set vethC4Host up
#veth pair的另一端作为容器的网卡
ip link set vethC2Container netns $pid
#重命名容器网卡并配置ip
ip netns exec $pid ip link set dev vethC4Container name eth0
ip netns exec $pid ip addr add 192.168.0.4/24 dev eth0
ip netns exec $pid ip link set eth0 up

验证网络

[root@docker-node1 ~]# docker exec -it container1 /bin/bash
[root@container1 /]# ip a 
...
17: eth0@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 2e:96:a2:da:16:4e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.0.1/24 scope global eth0
       valid_lft forever preferred_lft forever
#跨宿主机同vlan的container3可以通信
[root@container1 /]# ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=1.96 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=1.04 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.610 ms
^C
--- 192.168.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 5ms
rtt min/avg/max/mdev = 0.610/1.204/1.960/0.563 ms
#跨宿主机不同vlan的container4无法通信
[root@container1 /]# ping 192.168.0.4
PING 192.168.0.4 (192.168.0.4) 56(84) bytes of data.
From 192.168.0.1 icmp_seq=1 Destination Host Unreachable
From 192.168.0.1 icmp_seq=2 Destination Host Unreachable
From 192.168.0.1 icmp_seq=3 Destination Host Unreachable

你可能感兴趣的:(容器)