这里指的是不同宿主机之间的容器连接
docker网桥实现跨主机连接的网络拓扑图如下:
在同一个docker主机中,docker容器通过虚拟网桥连接(docker0),如果将连接容器的网桥docker0也桥接到宿主机提供的网卡上,将docker0分配的IP地址和宿主机的IP地址设置为同一个网段,就相当于将docker容器和宿主机连接到了一起,这样就可以实现跨主机的docker容器通信。
修改宿主机docker网桥配置(由于本机有网桥br0,所有直接将修改docker配置文件,实现网桥修改):
这里使用docker启动选项:
-b 指定使用宿主机的网桥名
--fixed-cidr 指定对docker容器分配的ip段
[root@localhost system]# vim docker.service ExecStart= ExecStart=/usr/bin/dockerd -b=br0 --fixed-cidr=172.25.11.1/24 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --iptables=true --icc=false [root@localhost system]# systemctl daemon-reload [root@localhost system]# systemctl restart docker.service
测试:(启动一个容器查看IP)
[root@localhost system]# docker start dvt1 [root@localhost system]# docker attach dvt1 root@d153e3ce4b4b:/# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 02:42:ac:19:0b:01 inet addr:172.25.11.1 Bcast:0.0.0.0 Mask:255.255.255.0 inet6 addr: fe80::42:acff:fe19:b01/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)
这里使用kvm新建了一个虚拟主机,ip为172.25.11.25,测试可以ping通,则证明跨主机连接成功
root@d153e3ce4b4b:/# ping 172.25.11.25 PING 172.25.11.25 (172.25.11.25) 56(84) bytes of data. 64 bytes from 172.25.11.25: icmp_seq=1 ttl=64 time=0.213 ms 64 bytes from 172.25.11.25: icmp_seq=2 ttl=64 time=0.186 ms
网桥配置跨主机容器连接的优点:
配置简单,不依赖第三方软件
网桥配置跨主机容器连接的缺点:
容器和主机在同一网段,划分IP需要特别小心
需要网段控制权,在生产环境中不容易实现
不容易管理,兼容性不佳
Open vSwitch是一个高质量、多层虚拟交换机。使用Apache2.0许可协议,旨在通过编程扩展,使庞大的网络自动化(配置、管理、维护),同时还支持标准的管理接口和协议。
网络拓扑如下:
GRE是通用路由协议封装;隧道技术(Tunneling)是一种通过使用互联网络的基础设施在网络之间传递数据的方式。使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。隧道协议将其它协议的数据帧或包重新封装然后通过隧道发送。新的帧头提供路由信息,以便通过互联网传递被封装的负载数据。
具体步骤:
1.在虚拟机中建立ovs网桥
2.添加gre连接
3.配置docker容器虚拟网桥
4.为虚拟网桥添加ovs接口
5.添加不同Docker容器网段路由
Weave是由weaveworks公司开发的解决Docker跨主机网络的解决方案,它能够创建一个虚拟网络,用于连接多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序不必去配置端口映射和链接等信息。
外部设备能够访问Weave网络上的应用程序容器所提供的服务,同时已有的内部系统也能够暴露到应用程序容器上。Weave能够穿透防火墙并运行在部分连接的网络上,另外,Weave的通信支持加密,所以用户可以从一个不受信任的网络连接到主机。
Weave会在主机上创建一个网桥,每一个容器通过 veth pair 连接到该网桥上,同时网桥上有个 Weave router 的容器与之连接,该router会通过连接在网桥上的接口来抓取网络包(该接口工作在Promiscuous模式)。
在每一个部署Docker的主机(可能是物理机也可能是虚拟机)上都部署有一个W(即Weave router),它本身也可以以一个容器的形式部署。Weave run的时候就可以给每个veth的容器端分配一个ip和相应的掩码。veth的网桥这端就是Weave router容器,并在Weave launch的时候分配好ip和掩码。
Weave网络是由这些weave routers组成的对等端点(peer)构成,每个对等的一端都有自己的名字,其中包括一个可读性好的名字用于表示状态和日志的输出,一个唯一标识符用于运行中相互区别,即使重启Docker主机名字也保持不变,这些名字默认是mac地址。
每个部署了Weave router的主机都需要将TCP和UDP的6783端口的防火墙设置打开,保证Weave router之间控制面流量和数据面流量的通过。控制面由weave routers之间建立的TCP连接构成,通过它进行握手和拓扑关系信息的交换通信。 这个通信可以被配置为加密通信。而数据面由Weave routers之间建立的UDP连接构成,这些连接大部分都会加密。这些连接都是全双工的,并且可以穿越防火墙。
对每一个weave网络中的容器,weave都会创建一个网桥,并且在网桥和每个容器之间创建一个veth pair,一端作为容器网卡加入到容器的网络命名空间中,并为容器网卡配置ip和相应的掩码,一端连接在网桥上,最终通过宿主机上weave router将流量转发到对端主机上。
其基本过程如下:
1,容器流量通过veth pair到达宿主机上weave router网桥上。 2,weave router在混杂模式下使用pcap在网桥上截获网络数据包,并排除由内核直接通过网桥转发的数据流量,例如本子网内部、本地容器之间的数据以及宿主机和本地容器之间的流量。捕获的包通过UDP转发到所其他主机的weave router端。 3,在接收端,weave router通过pcap将包注入到网桥上的接口,通过网桥的上的veth pair,将流量分发到容器的网卡上。
weave默认基于UDP承载容器之间的数据包,并且可以完全自定义整个集群的网络拓扑,但从性能和使用角度来看,还是有比较大的缺陷的:
weave自定义容器数据包的封包解包方式,不够通用,传输效率比较低,性能上的损失也比较大。
集群配置比较负载,需要通过weave命令行来手工构建网络拓扑,在大规模集群的情况下,加重了管理员的负担。
Weave优劣势:
Weave优势
支持主机间通信加密。
支持container动态加入或者剥离网络。
支持跨主机多子网通信。
Weave劣势
只能通过weave launch或者weave connect加入weave网络。
安装weave
启动weave(veave launch)
连接不同主机
通过weave启动主机
下载安装weave
[root@localhost docker]# curl -L git.io/weave -o /usr/bin/weave [root@localhost docker]# chmod a+x /usr/bin/weave [root@localhost docker]# weave version weave script 2.3.0 weave 2.3.0
启动weave,weave默认不会下载对应容器,初次运行时会下载容器。
[root@localhost docker]# weave launch 2.3.0: Pulling from weaveworks/weave 88286f41530e: Pull complete ad4e50ed2c08: Pull complete b3f4c952e7c2: Pull complete 5e27cb7f1c2b: Pull complete f9dfb03c1d7b: Pull complete Digest: sha256:02914df933ffd52c6daf8c4ced33e48dad36e4d4fd9e684d5004cd72236ced60 Status: Downloaded newer image for weaveworks/weave:2.3.0 latest: Pulling from weaveworks/weavedb ecb15a45f93b: Pull complete Digest: sha256:7fac063be31d48980361b7020d39ff91493c0bc6c844314b3e71f447bc8dff39 Status: Downloaded newer image for weaveworks/weavedb:latest Unable to find image 'weaveworks/weaveexec:2.3.0' locally 2.3.0: Pulling from weaveworks/weaveexec 88286f41530e: Already exists ad4e50ed2c08: Already exists b3f4c952e7c2: Already exists 5e27cb7f1c2b: Already exists f9dfb03c1d7b: Already exists 21771db04786: Pull complete 5fbda086495f: Pull complete 80427f885b22: Pull complete 0c4698905755: Pull complete Digest: sha256:eb8eb1d83fc58716b20621d397d63737a18f86cbed1fedb1d71671cfc486517b Status: Downloaded newer image for weaveworks/weaveexec:2.3.0 afe02ac7b3654226a09328c8688c8c3e5b6e4226d600dd6120c955ba90537e54 [root@localhost docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES afe02ac7b365 weaveworks/weave:2.3.0 "/home/weave/weave..." 2 minutes ago Up 2 minutes weave [root@localhost docker]# docker images |grep weave weaveworks/weavedb latest b5c2d24a7b71 6 weeks ago 282 B weaveworks/weaveexec 2.3.0 c2030610fb92 6 weeks ago 79.1 MB weaveworks/weave 2.3.0 6b9ea60b76e7 6 weeks ago 61.7 MB
运行结束后,会生成一个运行的容器和两个data-only的容器,和三个镜像
[root@localhost backup]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES afe02ac7b365 weaveworks/weave:2.3.0 "/home/weave/weave..." 13 minutes ago Up 13 minutes weave c42cc69d7cf2 weaveworks/weaveexec:2.3.0 "data-only" 13 minutes ago Created weavevolumes-2.3.0 7ce56150aa56 weaveworks/weavedb:latest "data-only" 13 minutes ago Created weavedb 其中,weave的这些数据是保存在每台机器上分配的名为 weavedb 的容器上的,它是一个 data volume 容器,只负责数据的持久化。
还会生成一个名为weave的虚拟网络设备
[root@localhost backup]# ifconfig weave weave: flags=4163mtu 1376 inet6 fe80::5cec:96ff:fe30:6abc prefixlen 64 scopeid 0x20 ether 5e:ec:96:30:6a:bc txqueuelen 1000 (Ethernet) RX packets 14 bytes 920 (920.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker中也会生成一个使用weave的网桥的自定义网络。
[root@localhost backup]# docker network ls NETWORK ID NAME DRIVER SCOPE f6bdadf61ce7 bridge bridge local 1239bac87642 host host local c0c6d15cdc49 none null local 37c69c2e8a78 weave weavemesh local
使用weave启动一个镜像
weave2.0之后删除了run命令,所以先使用docker run启动好容器,然后使用weave attach命令给容器绑定IP地址
配置宿主机1的容器:
[root@localhost system]# docker run -it --name weave_test ubuntu /bin/bash [root@localhost system]# weave attach 172.25.11.23/24 weave_test Address 172.25.11.23 overlaps with existing route 172.25.11.0/24 on host 172.25.11.23 [root@localhost system]# docker exec -it weave_test /bin/bash //可以看到weave添加了一个网络设备,并绑定了ip地址 root@273bba12b3b9:/# ifconfig ethwe ethwe Link encap:Ethernet HWaddr fe:11:53:ea:3e:ba inet addr:172.25.11.23 Bcast:172.25.11.255 Mask:255.255.255.0 inet6 addr: fe80::fc11:53ff:feea:3eba/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1376 Metric:1 RX packets:12 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:948 (948.0 B) TX bytes:300 (300.0 B)
配置宿主机2的容器:
[root@localhost volumes]# docker run -it --name weave_another ubuntu /bin/bash [root@localhost volumes]# weave attach 172.25.11.112/24 weave_another Address 172.25.11.112 overlaps with existing route 172.25.11.0/24 on host 172.25.11.112 root@44028ad4bdc2:/# ifconfig ethwe ethwe Link encap:Ethernet HWaddr 86:ba:c8:b9:cc:eb inet addr:172.25.11.112 Bcast:172.25.11.255 Mask:255.255.255.0 inet6 addr: fe80::84ba:c8ff:feb9:cceb/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1376 Metric:1 RX packets:12 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:948 (948.0 B) TX bytes:300 (300.0 B)
宿主机1的容器weave_test和宿主机2的容器weave_another可以互相访问,验证如下:
//使用宿主机2的容器对宿主机1的容器进行ping访问 root@44028ad4bdc2:/# ping 172.25.11.23 PING 172.25.11.23 (172.25.11.23) 56(84) bytes of data. 64 bytes from 172.25.11.23: icmp_seq=1 ttl=64 time=0.077 ms ^C --- 172.25.11.23 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.077/0.077/0.077/0.000 ms //同样,使用宿主机1的容器对宿主机2的容器进行ping访问 root@273bba12b3b9:/# ping 172.25.11.112 PING 172.25.11.112 (172.25.11.112) 56(84) bytes of data. 64 bytes from 172.25.11.112: icmp_seq=1 ttl=64 time=0.072 ms 64 bytes from 172.25.11.112: icmp_seq=2 ttl=64 time=0.086 ms ^C --- 172.25.11.112 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.072/0.079/0.086/0.007 ms