最近在自己的虚拟机上安装了docker,感觉docker真的是一个灰常强大的东东啊!
由于之前也在学习sdn,一直以来都是用Mininet来进行模拟。而有了docker以后,可以使用容器来模拟Mininet中的host来与openvswitch进行互联,就可以做一些更加高级的实验啦! 在github上也有一个对原先mininet的扩展项目containernet容器网络,这个项目提供的api可以让我们在mininet中使用容器具体可以参考https://github.com/containernet/containernet进行学习。
下面来做一下这次的实验。
首先要确保安装了openvswitch和docker,其次需要运行docker容器,就需要docker image
先看看目前有的镜像,这两个其实都是ubuntu,第二个ubuntu是直接从docker hub上Pull下来的,而第一个image只是在第二个image上安装了vim 和 gcc,所以这次用哪个镜像都不影响使用。
首先启动一个ovs 命名为s1,随后通过ovs-vsctl show 命令查看一下这个网桥,目前没有分配IP和端口
接下来在两个shell中启动2个容器
使用的命令是
docker run -it --net=none --privileged=true --name=xxx yeya24/ubuntu:14.04
-it就相当于是运行容器后进入容器的命令行 如果不加这个选项的话容器默认是运行在后台
--net=none 则是指定容器运行在自己的命名空间,但是并不对容器进行网络配置,比如网卡,IP地址等 关于这个选项的说明可以参考https://blog.csdn.net/liuliuzi_hz/article/details/50504176这篇文章
--privileged=true 当我们进入容器的时候,默认是root用户,然而这个root用户还是没有很多权限,其实也就相当于宿主机的普通用户,加上privileged=true这个选项可以让容器内的用户权限提升
--name=xxx没啥好说的 给容器起个名字 我这边取得是host1 和 host2
容器创建好之后,通过docker ps 可以查看运行的容器
由于我们刚才指定了net=none 所以此时在容器内使用ifconfig命令只能看到一个lo0接口
open vswitch中可以很方便的使用ovs-docker命令来进行与容器的互联
看一下这个命令的一些选项
add-port命令可以将ovs端口与容器互联 还可以指定ip地址,mac地址,网关,mtu等等
del-port 与上一条命令相对应 删除容器内的一个接口并中断这个接口与ovs的连通性
del-ports 删除ovs与容器所有的互联接口
set-vlan 可以对容器的接口设置vlan
在ovs上设置s1分别与host1,host2的eth0口相连
这个时候用ovs-vsctl show 来查看一下s1,可以看到多了2个端口
这时候我们看一下容器内的接口,发现此时多了一个eth0,但是还没有ip地址
我们给容器的eth0接口配置Ip
host1:
ifconfig eth0 172.16.0.1/24
host2:
ifconfig eth0 172.16.0.2/24
这个时候两个容器的eth0接口都配置完毕
h1 ping h2 发现直接就能通了
查看s1,发现自动生成了一条流表项,actions=normal,代表数据包正常转发(类似传统2层交换机的转发功能)
手动添加一条流表使host1和host2无法通行,这条流表对1端口号收到的数据报执行丢弃动作
sudo ovs-ofctl add-flow s1 "in_port=1,actions=drop"
可以发现这个时候已经Ping不通了
在s1上再把这条流表删除
sudo ovs-ofctl del-flows s1 "in_port=1"
发现2个容器之间又可以通信啦
---------------------
原文:https://blog.csdn.net/yeya24/article/details/79829240