07_docker容器跨宿主機(jī)通信方法:Openvswitch

拋出問題

??上一節(jié)使用pipework配置容器間通信,每次創(chuàng)建新的容器時(shí),都要使用pipework為新容器配置網(wǎng)絡(luò),能不能容器就有網(wǎng)絡(luò)并且能互相通信呢?下面使用openvswitch來配置網(wǎng)絡(luò)解決此問題

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

  • 預(yù)處理

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  
  • 構(gòu)建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

  • 啟動(dòng)openvswitch服務(wù)
    setenforce 0
    systemctl start openvswitch.service

環(huán)境

  • 兩臺(tái)主機(jī)
    server1:192.168.175.214
    server1:192.168.175.215

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

  • 網(wǎng)絡(luò)配置架構(gòu)


如上面的步驟,分別在server1和server2上安裝openvswitch 。

配置步驟

  • 在server配置ovs bridge 和 路由
    ??在配置bridge之前需要首先規(guī)劃好docker ip地址的分配,保證docker容器的ip地址夠用。 此安裝過程中docker地址分配方式為:
    1. server1 docker : 172.17.1.0 / 24,
    2. server2 docker : 172.17.2.0 /24 ,在server1和server2中各自可以同時(shí)運(yùn)行253個(gè)docker實(shí)例。

??server1 和server2中docker容器ip地址掩碼為255.255.255.0 , 因此,server1和server2的ip地址屬于不同的網(wǎng)段,他們之間如果要通信,需要配置gateway 。

  • server1配置
    ??修改/proc/sys/net/ipv4/ip_forward的值為1,運(yùn)行ip轉(zhuǎn)發(fā)。雖然現(xiàn)在修改了此值,但是后邊啟動(dòng)服務(wù)的時(shí)候,ip_forward的值又成了0 或著 這個(gè)值不允許通過vim命令直接修改, 可以通過sftp工具,直接替換該文件。

  • 創(chuàng)建網(wǎng)橋kbr0,并刪除docker0網(wǎng)橋。

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網(wǎng)卡信息: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 , 用于轉(zhuǎn)發(fā)到其它宿主機(jī)上docker容器,其中eth0為真實(shí)的網(wǎng)卡設(shè)備名稱,需要根據(jù)虛擬機(jī)網(wǎng)卡配置(你的機(jī)器不一定是eth0)。
172.17.2.0/24 via 192.168.175.215 dev eth0
  1. 在server1上添加路由表,使server1能到達(dá)server2定義的172.17.2.0/24網(wǎng)段。
  2. 這個(gè)千萬不要配錯(cuò)了,意思是告訴server1在172.17.2.0/24網(wǎng)段的ip在192.168.175.215的server2上
  • 重啟網(wǎng)絡(luò):systemctl restart network.service

    1. 如果重啟失敗可以通過 cat /var/log/messages | grep network 查看錯(cuò)誤日志。
    2. 實(shí)際中測試,啟動(dòng)網(wǎng)絡(luò)不一定有用,需要重啟主機(jī)
  • 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
  • 設(shè)置docker容器網(wǎng)橋

    1. 直接修改/etc/systemd/system/docker.service ,添加參數(shù) -b kbr0 , 重啟docker服務(wù)。
    2. 修改vi /etc/sysconfig/docker文件,在OPTIONS末尾添加-b=kbr0
      我們采用第二種方式如下:
  • 重啟docker服務(wù)
    systemctl restart docker.service

  • 在server1和server2上分別創(chuàng)建容器
    docker run -itd --name=mycs6 docker.io/guyton/centos6 /bin/bash

測試網(wǎng)絡(luò)情況

  • 在server1的容器中
    查看網(wǎng)絡(luò)
[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外網(wǎng)

[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 宿主機(jī)

[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的容器中
    查看網(wǎng)絡(luò)
[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外網(wǎng)

[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宿主機(jī)

[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
......

上述證明:容器與容器之間、容器與宿主機(jī)、容器與外網(wǎng)都是通的

參考文檔

基于openvswitch的不同宿主機(jī)docker容器網(wǎng)絡(luò)互聯(lián)
OpenvSwitch實(shí)現(xiàn)Docker容器跨宿主機(jī)互聯(lián)
利用Openvswitch實(shí)現(xiàn)不同物理機(jī)中的Docker容器互連

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 很多人可能在項(xiàng)目中已經(jīng)使用docker很長時(shí)間,但是卻很少有人知道docker的網(wǎng)絡(luò)是如何實(shí)現(xiàn)的。我應(yīng)該就算是很多...
    水雨田閱讀 1,239評論 0 3
  • 【編者的話】當(dāng)你在一臺(tái)主機(jī)上成功運(yùn)行Docker容器后,信心滿滿地打算將其擴(kuò)展到多臺(tái)主機(jī)時(shí),卻發(fā)現(xiàn)前面的嘗試只相當(dāng)...
    SDNLAB閱讀 1,143評論 0 6
  • 剛剛收了兩封拒信,杜克大學(xué)的和萊斯大學(xué)的。然后和一個(gè)朋友閑聊。他說他把我進(jìn)康奈爾的消息告訴給另外一個(gè)同學(xué)了,那同學(xué)...
    Richardo92閱讀 478評論 1 1
  • 街頭漫步,見林蔭處長者云集,歡聲笑語,笙簫悠揚(yáng),其樂融融,不禁感慨良多,攝影以留念,作文以傳情,樂在其中也。 灑...
    曹煥甫閱讀 271評論 1 1
  • ConstraintLayout已經(jīng)出來有八百多年了,但是因?yàn)槠綍r(shí)已經(jīng)習(xí)慣了在XML里手寫布局,基本上已經(jīng)到了不看...
    李汪汪汪俠閱讀 354評論 0 0

友情鏈接更多精彩內(nèi)容