docker+openvswitch实现主机与容器的网络通信
主要用到openvswitch和netns网络名称空间的相关知识还有ip命令的使用。
实验环境的结构图如下:

思路如下:
- 安装openvswitch
- ovs创建br0,br1,并启动两个不加载网络的docker容器
- 将容器关联网桥br0,并设置ip、vlan
- 创建veth0与veth1网卡对
- 创建netns名称空间,并添加veth0.0和veth1.0接口,并配置相关信息
- 将veth0.1和veth1.1分别桥接至br0,br1,并配置相关信息
- 添加SNAT和DNAT规则
- 给br1配置ip测试连通
具体步骤如下
# yum install -y openvswitch
下载OpenvSwitch项目提供的支持Docker容器的辅助脚本ovs-docker:
# wget https://github.com/openvswitch/ovs/raw/master/utilities/ovs-docker
# chmod a+x ovs-docker
此处脚本最好放在/root目录下,后续使用ovs-docker命令需要用到

# ovs-vsctl add-br br0
# ovs-vsctl add-br br0
# ip link set br0 up
# ip link set br1 up
# docker run –it –privileged=true –net=none –name box1 busybox:latest /bin/sh
# docker run –it –privileged=true –net=none –name box2 busybox:latest /bin/sh
通过ctrl p+ctrl q可以退出容器并且不关闭容器

# ./ovs-docker add-port br0 eth0 box1 –ipaddress=10.0.0.1/24 –gateway=10.0.0.253
# ./ovs-docker set-vlan br0 eth0 box1 5
# ./ovs-docker add-port br0 eth0 box2 –ipaddress=10.0.0.2/24 –gateway=10.0.0.253
# ./ovs-docker set-vlan br0 eth0 box2 5
此时可以先测试容器的互通性,两容器相互ping测试。

# ip link add veth0.0 type veth peer name veth0.1
# ip link add veth1.0 type veth peer name veth1.1
注意开启:net.ipv4.ip_forward=1
# ip netns add r1 创建netns名称空间r1
# ip link set veth0.0 netns r1 添加两个接口
# ip link set veth1.0 netns r1
# ip netns exec r1 ip link set veth0.0 up 启动两个接口
# ip netns exec r1 ip link set veth1.0 up
# ip netns exec r1 ip addr add 192.168.2.221/24 dev veth1.0 给veth1.0添加ip
# ip netns exec r1 ifconfig veth1.0:1 192.168.1.223/24 up 配置两个浮动ip
# ip netns exec r1 ifconfig veth1.0:2 192.168.1.224/24 up
# ip netns exec r1 ip addr add 10.0.0.253/24 dev veth0.1 配置容器的网关地址
# ovs-vsctl add-port br0 veth0.1
# ovs-vsctl add-port br1 veth1.1
# ip link set veth0.1 up
# ip link set veth1.1 up
# ovs-vsctl set port veth0.1 tag=5 tag实际就是配置vlan,否则在vlan 5的容器内流量不会经过此接口

此时可以测试容器的通信(容器内ping 10.0.0.253,ping 192.168.1.221)
SNAT:使得容器box1和box2能访问外网
# ip netns exec r1 iptables –t nat –A POSTROUTING –s 10.0.0.1/32 –j SNAT –-to-source 192.168.2.223
# ip netns exec r1 iptables –t nat –A POSTROUTING –s 10.0.0.2/32 –j SNAT –-to-source 192.168.2.224
DNAT:使得外网能够访问容器
# ip netns exec r1 iptables –t nat –A PREROUTING –d 192.168.2.223/32 –j DNAT –-to-destination 10.0.0.1
# ip netns exec r1 iptables –t nat –A PREROUTING –d 192.168.2.224/32 –j DNAT -–to-destination 10.0.0.2
# ifconfig br1 192.168.1.122

最后网桥br0和br1的接口信息:

测试整个网络的通信
在容器中(box1):ping 10.0.0.2,ping 10.0.0.253,ping 192.168.1.221,ping 192.168.1.223,ping 192.168.1.224,ping 192.168.1.122,ping 192.168.1.222(本机ip)
在本机中(192.168.1.222):ping 192.168.1.122,ping 192.168.1.223,ping 192.168.1.224,ping 192.168.1.221


以上
docker+openvswitch实现主机与容器的网络通信的更多相关文章
- [转]Docker 生产环境之配置容器 - 限制容器资源
默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的给定资源.Docker 提供了一些方法来控制容器可以使用多少内存.CPU 或块 IO,并设置 docker run 命令的运行时配置标志.本 ...
- Docker容器学习梳理 - 容器间网络通信设置(Pipework和Open vSwitch)
自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信.下面将分别针对这两方面,对容 ...
- Docker 网络模式详解及容器间网络通信
当项目大规模使用 Docker 时,容器通信的问题也就产生了.要解决容器通信问题,必须先了解很多关于网络的知识.Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜 ...
- Docker的单主机容器网络
作者:杨冬 欢迎转载,也请保留这段声明.谢谢! 出处: https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/ 本篇文章主要探索Do ...
- Docker:使用Ambassador进行跨主机间容器通信
转载请注明出处:点我 由于Docker自身的网络的原因,想要在多主机间的容器之间进行通信是比较麻烦的事情.可以利用Ambassador容器来实现这一功能. 基本原理: 利用Ambassador来实现主 ...
- docker 现实---联网多台物理主机,容器桥到物理网络(三)
docker 默认桥接卡docker0 只有当这个单元中的所有容器桥接卡.例如,在主机虚拟网络适配器容器看通常称为veth*** 和docker只要把这些卡桥接在一起,例如下面的附图: waterm ...
- [docker]使用quaaga实现(rip ospf)实现主机间容器互通
使用quaaga实现(rip ospf)实现主机间容器互通 - n1设置 brctl addbr br0 ip a a 10.1.1.1/24 br0 ip a a 10.1.1.1/24 dev b ...
- docker中宿主机与容器(container)互相拷贝传递文件的方法
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/71425077 本文出自[我是干勾鱼的博客] 前面讲解过如何进入.退出docker ...
- Docker OpenvSwitch 介绍 or 工作原理
Docker OpenvSwitch Network 介绍 什么是OpenVSwich OpenvSwich Network:属于第三方网络项目,可以理解为是一个标准的交换机协议. OpenvSwic ...
随机推荐
- 如何在Ruby中编写微服务?
[编者按]本文作者为 Pierpaolo Frasa,文章通过详细的案例,介绍了在Ruby中编写微服务时所需注意的方方面面.系国内 ITOM 管理平台 OneAPM 编译呈现. 最近,大家都认为应当采 ...
- 洗礼灵魂,修炼python(65)--爬虫篇—BeautifulSoup:“忘掉正则表达式吧,我拉车养你”
前面解析了正则表达式,其实内容还挺多的对吧?确实挺适用的,不仅是python,其他语言或者web前端后端基本都要掌握正则表达式知识,但是你说,这么多,要完全的掌握,灵活运用的话,得搞多久啊?并且如果一 ...
- Python中关于with open file as 的用法
最近用到python来处理文本文件了,然后需要处理文件.发现python中提供的with open as 这个还是用的不错的!好的,废话不多说了,看下例子: with open('./sig ...
- GitHub-标签管理
参考博文:廖雪峰Git教程 1. 创建标签 切换到需要打标签的分支上,之后打标签 [root@mini05 zhangtest]# git branch dev * master [root@mini ...
- puppet使用 apache passsenger 作为前端 (debian)
目录 1. 概要 2. nginx + passenger 配置 2.1. package 安装 2.2. 配置文件设置 2.3. 测试配置结果 2.4. 参考网址 概要 之前做过 apache + ...
- 一张有料的图片!!!附文件-图片合成器C语言实现算法
凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.打开F盘,先找两个文件,一个是压缩文件(2.rar),另一个是一张图片(1.jpg),将其放到F盘目录下, ...
- 《Java大学教程》—第21章 高级案例研究
21.3 需求:P510用例模型(use case model):用例图(use case diagram).用例(use case).行为说明(behaviour specification) ...
- 《Java大学教程》—第14章 抽象、继承和接口
自测题:1. 解释抽象和抽象数据类型的概念.P333抽象的概念是仅仅关注对象可以完成什么工作,而不必担心如何完成工作的细节.类模板通常被称为抽象数据类型.因为这类数据暴露给用户的所有信息仅仅是方 ...
- Linux 基本操作 (day2)
一.用户的基本操作 1.添加和删除用户(管理员): useradd 用户名: useradd taibai passwd 用户名: passwd taibai [root@localhost ~] ...
- C# 生成和解析二维码
下面是C#和JAVA两个版本的开放源码下载: C#:http://www.codeproject.com/Articles/20574/Open-Source-QRCode-Library JAVA: ...