通过Weave可以简单的实现不同宿主机中容器和容器的连接,也可以让不容宿主机访问容器,使用weave注意,weave需要开放TCP和UDP的6783端口,注:docker允许同一个机器上的容器互通,为了完全隔离,需要在 docker daemon 启动参数添加上 –icc=false 。

使用weave

weave可以用来做一个虚拟的网络,用于不同主机的docker容器连接,Weave是由Zett.io公司开发的,它能够创建一个虚拟网络,用于连接部署在多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序不必去配置端口映射和链接等信息。外部设备能够访问Weave网络上的应用程序容器所提供的服务,同时已有的内部系统也能够暴露到应用程序容器上。Weave能够穿透防火墙并运行在部分连接的网络上,另外,Weave的通信支持加密,所以用户可以从一个不受信任的网络连接到主机。

一台物理机器部署多个docker docker 多主机_一台物理机器部署多个docker

一台物理机器部署多个docker docker 多主机_weave_02

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其他特性

1.应用隔离:不同子网容器之间默认隔离的,即便它们位于同一台物理机上也相互不通;不同物理机之间的容器默认也是隔离的
2.物理机之间容器互通:weave connect $OTHER_HOST
3.动态添加网络:对于不是通过weave启动的容器,可以通过weave attach 10.0.1.1/24 $id来添加网络(detach删除网络)
4.安全性:可以通过weave launch -password wEaVe设置一个密码用于weave peers之间加密通信
5.与宿主机网络通信:weave expose 10.0.1.102/24,这个IP会配在weave网桥上
6.查看weave路由状态:weave ps
7.通过NAT实现外网访问docker容器

安装weave和使用

安装weave可能会出现一些坑,可以参考我的文章Weave常见问题集合-yellowcong,安装完事后,注意weave是需要6783端口的TCP和UDP协议。

#下载weave
sudo wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave

#添加执行权限
sudo chmod a+x /usr/local/bin/weave

#启动weave,如果没有镜像,他就会去下载weave的镜像
weave launch

#另外一台机器,链接到本机
weave launch 本机ip
weave connect 本机ip  #这是第二种连接方式

#创建容器,在不同的主机上
docker run -it --name=test1 nginx /bin/bash#主机1
docker run -it --name=test2 nginx /bin/bash#主机2

#通过weave让容器互联,指定容器的网段和子网掩码
weave attach 192.168.10.1/24 test1#主机1
weave attach 192.168.10.10/24 test2#主机2

#删除绑定的容器网络
weave detach 192.168.10.10/24 test2

#查看weave状态
weave status

#查看网络管理情况
weave ps

#进入到容器,可以随意的访问weave管理的,同网段所有的容器
docker attach test1 

#我们发现,容器可以访问另一台宿主机的容器数据,然是宿主机不能访问容器
weave expose 192.168.10.10/24

宿主机不能访问容器

我们容器通过weave进行网络管理后,容器间可以相互连接了,但是宿主机却访问不了weave管理的宿主机容器,只有容器才可以访问容器,我们可以给宿主机分配weave管理的ip,让宿主机也在同一网段下,这样宿主机也能访问到容器数据了

#我们发现,容器可以访问另一台宿主机的容器数据,然是宿主机不能访问容器
weave expose 192.168.10.10/24

一台物理机器部署多个docker docker 多主机_weave_03

一台物理机器部署多个docker docker 多主机_weave_04

容器重启问题

每当容器重启后,网络配置就会没了如果使用weave,则就不能再使用docker自带的auto-restart feature(如docker run –restart=always redis),因为weave是在docker之外为容器配置的网络,容器重启的时候docker本身不会做这些事情。因而,还需额外的工具来管理容器的状态(比如systemd, upstart等),这些工具要调用weave命令(weave run/start/attach)来启动容器。

Weave 开机启动(有待研究)

为了便于开机自动启动weave,可以创建一个weave.service:

[Unit] 
 Description=Weave Network 
 Documentation=http://zettio.github.io/weave/ 
 After=docker.service[Service] 
 ExecStartPre=/usr/local/bin/weave launch 
 ExecStart=/usr/bin/docker logs -f weave 
 SuccessExitStatus=2 
 ExecStop=/usr/local/bin/weave stop[Install] 
 WantedBy=multi-user.target