#创建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目录获取namespacemkdir -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 linkset vethC1Host up
#veth pair的另一端作为容器的网卡
ip linkset vethC1Container netns $pid#重命名容器网卡并配置ip
ip netns exec$pid ip linkset dev vethC1Container name eth0
ip netns exec$pid ip addr add 192.168.0.1/24 dev eth0
ip netns exec$pid ip linkset 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目录获取namespacemkdir -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 linkset vethC2Host up
#veth pair的另一端作为容器的网卡
ip linkset vethC2Container netns $pid#重命名容器网卡并配置ip
ip netns exec$pid ip linkset dev vethC2Container name eth0
ip netns exec$pid ip addr add 192.168.0.2/24 dev eth0
ip netns exec$pid ip linkset 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目录获取namespacemkdir -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 linkset vethC3Host up
#veth pair的另一端作为容器的网卡
ip linkset vethC1Container netns $pid#重命名容器网卡并配置ip
ip netns exec$pid ip linkset dev vethC3Container name eth0
ip netns exec$pid ip addr add 192.168.0.3/24 dev eth0
ip netns exec$pid ip linkset 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目录获取namespacemkdir -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 linkset vethC4Host up
#veth pair的另一端作为容器的网卡
ip linkset vethC2Container netns $pid#重命名容器网卡并配置ip
ip netns exec$pid ip linkset dev vethC4Container name eth0
ip netns exec$pid ip addr add 192.168.0.4/24 dev eth0
ip netns exec$pid ip linkset 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