Docker 网络(十一)——Docker Multi-host Network

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值