Docker 网络(十一)——Docker Multi-host Network
11 Docker Multi-host NetworkDocker 多主机网络使用基于VXLAN解决方案在libnetwork和libkv库的基础上,所以这个重叠网络需要一个有效的键-值存储服务在不同docker间交换信息。Docker执行内建的在libnetwork库中基于VXLAN重叠网络驱动来支持不同主机间大范围的虚拟网络。环境准备在用Docker重叠网络前,检查docker版本使用do
11 Docker Multi-host Network
Docker 多主机网络使用基于VXLAN解决方案在libnetwork和libkv库的基础上,所以这个重叠网络需要一个有效的键-值存储服务在不同docker间交换信息。Docker执行内建的在libnetwork库中基于VXLAN重叠网络驱动来支持不同主机间大范围的虚拟网络。
环境准备
在用Docker重叠网络前,检查docker版本使用docker -v
来确认docker版本不小于1.9。在这里我们准备的环境有两个Linux节点Node1:192.168.56.10
Node2:192.168.56.20,确保它们可以互相访问,修改两个节点的主机名分别为nod1 nod2 。
下载etcd
$ curl -L https://github.com/coreos/etcd/releases/download/v2.3.6/etcd-v2.3.6-linux-amd64.tar.gz -o etcd-v2.3.6-linux-amd64.tar.gz
$ tar zxvf etcd-v2.3.6-linux-amd64.tar.gz
$ cd etcd-v2.3.6-linux-amd64/
NODE1
./etcd -name node1 -initial-advertise-peer-urls http://192.168.56.10:2380 \
-listen-peer-urls http://0.0.0.0:2380 \
-listen-client-urls http://0.0.0.0:2379,http://127.0.0.1:4001 \
-advertise-client-urls http://0.0.0.0:2379 \
-initial-cluster-token etcd-cluster \
-initial-cluster node1=http://192.168.56.10:2380,node2=http://192.168.56.20:2380 \
-initial-cluster-state new
NODE2
./etcd -name node2 -initial-advertise-peer-urls http://192.168.56.20:2380 \
-listen-peer-urls http://0.0.0.0:2380 \
-listen-client-urls http://0.0.0.0:2379,http://127.0.0.1:4001 \
-advertise-client-urls http://0.0.0.0:2379 \
-initial-cluster-token etcd-cluster \
-initial-cluster node1=http://192.168.56.10:2380,node2=http://192.168.56.20:2380 \
-initial-cluster-state new
带集群参数启动Docker
Docker进程被启动带有集群参数 --cluster-store
和 --cluster-advertise
,因此所有运行在不同节点上的Docker能互相通信与合作。这里我们需要设置
--cluster-store
带有服务主机和端口,--ccluster-advertise
带有IP和本地点Docker进程端口号,停止当前docker进程并带有新的参数启动。
Node1
$ sudo service docker stop
$ sudo /usr/bin/docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.56.10:2379 --cluster-advertise=192.168.56.10:2375
Node2
$ sudo service docker stop
$ sudo /usr/bin/docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.56.20:2379 --cluster-advertise=192.168.56.20:2375
创建重叠网络
在每一个节点上执行 docker network ls
查看Docker的网络配置。
$ docker network ls
NETWORK ID NAME DRIVER
342b9356834a bridge bridge
abacbe015164 host host
286a63691e10 none null
接下来我们使用 docker network
命令来创建一个新的重叠网络
$ sudo docker network create -d overlay myapp
等 一分钟 后我们执行docker network ls
命令
docker network ls
NETWORK ID NAME DRIVER
342b9356834a bridge bridge
d32569139ea9 docker_gwbridge bridge
abacbe015164 host host
7898d5978de9 myapp overlay
286a63691e10 none null
在节点node1和node2上,两个网络 myapp 和 docker_gwbridge 被添加,类型分别是 overlay 和 bridge。因此 myapp 在容器中代表重叠网络关联到eth0,
docker_gwbridge代表桥接网络连接互联网在容器里关联到eth1。
创建带有重叠网络的容器
Node1:
ubuntu@node1:~$ docker run -itd –name=worker1 –net=myapp ubuntu:14.04
Node2:
ubuntu@node2:~$ docker run -itd –name=worker2 –net=myapp ubuntu:14.04
测试两个容器的网络连接
Node1:
ubuntu@node1:~$ docker exec worker1 ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0a:00:00:04
inet addr:10.0.0.4 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe00:4/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
RX packets:14 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1116 (1.1 KB) TX bytes:648 (648.0 B)
eth1 Link encap:Ethernet HWaddr 02:42:ac:12:00:02
inet addr:172.18.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe12:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:648 (648.0 B) TX bytes:648 (648.0 B)
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)
我们可以看到在容器里的两块网卡,IP是10.0.0.4 和 172.18.0.2 。eth0 连接到重叠网络,eth1 连接到 docker_gwbridge。因此在不同主机上的容器可以互相访问 ,在 node2 上运行相同的命令,eth0的ip 是10.0.0.5。
测试在worker1 和 worker2的连接。
ubuntu@node1:~$ docker exec worker1 ping -c4 10.0.0.5
]PING 10.0.0.5 (10.0.0.5) 56(84) bytes of data.
64 bytes from 10.0.0.5: icmp_seq=1 ttl=64 time=0.914 ms
64 bytes from 10.0.0.5: icmp_seq=2 ttl=64 time=0.895 ms
64 bytes from 10.0.0.5: icmp_seq=3 ttl=64 time=0.835 ms
64 bytes from 10.0.0.5: icmp_seq=4 ttl=64 time=0.808 ms
--- 10.0.0.5 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.808/0.863/0.914/0.043 ms
性能测试
在Node1和Node2上测试本地网络性能
$ sudo iperf -c 192.168.56.10
------------------------------------------------------------
Client connecting to 192.168.56.10, TCP port 5001
TCP window size: 2.50 MByte (default)
------------------------------------------------------------
[ 3] local 192.168.56.10 port 45209 connected with 192.168.56.10 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 18.7 GBytes 16.1 Gbits/sec
在容器work1 和work2上测试
root@f8689ceade86:/# iperf -c 10.0.0.5
------------------------------------------------------------
Client connecting to 10.0.0.5, TCP port 5001
TCP window size: 2.50 MByte (default)
------------------------------------------------------------
[ 4] local 10.0.0.5 port 5001 connected with 10.0.0.5 port 55698
[ 3] local 10.0.0.5 port 55698 connected with 10.0.0.5 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 18.3 GBytes 15.7 Gbits/sec
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.0 sec 18.3 GBytes 15.7 Gbits/sec
重叠网络性能比本地网络差一些,比Calico也差一些,Calico跟本地网络性能几乎一样,因为Calico使用一个纯3层协议,Docker多主机重叠网络使用VXLAN解决方案(MAC on UDP),Calico能获得比较好的性能也是有道理的。
VXLAN技术
Virtual Extensible LAN(VXLAN)是一种网络虚拟机技术,试图改进在大的云计算部署中关于可扩展性的问题。它使用类似VLAN的封装技术,封装
基于MAC的OSI二层以太网帧到四层的UDP包中。Open vSwitch实现了VXLAN,Docker是在libnetwork中完成内置的VXLAN驱动。
更多推荐
所有评论(0)