拋出問題
??上一節使用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地址分配方式為:-
server1 docker : 172.17.1.0 / 24
, -
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
- 在server1上添加路由表,使server1能到達server2定義的
172.17.2.0/24
網段。 - 這個千萬不要配錯了,意思是告訴server1在
172.17.2.0/24
網段的ip在192.168.175.215
的server2上
-
重啟網絡:
systemctl restart network.service
- 如果重啟失敗可以通過
cat /var/log/messages | grep network
查看錯誤日志。 - 實際中測試,啟動網絡不一定有用,需要重啟主機
- 如果重啟失敗可以通過
-
server2配置
server2和server1的配置步驟相同,不同的配置為:ovs-vsctl add-port obr0 gre0 -- set Interface gre0 type=gre options:remote_ip=192.168.175.215
-
/etc/sysconfig/network-scripts/ifcfg-kbr0
中IPADDR=172.17.2.1 GATEWAY=172.17.2.0
-
/etc/sysconfig/network-scripts/route-eth0
中172.17.1.0/24 via 192.168.175.214 dev eth0
-
設置docker容器網橋
- 直接修改/etc/systemd/system/docker.service ,添加參數 -b kbr0 , 重啟docker服務。
- 修改
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容器互連