Docker自带三种网络类型的网络,分别为bridge网络,none网络,以及host网络,在启动容器时如果不指定容器所采用的网络类型,docker会默认将容器分配到bridge网络,并连接在docker0这张网卡上。如果想要使容器受控于SDN网络,则需在启动容器时指定其网络类型为none网络,然后通过ovs-docker工具将容器连接到对应的交换机上,最后再将交换机添加到floodlight控制器即可,下面将给出具体的操作:
首先下载ovs-docker工具,方便后面用其将容器与ovs交换机相连
sudo wget https://github.com/openvswitch/ovs/raw/master/utilities/ovs-docker
下载好ovs-docker后修改权限,使其具有可运行权限,并创建两台虚拟交换机(openvswitch创建的交换机的实质是网桥),然后查看创建的交换机的状态
sudo chmod a+x ovs-docker sudo ovs-vsctl add-br br1 sudo ovs-vsctl add-br br2 sudo ovs-vsctl show
创建容器并指定其网络类型为none网络
sudo docker run -it --name host11 --network none --privileged chenjin2018/ubuntu:v1 sudo docker run -it --name host12 --network none --privileged chenjin2018/ubuntu:v1 sudo docker run -it --name host13 --network none --privileged chenjin2018/ubuntu:v1 sudo docker run -it --name host21 --network none --privileged chenjin2018/ubuntu:v1 sudo docker run -it --name host22 --network none --privileged chenjin2018/ubuntu:v1
容器创建成功后利用ovs-docker工具将所创建的容器添加到前面所创的ovs交换机上
sudo ./ovs-docker add-port br1 eth0 host11 --ipaddress=10.0.0.11/24 sudo ./ovs-docker add-port br1 eth0 host12 --ipaddress=10.0.0.12/24 sudo ./ovs-docker add-port br1 eth0 host13 --ipaddress=10.0.0.13/24 sudo ./ovs-docker add-port br2 eth0 host21 --ipaddress=10.0.0.21/24 sudo ./ovs-docker add-port br2 eth0 host22 --ipaddress=10.0.0.22/24
为了验证容器是否添加成功,来查看一下当前ovs的状态,并附加到容器去查看容器的IP是否为我们自定义的IP,由下图可见容器已经成功分配自定义IP并成功连接到ovs交换机上
其中host11、host12、host13连接到br1上,host21、host22连接到br2上,连接到br1上的容器之间可以相互通信,连接到br2上的容器之间也可以相互通信,但br1与br2上的容器之间是不能相互通信的,下面来对这一结果进行验证
将两台ovs交换机连接到SDN控制器
sudo ovs-vsctl set-controller br1 tcp:127.0.0.1:6653 sudo ovs-vsctl set-controller br2 tcp:127.0.0.1:6653
由控制器的网络拓扑图可以看出,两台交换机和docker容器都已经成功添加到控制器上,但两台交换机之间并没有连通,如果想要不同交换机上的容器之间也可以相互通信,则需在两台交换机上创建虚拟端口,将其设为patch类似,并将对端端口添加上去
在br1上创建虚拟端口,将其设置为patch类型,并添加对端端口 sudo ovs-vsctl add-port br1 br1-2 sudo ovs-vsctl set interface br1-2 type=patch sudo ovs-vsctl set interface br1-2 options:peer=br2-1 在br2上创建虚拟端口,将其设置为patch类型,并添加对端端口 sudo ovs-vsctl add-port br2 br2-1 sudo ovs-vsctl set interface br2-1 type=patch sudo ovs-vsctl set interface br2-1 options:peer=br1-2
查看当前两块网桥的信息
再次进入控制器页面查看两台交换机的连接情况
验证不同网桥上的容器的连通性
上述实验所用的Floodlight控制器还是我在参加SDN比赛时用的旧版本,其图形化界面的优化做的不是很好,最近出了新的控制器图形化界面做的很酷炫,但我并没有安装它,不过Docker这个强大的工具对应用进行封装,当然对SDN的控制器也有封装,docker.hub上有已经封装好的镜像,可以采用以下命令来获取镜像并启动容器
sudo docker pull glefevre/floodlight sudo docker run -p 8080:8080 -p 6653:6653 glefevre/floodlight
这里做了两个端口的映射,分别是8080和6653,这都是SDN控制器的端口,将容器化的SDN控制器端口映射到本地端口,然后在宿主机即可进去控制器页面