Docker自带三种网络类型的网络,分别为bridge网络,none网络,以及host网络,在启动容器时若是不指定容器所采用的网络类型,docker会默认将容器分配到bridge网络,并链接在docker0这张网卡上。若是想要使容器受控于SDN网络,则需在启动容器时指定其网络类型为none网络,而后经过ovs-docker工具将容器链接到对应的交换机上,最后再将交换机添加到floodlight控制器便可,下面将给出具体的操做:git
首先下载ovs-docker工具,方便后面用其将容器与ovs交换机相连github
sudo wget https://github.com/openvswitch/ovs/raw/master/utilities/ovs-docker
下载好ovs-docker后修改权限,使其具备可运行权限,并建立两台虚拟交换机(openvswitch建立的交换机的实质是网桥),而后查看建立的交换机的状态docker
sudo chmod a+x ovs-docker sudo ovs-vsctl add-br br1 sudo ovs-vsctl add-br br2 sudo ovs-vsctl show
建立容器并指定其网络类型为none网络ubuntu
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交换机上 tcp
其中host十一、host十二、host13链接到br1上,host2一、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相似,并将对端端口添加上去spa
在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
查看当前两块网桥的信息 3d
再次进入控制器页面查看两台交换机的链接状况
验证不一样网桥上的容器的连通性
上述实验所用的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控制器端口映射到本地端口,而后在宿主机便可进去控制器页面