今天这里说下Docker跨主机容器间网络通信的另一个工具Weave的使用。当容器分布在多个不同的主机上时,这些容器之间的相互通信变得复杂起来。容器在不同主机之间都使用的是自己的私有IP地址,不同主机的容器之间进行通讯需要将主机的端口映射到容器的端口上,而且IP地址需要使用主机的IP地址。Weave正是为了解决这个问题而出现的,它把不同主机上容器互相连接的网络虚拟成一个类似于本地网络的网络。
如果了解SDN技术或者部署过OpenStack的网络模块(Neutron)的话,这里通过Weave构建的网络与它们比较类似。它是在一个网络的基础上,构建了一层由软件定义的网络层,这个网络看起来就像是一个本地的局域网,但是实际上它的底层通过另一个网络进行通信。这个网络可能会比实际物理局域网的可靠性要差一些,但是从可用性角度来看,它带来了很大的便利性:可以在位于不同位置的节点之间通信,而好像它们在一个地方一样。
Weave介绍
2)服务发现 Weave网络通过在每个节点上启动一个”微型的DNS”服务来实现服务发现。你只需要给你的容器起个名字就可以使用服务发现了,还可以在多个同名的容器上提供负载均衡的功能。
3)不需要额外的集群存储 所有其它的Docker网络插件,包括Docker自带的”overlay”驱动,在你真正能使用它们之间,都需要安装额外的集群存储—-一个像Consul或者Zookeepr那样的中心数据库. 除了安装,维护和管理困难外,甚至Docker主机需要始终与集群存储保持连接,如果你断开了与其的连接,尽管很短暂,你也不能够启动和停止任何容器了。 Weave网络是与Docker网络插件捆绑在一起的,这意味着你可以马上就使用它,而且可以在网络连接出现问题时依旧启动和停止容器。 关于更多Weave Docker插件的介绍,请查看 Weave Network Plugin如何工作.
4)在部分连接情况下进行操作 Weave网络能够在节点间转发流量,它甚至能够在网状网络部分连接的情况下工作。这意味着你可以在混合了传统系统和容器化的应用的环境中使用Weave网络来保持通信。
5)Weave网络很快 Weave网络自动在两个节点之间选择最快的路径,提供接近本地网络的吞吐量和延迟,而且这不需要你的干预。 关于Fast Datapath如何工作请参考 How Fast Datapath Works .
6)组播支持 Weave网络完全支持组播地址和路径。数据可以被发送给一个组播地址,数据的副本可以被自动地广播。
7)NAT 转换 使用Weave网络,部署你的应用—无论是点对点的文件共享,基于ip的voice或者其它应用,你都可以充分利用内置的NAT转换。通过Weave网络,你的app将会是可移值的,容器化的, 加上它对网络标准化的处理,将又会使你少关心一件事。
8)与任何框架集成: Kubernetes, Mesos, Amazon ECS, … 如果你想为所有的框架使用一个工具,Weave网络是一个好的选择。比如: 除了作为Docker插件使用,你还可以将其作为一个Kubernetes插件plugin.你还可以在 Amazon ECS ,Mesos和 Marathon中使用它.
weave网络通信模型
weave通过在docker集群的每个主机上启动虚拟的路由器,将主机作为路由器,形成互联互通的网络拓扑,在此基础上,实现容器的跨主机通
信。其主机网络拓扑参见下图:
实验环境
两台CentOs7.2虚拟机 IP地址 node1 118.190.201.11 node2 118.190.201.12
Weave的安装与启动
所有节点执行如下步骤: 1)直接从github下载二进制文件安装。 [root@linux-node1 ~]# wget -O /usr/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave [root@linux-node1 ~]# chmod a+x /usr/bin/weave 2)启动weave路由器,这个路由器其实也是以容器的形式运行的。(前提是已经启动了docker服务进程) [root@linux-node1 ~]# weave launch [root@linux-node1 ~]# eval $(weave env) ##在node2上启动时传入node1的IP地址,这是使两个docker host连接在一起 [root@linux-node2 ~]# weave launch 118.190.201.11 ##设置环境变量,这样通过docker命令行启动的容器就会自动地连接到weave网络中了。 [root@linux-node2 ~]# eval $(weave env) 3)查看镜像,可以发现上面下载的weave路由容器镜像 [root@linux-node1 ~]# docker images 4)此时会发现有两个网桥,一个是Docker默认生成的,另一个是Weave生成的。 [root@linux-node1 ~]# brctl show #yum安装bridge-utils工具后,就会出现brctl命令 bridge name bridge id STP enabled interfaces docker0 8000.024219ad9851 no vethb808f26 weave 8000.2e1c0e52a09c no vethwe-bridge 查看运行的容器,发现weave路由容器已经自动运行 [root@linux-node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1f6802de8dbb weaveworks/weave:latest "/home/weave/weave..." 23 minutes ago Up 23 minutes weave
##第二种方法 node1: weave launch --ipalloc-range 192.168.0.0/16 docker run -it -d --name node1 --network weave centos /bin/bash docker attach node1 node2: weave launch 118.190.201.11 --ipalloc-range 192.168.0.0/16 docker run -it -d --name node2 --network weave centos /bin/bash docker attach node2
Weave的应用示例
##先使用docker run启动好容器,然后使用weave attach命令给容器绑定IP地址 [root@linux-node2 ~]# docker run -it -d --name=weave-test1 centos /bin/bash [root@linux-node2 ~]# weave attach 192.168.1.2/24 weave-test1 #使用容器名称或容器id都可以;即给weave-test1容器绑定ip为192.168.1.2 192.168.1.2 ##进入启动的容器 [root@linux-node2 ~]# docker exec -it weave-test1 /bin/bash [root@be8cc008d9f1 /]# ifconfig ##yum install -y net-tools eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0 ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 4413 bytes 9790616 (9.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3114 bytes 171242 (167.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ethwe: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1376 inet 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255 ether 0e:6a:92:8b:3d:58 txqueuelen 0 (Ethernet) RX packets 9 bytes 690 (690.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1 bytes 42 (42.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 0 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 在node1机器上启动容器meave-test,容器ip绑定为192.168.1.3 [root@linux-node1 ~]# docker run -it -d --name weave-test centos /bin/bash [root@linux-node1 ~]# weave attach 192.168.1.3/24 weave-test 192.168.1.3 [root@linux-node1 ~]# docker attach weave-test [root@9f80ae04a298 /]# yum install -y net-tools 容器互联 默认情况下,上面在node1和node2两台宿主机上创建的2个容器间都是相互ping不通的。需要使用weave connect命令在两台weave的路由器之间建立连接。 [root@linux-node1 ~]# weave connect 118.190.201.12 ##//连接的是对方宿主机的ip,注意"weave forget ip" z则表示断开这个连接 [root@linux-node2 ~]# weave connect 118.190.201.11 然后进入容器进行互ping
- 转载请注明来源:Docker-使用Weave实现跨主机容器连接
- 本文永久链接地址:https://www.xionghaier.cn/archives/968.html