由于毕业设计的缘故,需要学习docker和ovs的相关知识,在师兄的指导下,找到一篇适合docker和ovs入门的互联操作,我再原文的基础上做了一些自己的修改,现在开始吧!
原文链接:https://blog.csdn.net/yeya24/article/details/79829240
下面来做一下这次的实验。
首先要确保安装了openvswitch和docker,其次需要运行docker容器,就需要docker image
先看看目前有的镜像,这两个其实都是ubuntu,第二个ubuntu是直接从docker hub上Pull下来的,而第一个image只是在第二个image上安装了vim 和 gcc,所以这次用哪个镜像都不影响使用。
对于这一步,我需要做一下提醒:因为之后的工作要使用ifconfig命令,而这个命令或许初始镜像Ubuntu中并没有安装,因此这里较好的做法是:
docker run -t -i ubuntu /bin/bash
运行一个初始容器apt-get update && apt install net-tools && apt install iputils-ping && apt install vim
依次安装ifconfig、ping、以及vim工具docker commit -m="update" -a="tony" e218edb10161 tony/ubuntu:v1
将更新好的镜像递交到本地仓库中,这样就能够在新拉的容器中使用ifconfig、ping、以及vim工具了。其中:-m: 提交的描述信息,-a: 指定镜像作者,e218edb10161:旧容器 ID,tony/ubuntu:v1: 指定要创建的目标镜像名docker run -t -i tony:ubuntu /bin/bash
拉取自己的镜像- 按照原链接教程完成
首先启动一个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个容器之间又可以通信啦