通过OVS实现简单的docker容器互联

由于毕业设计的缘故,需要学习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中并没有安装,因此这里较好的做法是:

  1. docker run -t -i ubuntu /bin/bash 运行一个初始容器
  2. apt-get update && apt install net-tools && apt install iputils-ping && apt install vim依次安装ifconfig、ping、以及vim工具
  3. docker commit -m="update" -a="tony" e218edb10161 tony/ubuntu:v1将更新好的镜像递交到本地仓库中,这样就能够在新拉的容器中使用ifconfig、ping、以及vim工具了。其中:-m: 提交的描述信息,-a: 指定镜像作者,e218edb10161:旧容器 ID,tony/ubuntu:v1: 指定要创建的目标镜像名
  4. docker run -t -i tony:ubuntu /bin/bash拉取自己的镜像
  5. 按照原链接教程完成

首先启动一个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个容器之间又可以通信啦
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值