利用Openvswitch实现不同物理机中的Docker容器互连
1. 测试环境
75机(10.11.150.75):Red Hat Enterprise Linux Server 7.0,无外网访问权限,已安装Docker Server
74机(10.11.150.74):Red Hat Enterprise Linux Server 7.0,无外网访问权限,已安装Docker Server
73机(10.11.150.73):Red Hat Enterprise Linux Server 7.0,无外网访问权限,已安装Docker Server
183机:OS X Yosemite 10.10.4,完全外网访问,用于下载安装包
2. 默认Docker网络情况
在73机和75机上通过下面命令启动docker服务:
sudo docker -d &
启动几个容器后,通过 brctl 工具和 ip a 查看网桥的配置情况,可以看到docker启动后默认创建了一个名为docker0的网桥,且分配了了172.17.42.1的内部IP:

可通过如下命令安装 brctl ,后面许多关于网桥的操作需要用到:
sudo yum install bridge-utils
在73机和75机之间的网络ping情况如下图所示,可以看出73机和75机容器之间的是不能ping通的:

下面将介绍利用Openvswitch对网络进行配置实现不同物理机间容器互连的方法。
3. 安装Openvswitch
以73机上的安装为例,先通过183机下载安装包并scp到73机上:
wget http://openvswitch.org/releases/openvswitch-2.3.0.tar.gz
scp openvswitch-2.3..tar.gz scs@10.11.150.73:/opt/scs/openxxs
在73机上安装必要的依赖环境,大部分依赖项Linux系统都自带了:
sudo yum -y install openssl-devel gcc make python-devel openssl-devel kernel-devel graphviz kernel-debug-devel autoconf automake rpm-build redhat-rpm-config libtool
创建系统用户ovs,并将安装包复制到ovs的主目录下:
sudo adduser ovs
sudo cp /opt/scs/openxxs/openvswitch-2.3..tar.gz /home/ovs/
切换至ovs用户,进行yum安装Openvswitch的必要准备,然后退回到原scs用户:
sudo su - ovs tar -zxvpf openvswitch-2.3..tar.gz mkdir -p ~/rpmbuild/SOURCES sed 's/openvswitch-kmod, //g' openvswitch-2.3./rhel/openvswitch.spec > openvswitch-2.3./rhel/openvswitch_no_kmod.spec cp openvswitch-2.3..tar.gz rpmbuild/SOURCES/ rpmbuild -bb --without check ~/openvswitch-2.3./rhel/openvswitch_no_kmod.spec exit
安装Openvswitch:
sudo yum localinstall /home/ovs/rpmbuild/RPMS/x86_64/openvswitch-2.3.-.x86_64.rpm
安装完之后就可以启动openswitch服务了:
sudo mkdir /etc/openvswitch setenforce sudo systemctl start openvswitch.service sudo systemctl status openvswitch.service -l

以相同方式在74机上安装并启动Openvswitch。
4. 网桥配置
1)73机上配置:
首先开启ip_forward:
sudo sysctl -w net.ipv4.ip_forward=
然后通过ovs-vsctl创建ob0网桥并绑定IP:
sudo ovs-vsctl add-br ob0 sudo ovs-vsctl add-port ob0 gre0 -- set Interface gre0 type=gre options:remote_ip=10.11.150.73
通过brctl创建kbr0网桥和ob0关联,并删除docker0网桥的关联:
sudo brctl addbr kbr0 sudo brctl addif kbr0 ob0 sudo ip link set dev docker0 down sudo ip link del dev docker0
创建 /etc/sysconfig/network-scripts/ifcfg-kbr0 文件,内容如下:
DEVICE=kbr0
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.17.2.1
NETMASK=255.255.255.0
GATEWAY=172.17.2.0
USERCTL=no
TYPE=Bridge
IPV6INIT=no
创建 /etc/sysconfig/network-scripts/route-em1 文件(em1为实际网卡),内容如下:
172.17.1.0/ via 10.11.150.74 dev em1
配置完成后,重启网络服务:
sudo systemctl restart network.service
2)74机上配置:
与73机的配置类似,首先开启ip_forward:
sudo sysctl -w net.ipv4.ip_forward=1
然后通过ovs-vsctl创建obr0网桥并绑定IP:
sudo ovs-vsctl add-br obr0 sudo ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=10.11.150.74
通过brctl创建kbr0网桥和obr0关联,并删除docker0网桥的关联:
sudo brctl addbr kbr0 sudo brctl addif kbr0 obr0 sudo ip link set dev docker0 down sudo ip link del dev docker0
创建 /etc/sysconfig/network-scripts/ifcfg-kbr0 文件,内容如下:
DEVICE=kbr0
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.17.1.1
NETMASK=255.255.255.0
GATEWAY=172.17.1.0
USERCTL=no
TYPE=Bridge
IPV6INIT=no
创建 /etc/sysconfig/network-scripts/route-em1 文件(em1为实际网卡),内容如下:
172.17.2.0/24 via 10.11.150.73 dev em1
配置完成后,重启网络服务:
sudo systemctl restart network.service
5. 配置后网络情况
重启73机和74机的docker服务,启动时指定网桥为我们创建的kbr0:
sudo killall docker sudo docker -d -b=kbr0 &
启动几个docker容器后我们可以查看两台机子的网络环境如下:


进行各个设备间的ping操作之后得出下图的网络情况,可以看到两个物理机下的容器间已经可以通过IP互联了:

6. 附
参考资料(外文,需FanQiang):https://n40lab.wordpress.com/2015/01/25/centos-7-installing-openvswitch-2-3-1-lts/
参考资料(中文):http://ylw6006.blog.51cto.com/470441/1606239/
openvswitch-2.3.0.tar.gz 百度云备份:http://pan.baidu.com/s/1c056wq0
利用Openvswitch实现不同物理机中的Docker容器互连的更多相关文章
- 教你如何修改运行中的docker容器的端口映射
在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...
- [转帖]教你如何修改运行中的docker容器的端口映射
教你如何修改运行中的docker容器的端口映射 在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当dock ...
- 如何修改运行中的docker容器的端口映射
在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...
- 如何修改运行中的docker容器的端口映射和挂载目录
在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设 ...
- Ubuntu物理机中解决VirtualBox虚拟机无法连接USB设备的问题
本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=611 问题描述: 在安装完VirtualBox的USB控制器扩展(关于在VirtualBox中安装USB控制器扩展的 ...
- 在Windows宿主机中连接虚拟机中的Docker容器
1. 简单拓扑图
- 本机机器ssh docker容器
https://blog.csdn.net/u010324465/article/details/77184506 1.在docker中安装openssh-server 2.sudo /etc/ini ...
- 从宿主机直接进入docker容器的网络空间
Docker dns nameserver 也是进入容器网络空间,监听53端口,但它通过iptable把端口映射到宿主机上,处理DNS请求的进程就在宿主机上. how does Docker Embe ...
- 在airflow的BashOperator中执行docker容器中的脚本容易忽略的问题
dag模板 from airflow import DAG from airflow.operators.bash_operator import BashOperator from airflow. ...
随机推荐
- python学习应用笔记(一)
之前一直用c++写程序 所以考虑程序一般都比较容易往数据结构的方向想 而自己设计数据结构往往要费很大事 昨天看了一下python 发现脚本语言 真是厉害 用来进行模拟运算确实不错 可以先 ...
- python Django 学习笔记(四)—— 使用MySQL数据库
1,下载安装MySQLdb类库 http://www.djangoproject.com/r/python-mysql/ 2,修改settings.py 配置数据属性 DATABASES = { 'd ...
- JSAPI_Ticket签名
1.微信 JS 接口签名校验工具 2.具体开发 2.1 获取access_token,然后jsapi_ticket /** * 获取access_token,然后jsapi_ticket */ pri ...
- hdu 3342 Legal or Not
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3342 Legal or Not Description ACM-DIY is a large QQ g ...
- MVC4.0网站发布和部署到IIS7.0上的方法【转:http://www.th7.cn/Program/net/201403/183756.shtml】
最近在研究MVC4,使用vs2010,开发的站点在发布和部署到iis7上的过程中遇到了很多问题,现在将解决的过程记录下来,以便日后参考,整个过程主要以截图形式呈现 vs2010的安装和mvc4的安装不 ...
- jsapi支付,提示redirect_uri 参数错误
检查授权目录(微信支付——配置中心) appid MCHID KEYS 配置参数是否正确 appsecrect 配置是否正确(开发者中心) 如果是使用测试链接,需要同时指定测试授权目录,测试账号,并且 ...
- [转]gdb结合coredump定位崩溃进程
[转]gdb结合coredump定位崩溃进程 http://blog.sina.com.cn/s/blog_54f82cc201013tk4.html Linux环境下经常遇到某个进程挂掉而找不到原因 ...
- QT 按钮类继承处理带定时器
01.class KeyButton : public QPushButton 02.{ 03. Q_OBJECT 04.public: 05. explicit KeyButto ...
- transform属性
transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度常用的创建transform结构体方法分两大类 (1) 创建“基于控件初始位置”的形变 CGAffin ...
- linux matplotlib入门
python linux matplotlib 安装: sudo apt-get install python-numpy 必须 先安装numpy matplotlib 安装: sudo ap ...