• 欢迎访问蜷缩的蜗牛博客 蜷缩的蜗牛
  • 微信搜索: 蜷缩的蜗牛 | 联系站长 kbsonlong@qq.com
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

使用Weave实现Docker多宿主机互联

Docker 蜷缩的蜗牛 3个月前 (06-22) 33次浏览 已收录

Weave 是由 weaveworks 公司开发的解决 Docker 跨主机网络的解决方案,它能够创建一个虚拟网络,用于连接部署在多台主机上的 Docker 容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序不必去配置端口映射和链接等信息。

外部设备能够访问 Weave 网络上的应用程序容器所提供的服务,同时已有的内部系统也能够暴露到应用程序容器上。Weave 能够穿透防火墙并运行在部分连接的网络上,另外,Weave 的通信支持加密,所以用户可以从一个不受信任的网络连接到主机。

项目地址:https://github.com/weaveworks/weave

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 优势
  1. 支持主机间通信加密。
  2. 支持 container 动态加入或者剥离网络。
  3. 支持跨主机多子网通信。
  • Weave 劣势
  1. 只能通过 weave launch 或者 weave connect 加入 weave 网络。

更多 Docker 跨主机方案可以参考「Docker 跨主机通信解决方案探讨」 一文。

Weave 安装配置

环境准备

一共两台机器:两台机器都安装 Weave 和 Docker。

主机名 IP 地址 软件环境
dev-master-01 192.168.2.210 Weave、Docker
dev-node-01 192.168.2.211 Weave、Docker

安装 Weave

主从节点都需要安装。

Weave 不需要集中式的key-value存储,所以安装和运行都很简单。直接把 Weave 二进制文件下载到系统中就可以了。

$ curl -L git.io/weave -o /usr/local/bin/weave
$ chmod a+x /usr/local/bin/weave

测试是否安装成功

$ weave version
weave script 1.9.4
weave router 1.9.4
weave proxy 1.9.4
weave plugin 1.9.4

weave version默认不会下载对应容器,初次运行时会提示容器不存在。你可在运行weave launch后在来验证一下。

初始化 Weave 网络

dev-master-01上初始化 Weave 网络非常的简单,只需运行weave launch命令就行了。这条命令是在容器中运行一个weave router,需要在每台主机上都启用这个服务。该服务需要三个 docker 容器来辅助运行,首次运行时会自动下载相关镜像。另外执行weave launch之前要保证有bridge-utils网桥工具包。

$ apt-get install bridge-utils
$ weave launch

等命令运行结束后,网络就初始化好了。在这个过程中 Weave 会下载并运行以下这三个 docker 容器。

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e6ad8f3d6a5 weaveworks/plugin:1.9.4 "/home/weave/plugin" 29 seconds ago Up 29 seconds weaveplugin
32826b6869b1 weaveworks/weaveexec:1.9.4 "/home/weave/weave..." 30 seconds ago Up 29 seconds weaveproxy
c2c8367fa831 weaveworks/weave:1.9.4 "/home/weave/weave..." 31 seconds ago Up 31 seconds weave

另外还会生成一个名字叫 weave 的网桥,另一个是 Docker 默认生成的。

$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242b3b4de11 no
weave 8000.e27709980978 no vethwe-bridge
ifconfig weave
weave Link encap:Ethernet HWaddr e2:77:09:98:09:78
inet6 addr: fe80::e077:9ff:fe98:978/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1376 Metric:1
RX packets:42 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2640 (2.6 KB) TX bytes:648 (648.0 B)

docker 中也会生成一个使用 weave 的网桥的自定义网络。

$ docker network ls
NETWORK ID NAME DRIVER SCOPE
515a6b8ba17d bridge bridge local
0b703c3d9cb8 host host local
abdb4b9f751c none null local
71cc68f68786 weave weavemesh local

weave 的这些数据是保存在每台机器上分配的名为weavedb的容器上的,它是一个data volume容器,只负责数据的持久化。

$ docker ps
40047c1ff6ca weaveworks/weavedb "data-only" 32 minutes ago Created weavedb

连接不同主机

node 主机需要连接到 master 主机,只需要在weave launch后面跟上 master 主机的 ip 或者 hostname 就行了。两台机器就会自动建立集群,并同步所有需要的信息。

主机dev-node-01连接到主机dev-master-01

dev-node-01的主机上执行:

$ weave launch 192.168.2.210

这个命令相当于在本地启动了weave route,再通过weave connect 192.168.2.210来和 192.168.1.201 的 route 容器建立连接。这样 weave route 就能相互找到 remote 主机。

同样,当命令运行完,机器上会运行三个 weave 有关的容器。

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
63a397f83e3f weaveworks/plugin:1.9.4 "/home/weave/plugin" 3 minutes ago Up 3 minutes weaveplugin
e4cb27a9145e weaveworks/weaveexec:1.9.4 "/home/weave/weave..." 3 minutes ago Up 3 minutes weaveproxy
eef753a60897 weaveworks/weave:1.9.4 "/home/weave/weave..." 3 minutes ago Up 3 minutes weave

运行weave status,可以查看weave的状态信息:

$ weave status

Version: 1.9.4 (up to date; next check at 2017/04/21 13:50:59)

Service: router
Protocol: weave 1..2
Name: 5a:03:e1:1f:10:c3(dev-node-02)
Encryption: disabled
PeerDiscovery: enabled
Targets: 1
Connections: 1 (1 established)
Peers: 2 (with 2 established connections)
TrustedSubnets: none

Service: ipam
Status: ready
Range: 10.32.0.0/12
DefaultSubnet: 10.32.0.0/12

Service: dns
Domain: weave.local.
Upstream: 8.8.8.8, 223.5.5.5
TTL: 1
Entries: 1

Service: proxy
Address: unix:///var/run/weave/weave.sock

Service: plugin
DriverName: weave

使用 Weave

Weave 有三种方式和 Docker 进行集成,以便运行的容器跑在 Weave 网络中。

  • 使用weave run命令直接运行容器。
  • 使用weave env命令修改DOKCER_HOST环境变量的值,使docker clientweave交互,weavedocker daemon交互,自动为容器配置网络,对用户透明。
  • 使用weave plugin,在运行容器的时候使用--net=weave参数。

使用weave run命令直接运行容器

我们在 dev-master-01 主机上运行一台容器,命名为 c1:

$ weave run  --name c1 -it busybox sh

同样,在 dev-node-01 主机上运行另外一台容器,命名为 c2:

$ weave run  --name c2 -it busybox sh

从 c2 上 ping c1

$ docker exec c2 ping -c 3 c1
PING c1 (10.32.0.1): 56 data bytes
64 bytes from 10.32.0.1: seq=0 ttl=64 time=1.307 ms
64 bytes from 10.32.0.1: seq=1 ttl=64 time=0.600 ms
64 bytes from 10.32.0.1: seq=2 ttl=64 time=0.700 ms
--- c1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.600/0.869/1.307 ms

从 c1 上 ping c2

$ docker exec c1 ping -c 3 c2

PING c2 (10.44.0.0): 56 data bytes
64 bytes from 10.44.0.0: seq=0 ttl=64 time=0.401 ms
64 bytes from 10.44.0.0: seq=1 ttl=64 time=0.538 ms
64 bytes from 10.44.0.0: seq=2 ttl=64 time=0.891 ms

--- c2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.401/0.610/0.891 ms

发现网络是联通的,说明 weave 正确配置,并实现了跨主机的容器通信。

Weave 不会修改docker现有的网络配置,而是在容器中添加额外的虚拟网卡来搭建自己的网络。

/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:00:02:02
inet addr:10.0.2.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe00:202/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:874 (874.0 B) TX bytes:856 (856.0 B)

ethwe Link encap:Ethernet HWaddr D6:66:7E:3E:FC:E5
inet addr:10.32.0.1 Bcast:0.0.0.0 Mask:255.240.0.0
inet6 addr: fe80::d466:7eff:fe3e:fce5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1376 Metric:1
RX packets:26 errors:0 dropped:0 overruns:0 frame:0
TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2052 (2.0 KiB) TX bytes:1404 (1.3 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

使用weave env命令运行容器

$ eval $(weave env)
$ docker run --name c1 -it busybox sh
$ docker run --name c2 -it busybox sh

测试方法和使用weave run命令类似,这里就不展开讲了。

使用weave plugin方式运行容器

$ docker run --net=weave --name c1 -it busybox sh

/ # ping -c 3 10.44.0.0
PING 10.44.0.0 (10.44.0.0): 56 data bytes
64 bytes from 10.44.0.0: seq=0 ttl=64 time=0.511 ms
64 bytes from 10.44.0.0: seq=1 ttl=64 time=0.375 ms
64 bytes from 10.44.0.0: seq=2 ttl=64 time=0.703 ms

--- 10.44.0.0 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.375/0.529/0.703 ms
$ docker run --net=weave --name c2 -it busybox sh

/ # ping -c 3 10.32.0.1
PING 10.32.0.1 (10.32.0.1): 56 data bytes
64 bytes from 10.32.0.1: seq=0 ttl=64 time=0.551 ms
64 bytes from 10.32.0.1: seq=1 ttl=64 time=0.710 ms
64 bytes from 10.32.0.1: seq=2 ttl=64 time=0.556 ms

--- 10.32.0.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.551/0.605/0.710 ms

默认情况下不会使用 weave 的 DNS,故不能用容器名进行访问。如果要使用容器主机名,可按以下方法:

$ docker run --net=weave -h c1.weave.local $(weave dns-args) -ti busybox sh

/ # ping -c3 c2
PING c2 (10.44.0.0): 56 data bytes
64 bytes from 10.44.0.0: seq=0 ttl=64 time=0.472 ms
64 bytes from 10.44.0.0: seq=1 ttl=64 time=0.391 ms
64 bytes from 10.44.0.0: seq=2 ttl=64 time=0.861 ms

--- c2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.391/0.574/0.861 ms
$ docker run --net=weave -h c2.weave.local $(weave dns-args) -ti busybox sh

/ # ping c1
PING c1 (10.32.0.1): 56 data bytes
64 bytes from 10.32.0.1: seq=0 ttl=64 time=1.700 ms
64 bytes from 10.32.0.1: seq=1 ttl=64 time=0.784 ms
64 bytes from 10.32.0.1: seq=2 ttl=64 time=0.485 ms
^C
--- c1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.485/0.989/1.700 ms
/ # ping -c3 c1
PING c1 (10.32.0.1): 56 data bytes
64 bytes from 10.32.0.1: seq=0 ttl=64 time=0.677 ms
64 bytes from 10.32.0.1: seq=1 ttl=64 time=0.405 ms
64 bytes from 10.32.0.1: seq=2 ttl=64 time=0.392 ms

--- c1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.392/0.491/0.677 ms

更多 Weave 插件使用方法可参考:「Integrating Docker via the Network Plugin

其它技巧

  • ip 分配

Weave 会保证容器 ip 都是唯一的,并且自动负责容器 ip 的分配和回收,你不需要配置任何东西就能得到这个好处。如果对分配有特定需求也是可以自定义分配 ip 网段的,比如:在阿里云上部署。

weave 默认使用的网段是10.32.0.0/12,也就是从10.32.0.010.47.255.255。如果这个网段已经被占用,Weave 就会报错,这个时候可以使用--ipalloc-range参数手动指定Weave要使用的网段。

$ weave launch --ipalloc-range 10.60.0.0/12
  • 网络隔离

默认情况下,所有的容器都在同一个子网,不过可以通过--ipalloc-default-subnet指定分配的子网(子网必须在可分配网段里)。

$ weave launch --ipalloc-default-subnet 10.40.0.0/24 192.168.2.210

如果要实现容器网络的隔离,而不是集群中所有容器都能互相访问。Weave 可以使用子网实现这个功能,同一个子网的容器互相连通,而不同的子网中容器是隔离的。

当然,一个容器可以在多个子网中,通过和多个网络里的容器互连 。

$ eval $(weave env)
$ docker run -e WEAVE_CIDR="net:default net:10.32.0.0/24" --name c6 -ti busybox sh

/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:00:05:02
inet addr:10.0.5.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe00:502/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:30 errors:0 dropped:0 overruns:0 frame:0
TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2162 (2.1 KiB) TX bytes:1754 (1.7 KiB)

ethwe Link encap:Ethernet HWaddr F6:B5:89:16:CB:CD
inet addr:10.40.0.128 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::f4b5:89ff:fe16:cbcd/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1376 Metric:1
RX packets:190 errors:0 dropped:0 overruns:0 frame:0
TX packets:182 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:15772 (15.4 KiB) TX bytes:15124 (14.7 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:92 errors:0 dropped:0 overruns:0 frame:0
TX packets:92 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:7728 (7.5 KiB) TX bytes:7728 (7.5 KiB)

由于容器 c6 只允许了自身所在网段和 10.32.0.0/24 网段,故就只能访问到 c1 容器和它自身。不在允许网段的容器 c2 是不能访问的。

/ # ping -c3 c1
PING c1 (10.32.0.1): 56 data bytes
64 bytes from 10.32.0.1: seq=0 ttl=64 time=0.411 ms
64 bytes from 10.32.0.1: seq=1 ttl=64 time=0.393 ms
64 bytes from 10.32.0.1: seq=2 ttl=64 time=0.428 ms

--- c1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.393/0.410/0.428 ms

/ # ping -c3 c6
PING c6 (10.40.0.128): 56 data bytes
64 bytes from 10.40.0.128: seq=0 ttl=64 time=0.051 ms
64 bytes from 10.40.0.128: seq=1 ttl=64 time=0.049 ms
64 bytes from 10.40.0.128: seq=2 ttl=64 time=0.048 ms

--- c6 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.048/0.049/0.051 ms

/ # ping -c3 c2
PING c2 (10.44.0.0): 56 data bytes

--- c2 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss

注:docker 允许同一个机器上的容器互通,为了完全隔离,需要在docker daemon启动参数添加上 --icc=false

  • 控制 ip 的值

有时候需要指定容器的 ip,以下两种方法可以实现。

方法一:通过设置环境变量

$ eval $(weave env)
$ docker run -e WEAVE_CIDR=10.35.1.1/24 --name c3 -it busybox sh

/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:00:02:02
inet addr:10.0.2.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe00:202/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:578 (578.0 B) TX bytes:578 (578.0 B)

ethwe Link encap:Ethernet HWaddr A2:FA:CE:EA:C7:C8
inet addr:10.35.1.1 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::a0fa:ceff:feea:c7c8/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1376 Metric:1
RX packets:7 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:578 (578.0 B) TX bytes:620 (620.0 B)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

方法二:通过weave run命令实现

$ weave run 10.36.1.1/24 --name c4 -it busybox sh
$ docker exec -it c4 sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:00:06:02
inet addr:10.0.6.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe00:602/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:648 (648.0 B) TX bytes:648 (648.0 B)

ethwe Link encap:Ethernet HWaddr CA:C7:BC:1B:A8:DD
inet addr:10.36.1.1 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::c8c7:bcff:fe1b:a8dd/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1376 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:648 (648.0 B) TX bytes:690 (690.0 B)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
  • 动态分配网络

如果在运行容器的时候还不能确定网络,可以使用-e WEAVE_CIDR=none参数先不分配网络信息。

$ eval $(weave env)
$ docker run -e WEAVE_CIDR=none --name c5 -it busybox sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:00:02:02
inet addr:10.0.2.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe00:202/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:578 (578.0 B) TX bytes:578 (578.0 B)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

使用weave attach ${container_id}给运行中的容器分配网络。

$ weave attach b1f7a647aee3
10.32.0.1

$ docker exec -it c5 sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:00:02:02
inet addr:10.0.2.2 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe00:202/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:648 (648.0 B) TX bytes:648 (648.0 B)

ethwe Link encap:Ethernet HWaddr 5A:F9:73:7A:C1:1A
inet addr:10.32.0.1 Bcast:0.0.0.0 Mask:255.240.0.0
inet6 addr: fe80::58f9:73ff:fe7a:c11a/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1376 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:648 (648.0 B) TX bytes:690 (690.0 B)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

如果要把容器从某个网络中移除,可以使用weave detach命令。

$ weave detach net:10.32.0.0/24 b1f7a647aee3
10.32.0.1

常见问题

如果你用虚拟机测试并且多个虚拟机是用同一虚拟机克隆的,所有机器的 machine-id 会是一样的。就会引起不同主机间连接失败,因为每台主机 Weave 网桥上的虚拟网卡分配的 IP 段是一样的。

解决方法如下:

为每台机器重新生成不同的 machine-id:

$ rm /etc/machine-id /var/lib/dbus/machine-id
$ dbus-uuidgen --ensure
$ systemd-machine-id-setup
$ reboot

重新生成后,记得重启才会生效哟。

参考文档

http://www.google.com
http://debugo.com/docker-weave/
http://cizixs.com/2016/06/30/weave-network
https://github.com/weaveworks/weave/issues/2451
https://www.weave.works/docs/net/latest/installing-weave/

本文转载自 使用 Weave 实现 Docker 多宿主机互联


蜷缩的蜗牛 , 版权所有丨如未注明 , 均为原创丨 转载请注明使用 Weave 实现 Docker 多宿主机互联
喜欢 (1)
[]
分享 (0)