一、概述
由于docker自身还未支持跨主机容器通信,需要借助docker网络开源解决方案
OVS
OpenVSwich即开放式虚拟交换机实现,简称OVS,OVS在云计算领域应用广泛,值得我们去学习使用。
OpenVSwich
OpenVSwich是一种开源软件,通过软件的方式实现二层交换机功能,专门管理多租赁云计算网络环境,提供虚拟网络中的访问策略、网络隔离、流量监控等。
既然是虚拟交换机,自然与传统的物理交换机有着相同的特性,操作中可以按照理解物理交换机的方式去操作,有助于对虚拟交换机的认识。
GRE隧道
GRE即通用路由协议封装,隧道技术是一种封装技术,将网络层协议(如IP)的数据报文进行封装,使这些封装的数据报文能够在另一个网络层协议中传输。可以看作是一个虚拟点到点连接,所以建立隧道时,要配置好隧道源地址和目的地址。
二、基于OVS+GRE的大二层通信
实验环境
操作系统 | 主机 | 主机ip | 容器网段 |
ubuntu-16.04.4-server-amd64 | 主机1 | 172.31.15.168 | 172.17.43.1/24 |
ubuntu-16.04.4-server-amd64 | 主机2 | 172.31.4.143 | 172.17.42.1/24 |
1 | 1 |
示意图
修改Docker0的网络地址
编辑
主机1上的
/etc/docker/daemon.json 文件,添加内容:
1
2 1{ "bip": "172.17.43.1/24" }
2
编辑
主机2上的
/etc/docker/daemon.json 文件,添加内容:
1
2 1{ "bip":"172.17.42.1/24" }
2
重启docker服务
主机1和
主机2上均执行如下命令重启docker服务以使修改后的docker0网段生效
1
2 1systemctl restart docker
2
创建ovs bridge
主机1和
主机2 操作:
安装 openvswitch
1
2 1apt install -y openvswitch-switch
2
创建bro网桥
1
2 1ovs-vsctl add-br br0
2
查看bro网桥
1
2
3
4
5
6
7
8 1root@ubuntu:~# ifconfigbr0
2br0 Link encap:以太网 硬件地址 1e:cc:2c:52:13:42
3 BROADCAST MULTICAST MTU:1500 跃点数:1
4 接收数据包:0 错误:0 丢弃:0 过载:0 帧数:0
5 发送数据包:0 错误:0 丢弃:0 过载:0 载波:0
6 碰撞:0 发送队列长度:1
7 接收字节:0 (0.0 B) 发送字节:0 (0.0 B)
8
设置gre端口
将gre0接口加入到网桥obr0, 远程IP写对端IP(创建一个GRE隧道并添加到网桥中)
主机1 执行:
1
2 1ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre option:remote_ip=172.31.4.143
2
注意:172.31.4.143 是主机2的ip地址。
主机2 执行:
1
2 1ovs-vsctl add-port br0 gre0 -- set Interface gre0 type=gre option:remote_ip=172.31.15.168
2
注意:172.31.15.168 是主机1的ip地址。
主机1和
主机2 操作:
1
2
3
4
5
6
7
8
9 1# 将br0网桥加入docker0网桥
2brctl addif docker0 br0
3# 启动br0网桥
4ip link set dev br0 up
5# 启动docker0网桥
6ip link set dev docker0 up
7# 添加路由条目
8ip route add 172.17.0.0/16 dev docker0
9
注意:由于主机1和主机2的网络掩码为24,因此16位就可以包含这2个网络了。
查看网桥信息
1
2
3
4 1root@ubuntu:~# brctl show
2bridge name bridge id STP enabled interfaces
3docker0 8000.0242f148614e no br0
4
启动容器测试
主机1和
主机2 操作:
1
2 1docker run -itd --name test busybox /bin/sh
2
查看容器信息
主机1 执行:
1
2 1docker inspect test
2
输出:
1
2
3
4
5
6
7 1...
2 "Gateway": "172.17.43.1",
3 "GlobalIPv6Address": "",
4 "GlobalIPv6PrefixLen": 0,
5 "IPAddress": "172.17.43.2",
6...
7
ping 主机2的docker ip
1
2
3
4
5
6
7
8
9 1root@ubuntu:~# ping 172.17.42.2 -c 2
2PING 172.17.42.2 (172.17.42.2) 56(84) bytes of data.
364 bytes from 172.17.42.2: icmp_seq=1 ttl=63 time=0.505 ms
464 bytes from 172.17.42.2: icmp_seq=2 ttl=63 time=0.858 ms
5
6--- 172.17.42.2 ping statistics ---
72 packets transmitted, 2 received, 0% packet loss, time 1000ms
8rtt min/avg/max/mdev = 0.505/0.681/0.858/0.178 ms
9
主机2 执行:
ping 主机1的docker ip
1
2
3
4
5
6
7
8
9 1root@ubuntu:~# ping 172.17.43.2 -c 2
2PING 172.17.43.2 (172.17.43.2) 56(84) bytes of data.
364 bytes from 172.17.43.2: icmp_seq=1 ttl=63 time=1.90 ms
464 bytes from 172.17.43.2: icmp_seq=2 ttl=63 time=0.641 ms
5
6--- 172.17.43.2 ping statistics ---
72 packets transmitted, 2 received, 0% packet loss, time 1002ms
8rtt min/avg/max/mdev = 0.641/1.274/1.907/0.633 ms
9