声明:
本博客欢迎转载,但请保留原作者信息!
作者:柯晓东
团队:华为杭州OpenStack团队
docker原生使用linux bridge来创建网桥,这样无法使用vlan对容器间的网络进行网络隔离。
openvswitch社区提供了一个工具ovs-docker来给docker快速搭建ovs网络。
先看一下ovs-docker应用的一个例子:
(1)从ovs社区下载ovs-docker工具
wget https://raw.githubusercontent.com/openvswitch/ovs/master/utilities/ovs-docker
(2)创建几个容器,设置网络为none
docker run -t -i --name RouterA --net=none --privileged -v /lib/modules:/lib/modules ubuntu /bin/bash
docker run -t -i --name RouterB --net=none --privileged -v /lib/modules:/lib/modules ubuntu /bin/bash
docker run -t -i --name RouterC --net=none --privileged -v /lib/modules:/lib/modules ubuntu /bin/bash
(3)创建一个ovs网桥
ovs-vsctl add-br vswitch0
(4)用工具给容器添加网口
添加网口的参数为:网桥名、容器内的新网口名、容器名、新网口的ip地址
./ovs-docker add-port vswitch0 eth0 RouterA --ipaddress=192.168.100.1/24
./ovs-docker add-port vswitch0 eth0 RouterB --ipaddress=192.168.100.2/24
./ovs-docker add-port vswitch0 eth1 RouterB --ipaddress=192.168.200.2/24
./ovs-docker add-port vswitch0 eth0 RouterC --ipaddress=192.168.100.3/24
(5)测试1
在容器 RouterB 可以ping通 RouterA和RouterC
(6)设置Vlan隔离
设置Vlan的参数为:网桥名、容器内网口名、容器名、vlan号
./ovs-docker set-vlan vswitch0 eth0 RouterA 100
./ovs-docker set-vlan vswitch0 eth0 RouterB 100
./ovs-docker set-vlan vswitch0 eth1 RouterB 200
./ovs-docker set-vlan vswitch0 eth0 RouterC 203
(7)测试2
在容器 RouterB 发现ping不通 RouterC
ovs-docker简单又好用,它的原理就是用netns和veth来作容器和ovs网桥间的桥接!
下面来详细解说ovs-docker的代码:
#!/bin/bash
#检查对应的可执行程序有没有在$PATH目录下
#检查的可执行程序有 ovs-vsctl、docker、uuidgen
search_path () {
save_IFS=$IFS
IFS=:
for dir in $PATH; do
IFS=$save_IFS
if test -x "$dir/$1"; then
return 0
fi
done
IFS=$save_IFS
echo >&2 "$0: $1 not found in \$PATH, please install and try again"
exit 1
}
#给所有的ovs-vsctl命令增加超时时间
ovs_vsctl () {
ovs-vsctl --timeout=60 "$@"
}
#每个容器是一个netns
#但是只有在 /va/run/netns 下面建立链接