Weave创建一个虚拟网络,用于连接部署在多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序不必去配置端口映射和链接等信息。
目的
利用weave项目实现跨主机同一子网运行同服务容器互访,不同网段容器隔离的网络
参考
重要参考:如何在 Docker 容器之间设置网络 使用weave实现跨主机容器连接 Docker & Weave实现跨主机容器互联 使用weave管理docker网络
介绍weave
Weave能够创建一个虚拟网络,用于连接部署在多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序不必去配 置端口映射和链接等信息。外部设备能够访问Weave网络上的应用程序容器所提供的服务,同时已有的内部系统也能够暴露到应用程序容器上。Weave能够穿透防火墙并运行在部分连接的网络上,另外,Weave的通信支持加密,所以用户可以从一个不受信任的网络连接到主机。
安装
Weave代码托管在github上
amy@ubuntu-host1:~$ sudo wget -O /usr/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
Connecting to raw.githubusercontent.com .....
.....
Saving to: '/usr/bin/weave'
amy@ubuntu-host1:~$ sudo chmod a+x /usr/bin/weave
amy@ubuntu-host1:~$ sudo weave launch
Unable to find image 'weaveworks/weaveexec:latest' locally
latest:Pulling from weaveworks/weaveexec
511136ea3c5a: Pull complete
...
...
amy@ubuntu-host1:~$ sudo docker ps
[sudo] password for amy:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a526dc13d1c0 weaveworks/weaveexec:latest "/home/weave/weavepro" 2 days ago Up 2 days weaveproxy
2e3bbf35a626 weaveworks/weave:latest "/home/weave/weaver -" 2 days ago Up 2 days weave
6fda3275fed8 weaveworks/plugin:latest "/home/weave/plugin" 3 days ago Up 2 days weaveplugin
到此说明安装已经完成啦。我们来看看:
weave launch,这条命令是在容器中运行一个weave router,需要在每台主机上都启用这个服务。该服务所需的docker镜像weavetools会自动下载。另外,执行weave launch之前要保证有bridge-utils网桥工具包。
amy@ubuntu-host1:~$ sudo brctl show
bridge name bridge id STP enabled interfaces
br0 8000.f2d3cc57d246 no obr0
docker0 8000.02428f170069 no
weave 8000.ea83ede0b878 no vethwe-bridge
配置
实验环境说明
Host1 192.168.22.140 Host2 192.168.22.141 设置不同网段的容器,运行不同的服务 192.168.122.0/24运行ubuntu系统服务的容器 Host1: 192.168.122.1 192.168.122.4 Host2: 192.168.122.2 192.168.122.3 192.168.123.0/24 运行nginx网络服务容器 Host1: 192.168.123.2 Host2: 192.168.123.4 192.168.123.3
1.Host1与Host2分别启动Weave
amy@ubuntu-host1:~$ sudo weave launch
amy@ubuntu-host2:~$ sudo weave launch
amy@ubuntu-host1:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f37859c7189a weaveworks/plugin:latest "/home/weave/plugin" About an hour ago Up About an hour weaveplugin
c1fa7bdd2305 weaveworks/weaveexec:latest "/home/weave/weavepro" About an hour ago Up About an hour weaveproxy
b499452e0fc4 weaveworks/weave:latest "/home/weave/weaver -" About an hour ago Up About an hour weave
2.Host1启动ubuntu/nginx容器
amy@ubuntu-host1:~$ c1=$(sudo weave run 192.168.122.1/24 -ti --name cct1 ubuntu /bin/bash)
amy@ubuntu-host1:~$ c2=$(sudo weave run 192.168.122.4/24 -ti --name cct2 ubuntu /bin/bash)
amy@ubuntu-host1:~$ c3=$(sudo weave run 192.168.123.2/24 -ti --name cct3 nginx_cct:v1)
amy@ubuntu-host1:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2012c01238a2 nginx_cct:v1 "/bin/bash" About an hour ago Up About an hour 80/tcp ct3
b58db1106ef5 ubuntu "/bin/bash" About an hour ago Up About an hour ct2
91eadce62cb4 ubuntu "/bin/bash" About an hour ago Up About an hour ct1
f37859c7189a weaveworks/plugin:latest "/home/weave/plugin" About an hour ago Up About an hour weaveplugin
c1fa7bdd2305 weaveworks/weaveexec:latest "/home/weave/weavepro" About an hour ago Up About an hour weaveproxy
b499452e0fc4 weaveworks/weave:latest "/home/weave/weaver -" About an hour ago Up About an hour weave
3.Host2启动ubuntu/nginx容器
amy@ubuntu-host2:~$ c1=$(sudo weave run 192.168.122.2/24 -ti --name cct1 ubuntu /bin/bash)
amy@ubuntu-host2:~$ c2=$(sudo weave run 192.168.122.3/24 -ti --name cct2 ubuntu /bin/bash)
amy@ubuntu-host2:~$ c3=$(sudo weave run 192.168.123.4/24 -ti --name cct3 nginx_cct:v1)
amy@ubuntu-host2:~$ c4=$(sudo weave run 192.168.123.3/24 -ti --name cct4 nginx_cct:v1)
amy@ubuntu-host2:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a01e9383056 nginx_cct:v1 "/bin/sh -c /bin/bash" About an hour ago Exited (0) 54 minutes ago cct4
914047df5188 nginx_cct:v1 "/bin/sh -c /bin/bash" About an hour ago Up About an hour 80/tcp cct3
fd107ab32d70 ubuntu "/bin/bash" About an hour ago Up About an hour cct2
2cac02cd7fad ubuntu "/bin/bash" About an hour ago Up About an hour cct1
0d154f863555 weaveworks/plugin:latest "/home/weave/plugin" About an hour ago Up About an hour weaveplugin
fb193aeff21e weaveworks/weaveexec:latest "/home/weave/weavepro" About an hour ago Up About an hour weaveproxy
73b4e7cb6225 weaveworks/weave:latest "/home/weave/weaver -" About an hour ago Up About an hour weave
4.两台host上weave路由容器互联
amy@ubuntu-host2:~$ sudo weave connect 192.168.22.140
## $ sudo weave connect <first-host-IP-address>
## 当你查看路由器状态(weave status),你会看到两个 peer 成员:当前宿主机和第一个宿主机。
## 当你开启更多路由器,这个 peer ##成员列表会更长。当你新开一个路由器时,要指定前一个宿主机的IP
## 地址,请注意不是第一个宿主机的 IP 地址(LCTT 译注:链状结构)。
## 现在你已经有了一个 weave 网络了,它由位于不同宿主机的 weave 路由器组成。
### 测试说明
分三种情况测试:
1.Host1上192.168.123.2 与Host2 上192.168.123.4运行nginx服务的容器互访测试(192.168.123.0/24 同一子网)
2.Host1上192.168.122.1 与Host2 上192.168.122.3运行ubuntu服务的容器互访测试(192.168.122.0/24 同一子网)
3.(3)Host1上192.168.122.1 与Host2 上192.168.123.4分别运行ubuntu和nginx服务的容器互访测试(192.168.122.0/24 与1492.168.123.0/24 容器在不同子网)
总结
应用分离
使用weave,可以创建多个虚拟子网,并为每个子网设置不同的应用。比如此实验正为一群容器创建192.168.122.0/24网络运行ubuntu服务,为另一群容器创建192.168.123.0/24网络运行nginx服务。weave会自动维护这些网络,并将这两个子网互相隔离。另外,你可以灵活地将一个容器从一个子网移到另一个子网而不需要重启容器。举个例子:
# 首先开启一个容器,运行在192.168.122.0/24 网络上:
$ sudo weave run 192.168.122.12/24 -ti ubuntu /bin/bash
# 然后让它脱离这个网络:
$ sudo weave detach 192.168.122.12/24 <container-id>
# 最后将它加入到192.168.123.0/24 网络中:
$ sudo weave attach 192.168.123.12/24 <container-id>
将 weave 网络与宿主机网络整合起来
有时候你想让虚拟网络中的容器能访问物理主机的网络。或者相反,宿主机需要访问容器。为满足这个功能,weave 允许虚拟网络与宿主机网络整合。
举个例子,在宿主机hostA上一个容器运行在192.168.122.0/24中,运行使用下面的命令:
hostA:~$ sudo weave expose 192.168.122.100/24
这个命令把IP地192.168.122.100分配给宿主机hostA,这样一来宿主机hostA也连到了192.168.122.0/24网络上。为宿主机选择IP地址的时候,需要选一个没有被其他容器使用的地址。
现在 hostA 就可以访问192.168.122.0/24上的所有容器了,不管这些容器是否位于hostA上。好巧妙的设定啊,32 个赞!