07_docker容器跨宿主机通信方法:Openvswitch

抛出问题

  上一节使用pipework配置容器间通信,每次创建新的容器时,都要使用pipework为新容器配置网络,能不能容器就有网络并且能互相通信呢?下面使用openvswitch来配置网络解决此问题

openvswitch安装

  • 安装依赖
    yum -y install make gcc openssl-devel autoconf automake rpm-build redhat-rpm-config
    yum -y install python-devel openssl-devel kernel-devel kernel-debug-devel libtool wget
    安装2.5.1,有上面这些依赖就行了,但是安装2.7.0,还需要安装以下依赖
    yum install -y python-six selinux-policy-devel

  • 预处理

mkdir -p ~/rpmbuild/SOURCES  
wget http://openvswitch.org/releases/openvswitch-2.7.0.tar.gz  
cp openvswitch-2.7.0.tar.gz ~/rpmbuild/SOURCES/  
tar -zxf openvswitch-2.7.0.tar.gz 
sed 's/openvswitch-kmod, //g' openvswitch-2.7.0/rhel/openvswitch.spec > openvswitch-2.7.0/rhel/openvswitch_no_kmod.spec  
  • 构建rpm包
    rpmbuild -bb --nocheck ~/openvswitch-2.7.0/rhel/openvswitch_no_kmod.spec
    这一步可能需要几分钟

  • 安装
    yum localinstall ~/rpmbuild/RPMS/x86_64/openvswitch-2.7.0-1.x86_64.rpm

  • 启动openvswitch服务
    setenforce 0
    systemctl start openvswitch.service

环境

  • 两台主机
    server1:192.168.175.214
    server1:192.168.175.215

  • 软件版本:
    centos:7.2
    docker版本:1.12.6
    openvswitch :2.7.0

  • 网络配置架构


如上面的步骤,分别在server1和server2上安装openvswitch 。

配置步骤

  • 在server配置ovs bridge 和 路由
      在配置bridge之前需要首先规划好docker ip地址的分配,保证docker容器的ip地址够用。 此安装过程中docker地址分配方式为:
    1. server1 docker : 172.17.1.0 / 24
    2. server2 docker : 172.17.2.0 /24 ,在server1和server2中各自可以同时运行253个docker实例。

  server1 和server2中docker容器ip地址掩码为255.255.255.0 , 因此,server1和server2的ip地址属于不同的网段,他们之间如果要通信,需要配置gateway 。

  • server1配置
      修改/proc/sys/net/ipv4/ip_forward的值为1,运行ip转发。虽然现在修改了此值,但是后边启动服务的时候,ip_forward的值又成了0 或着 这个值不允许通过vim命令直接修改, 可以通过sftp工具,直接替换该文件。

  • 创建网桥kbr0,并删除docker0网桥。

ovs-vsctl add-br obr0  
ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.175.214  
brctl addbr kbr0  
brctl addif kbr0 obr0  
ip link set dev docker0 down  
ip link del dev docker0  
  • 配置kbr0网卡信息:vi /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
  • 配置路由信息: vi /etc/sysconfig/network-scripts/route-eth0 , 用于转发到其它宿主机上docker容器,其中eth0为真实的网卡设备名称,需要根据虚拟机网卡配置(你的机器不一定是eth0)。
172.17.2.0/24 via 192.168.175.215 dev eth0
  1. 在server1上添加路由表,使server1能到达server2定义的172.17.2.0/24网段。
  2. 这个千万不要配错了,意思是告诉server1在172.17.2.0/24网段的ip在192.168.175.215的server2上
  • 重启网络:systemctl restart network.service

    1. 如果重启失败可以通过 cat /var/log/messages | grep network 查看错误日志。
    2. 实际中测试,启动网络不一定有用,需要重启主机
  • server2配置
    server2和server1的配置步骤相同,不同的配置为:

    1. ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.175.215
    2. /etc/sysconfig/network-scripts/ifcfg-kbr0IPADDR=172.17.2.1 GATEWAY=172.17.2.0
    3. /etc/sysconfig/network-scripts/route-eth0172.17.1.0/24 via 192.168.175.214 dev eth0
  • 设置docker容器网桥

    1. 直接修改/etc/systemd/system/docker.service ,添加参数 -b kbr0 , 重启docker服务。
    2. 修改vi /etc/sysconfig/docker文件,在OPTIONS末尾添加-b=kbr0
      我们采用第二种方式如下:
  • 重启docker服务
    systemctl restart docker.service

  • 在server1和server2上分别创建容器
    docker run -itd --name=mycs6 docker.io/guyton/centos6 /bin/bash

测试网络情况

  • 在server1的容器中
    查看网络
[root@c778cae8a2e5 /]# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:01:02  
          inet addr:172.17.1.2  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:acff:fe11:102/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8935 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8790 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:32897635 (31.3 MiB)  TX bytes:480339 (469.0 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

[root@c778cae8a2e5 /]

ping外网

[root@c778cae8a2e5 /]# ping www.baidu.com
PING www.a.shifen.com (163.177.151.110) 56(84) bytes of data.
64 bytes from 163.177.151.110: icmp_seq=1 ttl=127 time=9.32 ms
64 bytes from 163.177.151.110: icmp_seq=2 ttl=127 time=9.54 ms
....

ping 宿主机

[root@c778cae8a2e5 /]# ping 192.168.175.214
PING 192.168.175.214 (192.168.175.214) 56(84) bytes of data.
64 bytes from 192.168.175.214: icmp_seq=1 ttl=64 time=0.373 ms
64 bytes from 192.168.175.214: icmp_seq=2 ttl=64 time=0.121 ms
  • 在server2的容器中
    查看网络
[root@59ce329fee7f /]# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:02:02  
          inet addr:172.17.2.2  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::42:acff:fe11:202/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8913 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8765 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:32831848 (31.3 MiB)  TX bytes:478809 (467.5 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

[root@59ce329fee7f /]#

ping外网

[root@59ce329fee7f /]# ping www.baidu.com
PING www.a.shifen.com (163.177.151.109) 56(84) bytes of data.
64 bytes from 163.177.151.109: icmp_seq=1 ttl=127 time=8.26 ms
64 bytes from 163.177.151.109: icmp_seq=2 ttl=127 time=8.30 ms
......

ping宿主机

[root@59ce329fee7f /]# ping 192.168.175.215
PING 192.168.175.215 (192.168.175.215) 56(84) bytes of data.
64 bytes from 192.168.175.215: icmp_seq=1 ttl=64 time=0.227 ms
64 bytes from 192.168.175.215: icmp_seq=2 ttl=64 time=0.078 ms
......
  • 容器互ping
    在server1上的容器中ping server2中的容器
[root@c778cae8a2e5 /]# ping 172.17.2.2
PING 172.17.2.2 (172.17.2.2) 56(84) bytes of data.
64 bytes from 172.17.2.2: icmp_seq=1 ttl=62 time=1.15 ms
64 bytes from 172.17.2.2: icmp_seq=2 ttl=62 time=0.633 ms
......

在server2上的容器中ping server1中的容器

[root@59ce329fee7f /]# ping 172.17.1.2
PING 172.17.1.2 (172.17.1.2) 56(84) bytes of data.
64 bytes from 172.17.1.2: icmp_seq=1 ttl=62 time=0.329 ms
64 bytes from 172.17.1.2: icmp_seq=2 ttl=62 time=0.618 ms
......

上述证明:容器与容器之间、容器与宿主机、容器与外网都是通的

参考文档

基于openvswitch的不同宿主机docker容器网络互联
OpenvSwitch实现Docker容器跨宿主机互联
利用Openvswitch实现不同物理机中的Docker容器互连

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 很多人可能在项目中已经使用docker很长时间,但是却很少有人知道docker的网络是如何实现的。我应该就算是很多...
    水雨田阅读 1,098评论 0 3
  • 【编者的话】当你在一台主机上成功运行Docker容器后,信心满满地打算将其扩展到多台主机时,却发现前面的尝试只相当...
    SDNLAB阅读 1,023评论 0 6
  • 刚刚收了两封拒信,杜克大学的和莱斯大学的。然后和一个朋友闲聊。他说他把我进康奈尔的消息告诉给另外一个同学了,那同学...
    Richardo92阅读 380评论 1 1
  • 街头漫步,见林荫处长者云集,欢声笑语,笙箫悠扬,其乐融融,不禁感慨良多,摄影以留念,作文以传情,乐在其中也。 洒...
    曹焕甫阅读 212评论 1 1
  • ConstraintLayout已经出来有八百多年了,但是因为平时已经习惯了在XML里手写布局,基本上已经到了不看...
    李汪汪汪侠阅读 313评论 0 0