Maorongrong smile like sunshine

Weave


Weave创建一个虚拟网络,用于连接部署在多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序不必去配置端口映射和链接等信息。

目的

利用weave项目实现跨主机同一子网运行同服务容器互访,不同网段容器隔离的网络

参考

重要参考:如何在 Docker 容器之间设置网络 使用weave实现跨主机容器连接 Docker & Weave实现跨主机容器互联 使用weave管理docker网络

介绍weave

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

deployment.png-67kB

安装

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 同一子网)

图片1.png-58kB

图片2.png-57.6kB

2.Host1上192.168.122.1 与Host2 上192.168.122.3运行ubuntu服务的容器互访测试(192.168.122.0/24 同一子网)

图片3.png-51.9kB

图片4.png-44.6kB

3.(3)Host1上192.168.122.1 与Host2 上192.168.123.4分别运行ubuntu和nginx服务的容器互访测试(192.168.122.0/24 与1492.168.123.0/24 容器在不同子网)

图片5.png-59.9kB

图片6.png-60.4kB

总结

应用分离

    使用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 个赞!


Similar Posts

Comments