抛出问题
上一节使用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容器互连