前面说到了Flannel的部署,今天这里说下Docker跨主机容器间网络通讯的另外一个工具Weave的使用。当容器分布在多个不一样的主机上时,这些容器之间的相互通讯变得复杂起来。容器在不一样主机之间都使用的是本身的私有IP地址,不一样主机的容器之间进行通信须要将主机的端口映射到容器的端口上,并且IP地址须要使用主机的IP地址。Weave正是为了解决这个问题而出现的,它把不一样主机上容器互相链接的网络虚拟成一个相似于本地网络的网络。node
若是了解SDN技术或者部署过OpenStack的网络模块(Neutron)的话,这里经过Weave构建的网络与它们比较相似。它是在一个网络的基础上,构建了一层由软件定义的网络层,这个网络看起来就像是一个本地的局域网,可是实际上它的底层经过另外一个网络进行通讯。这个网络可能会比实际物理局域网的可靠性要差一些,可是从可用性角度来看,它带来了很大的便利性:能够在位于不一样位置的节点之间通讯,而好像它们在一个地方同样。也能够把这种网络想象成一个相似于***似的东西。git
一. weave介绍
Weave是由weaveworks公司开发的解决Docker跨主机网络的解决方案,它可以建立一个虚拟网络,用于链接部署在多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序没必要去配置端口映射和连接等信息。外部设备可以访问Weave网络上的应用程序容器所提供的服务,同时已有的内部系统也可以暴露到应用程序容器上。Weave可以穿透防火墙并运行在部分链接的网络上,另外,Weave的通讯支持加密,因此用户能够从一个不受信任的网络链接到主机。github
Weave经过建立虚拟网络使Docker容器可以跨主机通讯并可以自动相互发现。经过weave网络,由多个容器构成的基于微服务架构的应用能够运行在任何地方:主机,多主机,云上或者数据中心。应用程序使用网络就好像容器是插在同一个网络交换机上同样,不须要配置端口映射,链接等。在weave网络中,使用应用容器提供的服务能够暴露给外部,而不用管它们运行在何处。相似地,现存的内部系统也能够接受来自于应用容器的请求,而无论容器运行于何处。docker
一个Weave网络由一系列的'peers'构成----这些weave路由器存在于不一样的主机上。每一个peer都由一个名字,这个名字在重启以后保持不变.这个名字便于用户理解和区分日志信息。每一个peer在每次运行时都会有一个不一样的惟一标识符(UID).对于路由器而言,这些标识符不是透明的,尽管名字默认是路由器的MAC地址。数据库
Weave路由器之间创建起TCP链接,经过这个链接进行心跳握手和拓扑信息交换,这些链接能够经过配置进行加密。peers之间还会创建UDP链接,也能够进行加密,这些UDP链接用于网络包的封装,这些链接是双工的并且能够穿越防火墙。Weave网络在主机上建立一个网桥,每一个容器经过veth pari链接到网桥上,容器由用户或者weave网络的IPADM分配IP地址。centos
二. 选择weave的缘由?
1)无忧的配置
Weave网络可以简化容器网络的配置。由于weave网络中的容器使用标准的端口提供服务(如,MySQL默认使用3306),管理微服务是十分直接简单的。
每一个容器均可以经过域名来与另外的容器通讯,也能够直接通讯而无需使用NAT,也不须要使用端口映射或者复杂的linking.
部署weave容器网络的最大的好处是无需修改你的应用代码。 安全
2)服务发现
Weave网络经过在每一个节点上启动一个"微型的DNS"服务来实现服务发现。你只须要给你的容器起个名字就可使用服务发现了,还能够在多个同名的容器上提供负载均衡的功能。bash
3)不须要额外的集群存储
全部其它的Docker网络插件,包括Docker自带的"overlay"驱动,在你真正能使用它们之间,都须要安装额外的集群存储----一个像Consul或者Zookeepr那样的中心数据库. 除了安装,维护和管理困难外,甚至Docker主机须要始终与集群存储保持链接,若是你断开了与其的链接,尽管很短暂,你也不可以启动和中止任何容器了。Weave网络是与Docker网络插件捆绑在一块儿的,这意味着你能够立刻就使用它,并且能够在网络链接出现问题时依旧启动和中止容器。网络
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实现原理
容器的网络通信都经过route服务和网桥转发。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优点
-> 支持主机间通讯加密。
-> 支持container动态加入或者剥离网络。
-> 支持跨主机多子网通讯。
Weave劣势
-> 只能经过weave launch或者weave connect加入weave网络。
五. 安装weave
全部节点都须要安装。Weave不须要集中式的 key-value 存储,因此安装和运行都很简单。直接把Weave二进制文件下载到系统中就能够了.
[root@localhost ~]# curl -L git.io/weave -o /usr/local/bin/weave % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 595 0 0 152 0 --:--:-- 0:00:03 --:--:-- 1081 100 52227 100 52227 0 0 252 0 0:03:27 0:03:27 --:--:-- 362 [root@localhost ~]# chmod a+x /usr/local/bin/weave 测试是否安装成功 (前提是要安装并启动了docker服务) [root@localhost ~]# weave version weave script 2.5.1 Unable to find image 'weaveworks/weaveexec:2.5.1' locally Trying to pull repository docker.io/weaveworks/weaveexec ... 2.5.1: Pulling from docker.io/weaveworks/weaveexec a073c86ecf9e: Pull complete 950f028f729b: Pull complete d1298aa928c2: Pull complete 1d157c01c74e: Pull complete c458f7a37ca6: Pull complete 49a09e96fcfc: Pull complete 6d57eb599283: Pull complete 259765bea433: Pull complete c11f30d06b58: Pull complete Digest: sha256:ad53aaabf648548ec26cceac3ab49394778322e1623f0d184a2b74ad06338087 Status: Downloaded newer image for docker.io/weaveworks/weaveexec:2.5.1 weave 2.5.1 [root@localhost ~]# weave version weave script 2.5.1 weave 2.5.1 weave version 默认不会下载对应容器, 须要运行"weave launch" 来启动相关服务 [root@localhost ~]# weave launch ............ [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/weaveworks/weaveexec 2.5.1 4cccd7ef6421 2 months ago 166 MB docker.io/weaveworks/weave 2.5.1 a57b99d67ee7 2 months ago 111 MB docker.io/weaveworks/weavedb latest 4ac51c93545a 5 months ago 698 B [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d4ac34859c88 weaveworks/weave:2.5.1 "/home/weave/weave..." 57 seconds ago Up 56 seconds weave
六. weave网络通讯模型
weave经过在docker集群的每一个主机上启动虚拟路由器,将主机做为路由器,造成互联互通的网络拓扑,在此基础上,实现容器的跨主机通讯。其主机网络拓扑参见下图:
如上图所示,在每个部署Docker的主机(多是物理机也多是虚拟机)上都部署有一个W(即weave router,它自己也能够以一个容器的形式部署)。weave网络是由这些weave routers组成的对等端点(peer)构成,而且能够经过weave命令行定制网络拓扑。
每一个部署了weave router的主机之间都会创建TCP和UDP两个链接,保证weave router之间控制面流量和数据面流量的经过。控制面由weave routers之间创建的TCP链接构成,经过它进行握手和拓扑关系信息的交换通讯。控制面的通讯能够被配置为加密通讯。而数据面由weave routers之间创建的UDP链接构成,这些链接大部分都会加密。这些链接都是全双工的,而且能够穿越防火墙。 当容器经过weave进行跨主机通讯时,其网络通讯模型能够参考下图:
从上面的网络模型图中能够看出,对每个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的安装与启动
1)这里选择直接从github下载二进制文件进行安装。weave下载地址:https://pan.baidu.com/s/15SYNmN2Sf0j9f0z0lHM4og 提取密码:fkst [root@localhost ~]# wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave [root@localhost ~]# chmod a+x /usr/local/bin/weave 2)启动weave路由器,这个路由器其实也是以容器的形式运行的。(前提是已经启动了docker服务进程) [root@localhost ~]# weave launch Unable to find image 'weaveworks/weaveexec:latest' locally Trying to pull repository docker.io/weaveworks/weaveexec ... latest: Pulling from docker.io/weaveworks/weaveexec 79650cf9cc01: Pull complete a0a33a8311d7: Pull complete e95af5f75fa8: Pull complete 7119d296ce72: Pull complete 7f0698aa2117: Pull complete db711cb12a2b: Pull complete ....... 3)查看镜像,能够发现上面下载的weave路由容器镜像 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/weaveworks/weaveexec latest e4870c565dfa 11 hours ago 107.7 MB docker.io/weaveworks/weave latest 70bd2bf0b0eb 11 hours ago 58.22 MB docker.io/weaveworks/weavedb latest 9a4a497119c4 3 months ago 252 B docker.io/centos latest 67591570dd29 5 months ago 191.8 MB 4)此时会发现有两个网桥,一个是Docker默认生成的,另外一个是Weave生成的。 [root@localhost ~]# brctl show #yum安装bridge-utils工具后,就会出现brctl命令 bridge name bridge id STP enabled interfaces docker0 8000.0242376456d7 no weave 8000.32298bba31f1 no vethwe-bridge 查看运行的容器,发现weave路由容器已经自动运行 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c5aacecbe40e weaveworks/weave:latest "/home/weave/weaver -" 6 minutes ago Up 6 minutes weave weave关闭 [root@localhost ~]# weave stop 或者直接关闭weave容器 [root@localhost ~]# docker stop weave [root@localhost ~]# docker rm weave weave命令帮助 [root@localhost ~]#weave --help Usage: weave --help | help setup version weave launch [--password <pass>] [--trusted-subnets <cidr>,...] [--host <ip_address>] [--name <mac>] [--nickname <nickname>] [--no-restart] [--resume] [--no-discovery] [--no-dns] [--ipalloc-init <mode>] [--ipalloc-range <cidr> [--ipalloc-default-subnet <cidr>]] [--plugin=false] [--proxy=false] [-H <endpoint>] [--without-dns] [--no-multicast-route] [--no-rewrite-hosts] [--no-default-ipalloc] [--hostname-from-label <labelkey>] [--hostname-match <regexp>] [--hostname-replacement <replacement>] [--rewrite-inspect] [--log-level=debug|info|warning|error] <peer> ... weave prime weave env [--restore] config dns-args weave connect [--replace] [<peer> ...] forget <peer> ... weave attach [--without-dns] [--rewrite-hosts] [--no-multicast-route] [<addr> ...] <container_id> detach [<addr> ...] <container_id> weave expose [<addr> ...] [-h <fqdn>] hide [<addr> ...] weave dns-add [<ip_address> ...] <container_id> [-h <fqdn>] | <ip_address> ... -h <fqdn> dns-remove [<ip_address> ...] <container_id> [-h <fqdn>] | <ip_address> ... -h <fqdn> dns-lookup <unqualified_name> weave status [targets | connections | peers | dns | ipam] report [-f <format>] ps [<container_id> ...] weave stop weave reset [--force] rmpeer <peer_id> ... where <peer> = <ip_address_or_fqdn>[:<port>] <cidr> = <ip_address>/<routing_prefix_length> <addr> = [ip:]<cidr> | net:<cidr> | net:default <endpoint> = [tcp://][<ip_address>]:<port> | [unix://]/path/to/socket <peer_id> = <nickname> | <weave internal peer ID> <mode> = consensus[=<count>] | seed=<mac>,... | observer 接下来就能够运行应用容器,使用weave提供的网络功能了。
Weave的应用示例
1)机器环境准备: node-1 103.10.86.238 node-2 103.10.86.239 node-1宿主机上的应用容器my-test1: 192.168.0.2/24 node-2宿主机上的应用容器my-test2: 192.168.0.3/24 两台机上均安装Docker及Weave,并均启动好Weave路由容器(安装及启动操做如上)。最好关闭两台机器的防火墙!(若是打开防火墙,须要开放6783端口) 2)在两台机上均启动一个应用容器,有如下两种方式: 第一种方式:能够直接使用weave run命令; [root@node-1 ~]# weave run 192.168.0.2/24 -itd docker.io/centos /bin/bash The 'weave run' command has been removed as of Weave Net version 2.0 Please see release notes for further information 由上可知,weave在2.0版本以后就没有“weave run”这个命令了,因此仍是使用下面的第二种方式 第二种方式:先使用docker run启动好容器,而后使用weave attach命令给容器绑定IP地址 在node-1机器上启动第一个容器my-test1,容器ip绑定为192.168.0.2 [root@node-1 ~]# docker run -itd --name=my-test1 docker.io/centos /bin/bash 06d70049141048798519bfa1292ed81068fc28f1e142a51d22afd8f3fc6d0239 [root@node-1 ~]# weave attach 192.168.0.2/24 my-test1 #使用容器名称或容器id均可以;即给my-test1容器绑定ip为192.168.0.2 192.168.0.2 [root@node-1 ~]# docker exec -ti my-test1 /bin/bash [root@00efd39d3a7d /]# ifconfig #执行安装yum install -y net-tools,就会出现ifconfig命令 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::42:acff:fe11:2 prefixlen 64 scopeid 0x20<link> ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 5559 bytes 11893401 (11.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 5287 bytes 410268 (400.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ethwe: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1376 inet 192.168.0.2 netmask 255.255.255.0 broadcast 0.0.0.0 inet6 fe80::88b0:ddff:fea2:58c5 prefixlen 64 scopeid 0x20<link> ether 8a:b0:dd:a2:58:c5 txqueuelen 0 (Ethernet) RX packets 97 bytes 7234 (7.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 66 bytes 4316 (4.2 KiB) 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 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 21 bytes 2352 (2.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 21 bytes 2352 (2.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 在node-2机器上启动容器my-test2,容器ip绑定为192.168.0.3 [root@node-2 ~]# docker run -itd --name=my-test2 docker.io/centos /bin/bash 8f2ecc2449a0be1f1be2825cb211f275f9adb2109249ab0ff1ced6bbb92dd733 [root@node-2 ~]# weave attach 192.168.0.3/24 my-test2 //weave detach 192.168.0.3/24 my-test2表示删除这个绑定 192.168.0.3 [root@node-2 ~]# docker exec -ti my-test2 /bin/bash [root@e0ed62d30226 /]# ifconfig //或者ip addr命令查看 ...... ethwe: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1376 inet 192.168.0.3 netmask 255.255.255.0 broadcast 0.0.0.0 inet6 fe80::3064:8fff:fe3c:909a prefixlen 64 scopeid 0x20<link> ether 32:64:8f:3c:90:9a txqueuelen 0 (Ethernet) RX packets 63 bytes 4734 (4.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 34 bytes 2580 (2.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 舒适提示: 上面在docker run启动容器时,能够添加--net=none参数,这个表示容器启动后不使用默认的虚拟网卡docker0自动分配的ip,而是使用weave绑定的ip; 固然也能够选择不添加这个参数去启动容器,这样,容器启动后就会有两个网卡,即两个ip: 一个是docker0自动分配的ip,这个适用于同主机内的容器间通讯,即同主机的容器使用docker0分配的ip能够相互通讯;另外一个就是weave网桥绑定的ip。 3)容器互联 默认状况下,上面在node-1和node-2两台宿主机上建立的2个容器间都是相互ping不通的。须要使用weave connect命令在两台weave的路由器之间创建链接。 [root@node-1 ~]# weave connect 103.10.86.239 //链接的是对方宿主机的ip,注意"weave forget ip" z则表示断开这个链接 而后就会发现,此时位于两台不一样主机上的相同子网段内的容器之间能够相互ping通了 [root@node-1 ~]# docker exec -ti my-test1 /bin/bash [root@00efd39d3a7d /]# ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=3.27 ms 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.657 ms ..... [root@node-2 ~]# docker exec -ti my-test2 /bin/bash [root@e0ed62d30226 /]# ping 192.168.0.2 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. 64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.453 ms 64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.320 ms ..... 再在node-1上启动容器my-test3,绑定ip为192.168.0.8,在node-2上启动容器my-test4,绑定ip为192.168.0.10,会发现这四个在同一个子网内的容器都是能够相互ping通的! 所以:只有两个能通讯的宿主机作了weave connect操做,则在他们俩上建立并weave attach绑定同网段的容器都是能够相互之间通讯的! -------------------------------------------------------------------------------------------------------- 再接着启动与上面不在同一个子网内的容器 node-1上启动容器my-test4,绑定ip为192.168.10.10,node-2上启动容器my-test5,绑定ip为192.168.10.20 [root@node-1 ~]# docker run -itd --name=my-test5 docker.io/centos /bin/bash 2896b6cad7afcd57d8b9091a020f1837992bade2567752614caf3cb645b6d315 [root@node-1 ~]# weave attach 192.168.10.10/24 my-test5 192.168.10.10 [root@node-1 ~]# docker exec -ti my-test5 /bin/bash [root@2896b6cad7af /]# [root@node-2 ~]# docker run -itd --name=my-test6 docker.io/centos /bin/bash b4627f0a6e657f5dc719c917349ad832e15f360f75d5743b489f8e7e18b7dc2e [root@node-2 ~]# weave attach 192.168.10.20/24 my-test6 192.168.10.20 [root@node-2 ~]# docker exec -ti my-test6 /bin/bash [root@b4627f0a6e65 /]# ping 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. 64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.417 ms 64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.324 ms ...... 会发如今跨主机状况下,相同子网内的容器是能够相互通讯的;可是处于不一样子网的两个容器是不能互联的,尽管这两个容器在同一个主机下也是不能通讯的! 这样的好处就是:使用不一样子网进行容器间的网络隔离了。 -------------------------------------------------------------------------------------------------------- 注意一个细节,在使用weave的时候: 1)若是使用Docker的原生网络,在容器内部是能够访问宿主机以及外部网络的。也就是说在启动容器的时候,使用了虚拟网卡docker0分配ip, 这种状况下,登录容器后是能够ping通宿主机ip,而且能够对外联网的! 这个时候,在宿主机上是能够ping通docker0网桥的ip,可是ping不通weave网桥的ip。这个时候可使用 "weave expose 192.168.0.1/24"命令来给weave网桥添加IP,以实现容器与宿主机网络连通。以下: 默认在node-1和node-2宿主机上是ping不通my-test1容器的weave网桥ip的 [root@node-1 ~]# ping 192.168.0.2 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. ....... [root@node-2 ~]# ping 192.168.0.3 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. ....... 在node-1和node-2两台机器上都添加weave网桥的ip [root@node-1 ~]# weave expose 192.168.0.1/24 //注意这里的192.168.0.1/24是上面my-test一、my-test二、my-test三、my-test4容器的weave网桥的网关地址 [root@node-2 ~]# weave expose 192.168.0.1/24 //weave hide 192.168.0.1/24表示覆盖/删除这个设置 而后再在两台宿主机上ping上面同网段内的容器,发现均可以ping通了 [root@node-1 ~]# ping 192.168.0.2 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. 64 bytes from 192.168.0.2: icmp_seq=4 ttl=64 time=0.391 ms 64 bytes from 192.168.0.2: icmp_seq=5 ttl=64 time=0.363 ms [root@node-2 ~]# ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.391 ms 64 bytes from 192.168.0.3: icmp_seq=5 ttl=64 time=0.363 ms 而后再给另外一网段的容器的weave网桥添加ip(能够在宿主机上对不一样网段的容器的weave网桥添加ip) [root@node-1 ~]# weave expose 192.168.10.1/24 [root@node-2 ~]# weave expose 192.168.10.1/24 [root@node-1 ~]# ping 192.168.10.20 PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data. 64 bytes from 192.168.10.20: icmp_seq=1 ttl=64 time=2.50 ms 64 bytes from 192.168.10.20: icmp_seq=2 ttl=64 time=0.318 ms [root@node-2 ~]# ping 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. 64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.335 ms 64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.310 ms 2)若是不适用Docker的原生网络,即在容器启动的时候,添加--net=none,这样容器启动后,就不会使用docker0网卡分配ip。 这种状况下,登录容器后发现不能访问宿主机以及外部网络的,而在宿主机上也不能ping通容器ip。 这个时候添加对应容器网段的weave网桥ip,这样能够实现容器与宿主机网络连通。可是,此时在容器内部依然不能访问外部网络。 因此说,能够同时使用Docker的原生网络和weave网络来实现容器互联及容器访问外网和端口映射。 使用外部网络及端口映射的时候就使用docker0网桥,须要容器互联的时候就使用weave网桥。每一个容器分配两个网卡。
weave的其余特性
1)应用隔离: 不一样子网容器之间默认隔离的,即使它们位于同一台物理机上也相互不通(使用-icc=false关闭容器互通);不一样物理机之间的容器默认也是隔离的 2)安全性: 能够经过weave launch -password wEaVe设置一个密码用于weave peers之间加密通讯 3)查看weave路由状态:weave ps [root@node-1 ~]# weave ps weave:expose 06:9d:3b:91:3d:f3 192.168.0.1/24 192.168.10.1/24 2896b6cad7af 56:46:8c:14:42:e6 192.168.10.10/24 c9aa381c1203 4a:0d:16:4d:bb:c2 192.168.0.8/24 00efd39d3a7d 8a:b0:dd:a2:58:c5 192.168.0.2/24 [root@node-2 ~]# weave ps weave:expose 26:b8:82:03:ff:24 192.168.0.1/24 192.168.10.1/24 b4627f0a6e65 22:10:c4:b8:87:b3 192.168.10.20/24 61722c59e3a0 d2:d5:34:1e:86:df 192.168.0.10/24 e0ed62d30226 32:64:8f:3c:90:9a 192.168.0.3/24 4)效率 weave 路由经过pcap捕获包这种方式来完成封装和解封装这个过程,效率应该是有问题的。 这个过程当中须要将数据包从内核态拷贝到用户态,而后按照自定义的格式完成封装和解封装。 -------------------------------------------------------------------------------------------------- 在已经关闭了weave(weave stop)后,发现weave网桥信息还在: [root@node-2 ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242b0c9bf2d no weave 8000.22a85b2682a1 no vethwe-bridge [root@node-2 ~]# ifconfig ........ weave: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1376 inet 192.168.100.1 netmask 255.255.255.0 broadcast 0.0.0.0 inet6 fe80::20a8:5bff:fe26:82a1 prefixlen 64 scopeid 0x20<link> ether 22:a8:5b:26:82:a1 txqueuelen 0 (Ethernet) RX packets 57 bytes 3248 (3.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 22 bytes 1460 (1.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 删除weave网桥信息(其余ifconfig命令查出的网络设备删除的方法相似): [root@node-2 ~]# ip link set dev weave down [root@node-2 ~]# brctl delbr weave [root@node-2 ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242b0c9bf2d no