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控制器端口映射到本地端口,而後在宿主機便可進去控制器頁面