一.weave介绍
Weave是由weaveworks公司开发的解决Docker跨主机网络的解决方案,如今就采用它来实现Docker多宿主机互联的目的,它可以建立一个虚拟网络,用于链接部署在多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序没必要去配置端口映射和连接等信息。git
外部设备可以访问Weave网络上的应用程序容器所提供的服务,同时已有的内部系统也可以暴露到应用程序容器上。Weave可以穿透防火墙并运行在部分链接的网络上,另外,Weave的通讯支持加密,因此用户能够从一个不受信任的网络链接到主机。github
Weave会在主机上建立一个网桥,每个容器经过veth pair链接到该网桥上,同时网桥上有个Weave router的容器与之链接,该router会经过链接在网桥上的接口来抓取网络包(该接口工做在Promiscuous模式)。docker
在每个部署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链接构成,这些链接大部分都会加密。这些链接都是全双工的,而且能够穿越防火墙。ide
Weave优劣势测试
1.Weave优点加密
支持主机间通讯加密。unix
支持container动态加入或者剥离网络。日志
支持跨主机多子网通讯。
2.Weave劣势
只能经过weave launch或者weave connect加入weave网络。
二.建立weave网络
1.环境
安装docker主机两台
主机1:190.168.3.250
主机2:190.168.3.251
2.安装:
wget -O /usr/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
chmod +x /usr/bin/weave
主机1:
weave launch
也能够weave launch --ipalloc-range 192.168.0.0/24指定网段
下来就是本身安装镜像
主机2:
weave launch 190.168.3.250
3.宿主机使用
weave expose 192.168.0.250/24 能够给宿主机添加同容器同一网段的地址
weave hide 192.168.0.250/24 能够删去给宿主机添加的地址
4.容器使用
第一种添加 --net=weave
docker run -it --net=weave --name=test1 busybox sh
这样建立会自动生成weave地址
第二种将环境变量写入配置文件
[root@server1 ~]# weave env
export DOCKER_HOST=unix:///var/run/weave/weave.sock ORIG_DOCKER_HOST=
[root@server1 ~]# export DOCKER_HOST=unix:///var/run/weave/weave.sock
[root@server1 ~]# echo $DOCKER_HOST
将这个环境变量写进source /etc/profile,让docker启动自动链接建立weave地址
启动容器时经过传值的方式固定ip地址
docker run -it --net=weave --name=test1 -e WEAVE_CIDR=192.168.0.10/24 busybox sh
5.dns使用
weave建立起来自带dns
例:host1:
[root@server1 ~]# docker run -d --name c1 -it -e WEAVE_CIDR=192.168.0.11 busybox sh
host2:
[root@server2 ~]# docker run -d --name c2 -it -e WEAVE_CIDR=192.168.0.12 busybox sh
在c1里面 ping c2 是能够ping通的
在我这边的实际工做中,这个没有ping通,先使用weave status 查看dns,并使用如下命令建立能够dns通讯
docker run -d --hostname=test3.weave.local --name c3 -it -e WEAVE_CIDR=192.168.0.13 busybox sh
只有加了.weave.local的主机以前能够经过主机名访问,别的主机能够经过ping test3 来判断dns是否正常,但只能容器之间经过dns访问
注:能够经过在不一样主机的docker中建立相同主机名的容器实现负载均衡
目前线上使用weave 测试环境使用pipework,还比较稳定