1. 程式人生 > >使用Weave實現Docker多宿主機互聯

使用Weave實現Docker多宿主機互聯

前提:

           之前有關專案的容器都是執行在單臺主機上的由於後期擴充套件增多需要在多臺宿主機上執行不同的分散式應用,所以需要docker的多宿主機互聯技術

實現方法:

一、利用OpenVSwitch
二、利用Weave
三、Docker在1.9之後支援的Overlay network(這個好像是官方的做法)
Docker 1.9 Overlay Network實現跨主機網路互通
四、將多個物理機的容器組到一個物理網路來
1.建立自己的網橋br0
2.將docker預設網橋繫結到br0
多臺物理主機之間的容器互聯
五、修改主機docker預設的虛擬網段,然後在各自主機上分別把對方的docker網段加入到路由表中,配合iptables即可實現docker容器跨主機通訊

個人比較喜歡weave這種方式總體來說配置簡單傳輸穩定可靠下面主要就weave來介紹一下

weave介紹:

Weave是由weaveworks公司開發的解決Docker跨主機網路的解決方案,它能夠建立一個虛擬網路,用於連線部署在多臺主機上的Docker容器,這樣容器就像被接入了同一個網路交換機,那些使用網路的應用程式不必去配置埠對映和連結等資訊。

外部裝置能夠訪問Weave網路上的應用程式容器所提供的服務,同時已有的內部系統也能夠暴露到應用程式容器上。Weave能夠穿透防火牆並執行在部分連線的網路上,另外,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網路。

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

其它技巧

  • 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

重新生成後,記得重啟才會生效喲。