前面說到了Flannel的部署,今天這裏說下Docker跨主機容器間網絡通訊的另外一個工具Weave的使用。當容器分佈在多個不一樣的主機上時,這些容器之間的相互通訊變得複雜起來。容器在不一樣主機之間都使用的是本身的私有IP地址,不一樣主機的容器之間進行通信須要將主機的端口映射到容器的端口上,並且IP地址須要使用主機的IP地址。Weave正是爲了解決這個問題而出現的,它把不一樣主機上容器互相鏈接的網絡虛擬成一個相似於本地網絡的網絡。node
若是瞭解SDN技術或者部署過OpenStack的網絡模塊(Neutron)的話,這裏經過Weave構建的網絡與它們比較相似。它是在一個網絡的基礎上,構建了一層由軟件定義的網絡層,這個網絡看起來就像是一個本地的局域網,可是實際上它的底層經過另外一個網絡進行通訊。這個網絡可能會比實際物理局域網的可靠性要差一些,可是從可用性角度來看,它帶來了很大的便利性:能夠在位於不一樣位置的節點之間通訊,而好像它們在一個地方同樣。也能夠把這種網絡想象成一個相似於***似的東西。git
一. weave介紹
Weave是由weaveworks公司開發的解決Docker跨主機網絡的解決方案,它可以建立一個虛擬網絡,用於鏈接部署在多臺主機上的Docker容器,這樣容器就像被接入了同一個網絡交換機,那些使用網絡的應用程序沒必要去配置端口映射和連接等信息。外部設備可以訪問Weave網絡上的應用程序容器所提供的服務,同時已有的內部系統也可以暴露到應用程序容器上。Weave可以穿透防火牆並運行在部分鏈接的網絡上,另外,Weave的通訊支持加密,因此用戶能夠從一個不受信任的網絡鏈接到主機。github
Weave經過建立虛擬網絡使Docker容器可以跨主機通訊並可以自動相互發現。經過weave網絡,由多個容器構成的基於微服務架構的應用能夠運行在任何地方:主機,多主機,雲上或者數據中心。應用程序使用網絡就好像容器是插在同一個網絡交換機上同樣,不須要配置端口映射,鏈接等。在weave網絡中,使用應用容器提供的服務能夠暴露給外部,而不用管它們運行在何處。相似地,現存的內部系統也能夠接受來自於應用容器的請求,而無論容器運行於何處。docker
一個Weave網絡由一系列的'peers'構成----這些weave路由器存在於不一樣的主機上。每一個peer都由一個名字,這個名字在重啓以後保持不變.這個名字便於用戶理解和區分日誌信息。每一個peer在每次運行時都會有一個不一樣的惟一標識符(UID).對於路由器而言,這些標識符不是透明的,儘管名字默認是路由器的MAC地址。數據庫
Weave路由器之間創建起TCP鏈接,經過這個鏈接進行心跳握手和拓撲信息交換,這些鏈接能夠經過配置進行加密。peers之間還會創建UDP鏈接,也能夠進行加密,這些UDP鏈接用於網絡包的封裝,這些鏈接是雙工的並且能夠穿越防火牆。Weave網絡在主機上建立一個網橋,每一個容器經過veth pari鏈接到網橋上,容器由用戶或者weave網絡的IPADM分配IP地址。centos
二. 選擇weave的緣由?
1)無憂的配置
Weave網絡可以簡化容器網絡的配置。由於weave網絡中的容器使用標準的端口提供服務(如,MySQL默認使用3306),管理微服務是十分直接簡單的。
每一個容器均可以經過域名來與另外的容器通訊,也能夠直接通訊而無需使用NAT,也不須要使用端口映射或者複雜的linking.
部署weave容器網絡的最大的好處是無需修改你的應用代碼。 安全
2)服務發現
Weave網絡經過在每一個節點上啓動一個"微型的DNS"服務來實現服務發現。你只須要給你的容器起個名字就可使用服務發現了,還能夠在多個同名的容器上提供負載均衡的功能。bash
3)不須要額外的集羣存儲
全部其它的Docker網絡插件,包括Docker自帶的"overlay"驅動,在你真正能使用它們之間,都須要安裝額外的集羣存儲----一個像Consul或者Zookeepr那樣的中心數據庫. 除了安裝,維護和管理困難外,甚至Docker主機須要始終與集羣存儲保持鏈接,若是你斷開了與其的鏈接,儘管很短暫,你也不可以啓動和中止任何容器了。Weave網絡是與Docker網絡插件捆綁在一塊兒的,這意味着你能夠立刻就使用它,並且能夠在網絡鏈接出現問題時依舊啓動和中止容器。網絡
4)在部分鏈接狀況下進行操做
Weave網絡可以在節點間轉發流量,它甚至可以在網狀網絡部分鏈接的狀況下工做。這意味着你能夠在混合了傳統系統和容器化的應用的環境中使用Weave網絡來保持通訊。架構
5)Weave網絡很快
Weave網絡自動在兩個節點之間選擇最快的路徑,提供接近本地網絡的吞吐量和延遲,並且這不須要你的干預。關於Fast Datapath如何工做請參考 How Fast Datapath Works .
6)組播支持
Weave網絡徹底支持組播地址和路徑。數據能夠被髮送給一個組播地址,數據的副本能夠被自動地廣播。
7)NAT 轉換
使用Weave網絡,部署你的應用---不管是點對點的文件共享,基於ip的voice或者其它應用,你均可以充分利用內置的NAT轉換。經過Weave網絡,你的app將會是可移值的,容器化的,加上它對網絡標準化的處理,將又會使你少關心一件事。
8)與任何框架集成: Kubernetes, Mesos, Amazon ECS, …
若是想爲全部框架使用一個工具,Weave網絡是一個好的選擇。好比: 除了做爲Docker插件使用,你還能夠將其做爲一個Kubernetes插件plugin.你還能夠在 Amazon ECS ,Mesos和Marathon中使用它.
三. 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優點
-> 支持主機間通訊加密。
-> 支持container動態加入或者剝離網絡。
-> 支持跨主機多子網通訊。
Weave劣勢
-> 只能經過weave launch或者weave connect加入weave網絡。
五. 安裝weave
全部節點都須要安裝。Weave不須要集中式的 key-value 存儲,因此安裝和運行都很簡單。直接把Weave二進制文件下載到系統中就能夠了.
[root@localhost ~]# curl -L git.io/weave -o /usr/local/bin/weave % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 595 0 0 152 0 --:--:-- 0:00:03 --:--:-- 1081 100 52227 100 52227 0 0 252 0 0:03:27 0:03:27 --:--:-- 362 [root@localhost ~]# chmod a+x /usr/local/bin/weave 測試是否安裝成功 (前提是要安裝並啓動了docker服務) [root@localhost ~]# weave version weave script 2.5.1 Unable to find image 'weaveworks/weaveexec:2.5.1' locally Trying to pull repository docker.io/weaveworks/weaveexec ... 2.5.1: Pulling from docker.io/weaveworks/weaveexec a073c86ecf9e: Pull complete 950f028f729b: Pull complete d1298aa928c2: Pull complete 1d157c01c74e: Pull complete c458f7a37ca6: Pull complete 49a09e96fcfc: Pull complete 6d57eb599283: Pull complete 259765bea433: Pull complete c11f30d06b58: Pull complete Digest: sha256:ad53aaabf648548ec26cceac3ab49394778322e1623f0d184a2b74ad06338087 Status: Downloaded newer image for docker.io/weaveworks/weaveexec:2.5.1 weave 2.5.1 [root@localhost ~]# weave version weave script 2.5.1 weave 2.5.1 weave version 默認不會下載對應容器, 須要運行"weave launch" 來啓動相關服務 [root@localhost ~]# weave launch ............ [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/weaveworks/weaveexec 2.5.1 4cccd7ef6421 2 months ago 166 MB docker.io/weaveworks/weave 2.5.1 a57b99d67ee7 2 months ago 111 MB docker.io/weaveworks/weavedb latest 4ac51c93545a 5 months ago 698 B [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d4ac34859c88 weaveworks/weave:2.5.1 "/home/weave/weave..." 57 seconds ago Up 56 seconds weave
六. weave網絡通訊模型
weave經過在docker集羣的每一個主機上啓動虛擬路由器,將主機做爲路由器,造成互聯互通的網絡拓撲,在此基礎上,實現容器的跨主機通訊。其主機網絡拓撲參見下圖:
如上圖所示,在每個部署Docker的主機(多是物理機也多是虛擬機)上都部署有一個W(即weave router,它自己也能夠以一個容器的形式部署)。weave網絡是由這些weave routers組成的對等端點(peer)構成,而且能夠經過weave命令行定製網絡拓撲。
每一個部署了weave router的主機之間都會創建TCP和UDP兩個鏈接,保證weave router之間控制面流量和數據面流量的經過。控制面由weave routers之間創建的TCP鏈接構成,經過它進行握手和拓撲關係信息的交換通訊。控制面的通訊能夠被配置爲加密通訊。而數據面由weave routers之間創建的UDP鏈接構成,這些鏈接大部分都會加密。這些鏈接都是全雙工的,而且能夠穿越防火牆。 當容器經過weave進行跨主機通訊時,其網絡通訊模型能夠參考下圖:
從上面的網絡模型圖中能夠看出,對每個weave網絡中的容器,weave都會建立一個網橋,而且在網橋和每一個容器之間建立一個veth pair,一端做爲容器網卡加入到容器的網絡命名空間中,併爲容器網卡配置ip和相應的掩碼,一端鏈接在網橋上,最終經過宿主機上weave router將流量轉發到對端主機上。
其基本過程以下:
1)容器流量經過veth pair到達宿主機上weave router網橋上。
2)weave router在混雜模式下使用pcap在網橋上截獲網絡數據包,並排除由內核直接經過網橋轉發的數據流量,例如本子網內部、本地容器之間的數據以及宿主機和本地容器之間的流量。捕獲的包經過UDP轉發到所其餘主機的weave router端。
3)在接收端,weave router經過pcap將包注入到網橋上的接口,經過網橋的上的veth pair,將流量分發到容器的網卡上。weave默認基於UDP承載容器之間的數據包,而且能夠徹底自定義整個集羣的網絡拓撲,但從性能和使用角度來看,仍是有比較大的缺陷的:
-> weave自定義容器數據包的封包解包方式,不夠通用,傳輸效率比較低,性能上的損失也比較大。
-> 集羣配置比較負載,須要經過weave命令行來手工構建網絡拓撲,在大規模集羣的狀況下,加劇了管理員的負擔。
七. weave的安裝與啓動
1)這裏選擇直接從github下載二進制文件進行安裝。weave下載地址:https://pan.baidu.com/s/15SYNmN2Sf0j9f0z0lHM4og 提取密碼:fkst [root@localhost ~]# wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave [root@localhost ~]# chmod a+x /usr/local/bin/weave 2)啓動weave路由器,這個路由器其實也是以容器的形式運行的。(前提是已經啓動了docker服務進程) [root@localhost ~]# weave launch Unable to find image 'weaveworks/weaveexec:latest' locally Trying to pull repository docker.io/weaveworks/weaveexec ... latest: Pulling from docker.io/weaveworks/weaveexec 79650cf9cc01: Pull complete a0a33a8311d7: Pull complete e95af5f75fa8: Pull complete 7119d296ce72: Pull complete 7f0698aa2117: Pull complete db711cb12a2b: Pull complete ....... 3)查看鏡像,能夠發現上面下載的weave路由容器鏡像 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/weaveworks/weaveexec latest e4870c565dfa 11 hours ago 107.7 MB docker.io/weaveworks/weave latest 70bd2bf0b0eb 11 hours ago 58.22 MB docker.io/weaveworks/weavedb latest 9a4a497119c4 3 months ago 252 B docker.io/centos latest 67591570dd29 5 months ago 191.8 MB 4)此時會發現有兩個網橋,一個是Docker默認生成的,另外一個是Weave生成的。 [root@localhost ~]# brctl show #yum安裝bridge-utils工具後,就會出現brctl命令 bridge name bridge id STP enabled interfaces docker0 8000.0242376456d7 no weave 8000.32298bba31f1 no vethwe-bridge 查看運行的容器,發現weave路由容器已經自動運行 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c5aacecbe40e weaveworks/weave:latest "/home/weave/weaver -" 6 minutes ago Up 6 minutes weave weave關閉 [root@localhost ~]# weave stop 或者直接關閉weave容器 [root@localhost ~]# docker stop weave [root@localhost ~]# docker rm weave weave命令幫助 [root@localhost ~]#weave --help Usage: weave --help | help setup version weave launch [--password <pass>] [--trusted-subnets <cidr>,...] [--host <ip_address>] [--name <mac>] [--nickname <nickname>] [--no-restart] [--resume] [--no-discovery] [--no-dns] [--ipalloc-init <mode>] [--ipalloc-range <cidr> [--ipalloc-default-subnet <cidr>]] [--plugin=false] [--proxy=false] [-H <endpoint>] [--without-dns] [--no-multicast-route] [--no-rewrite-hosts] [--no-default-ipalloc] [--hostname-from-label <labelkey>] [--hostname-match <regexp>] [--hostname-replacement <replacement>] [--rewrite-inspect] [--log-level=debug|info|warning|error] <peer> ... weave prime weave env [--restore] config dns-args weave connect [--replace] [<peer> ...] forget <peer> ... weave attach [--without-dns] [--rewrite-hosts] [--no-multicast-route] [<addr> ...] <container_id> detach [<addr> ...] <container_id> weave expose [<addr> ...] [-h <fqdn>] hide [<addr> ...] weave dns-add [<ip_address> ...] <container_id> [-h <fqdn>] | <ip_address> ... -h <fqdn> dns-remove [<ip_address> ...] <container_id> [-h <fqdn>] | <ip_address> ... -h <fqdn> dns-lookup <unqualified_name> weave status [targets | connections | peers | dns | ipam] report [-f <format>] ps [<container_id> ...] weave stop weave reset [--force] rmpeer <peer_id> ... where <peer> = <ip_address_or_fqdn>[:<port>] <cidr> = <ip_address>/<routing_prefix_length> <addr> = [ip:]<cidr> | net:<cidr> | net:default <endpoint> = [tcp://][<ip_address>]:<port> | [unix://]/path/to/socket <peer_id> = <nickname> | <weave internal peer ID> <mode> = consensus[=<count>] | seed=<mac>,... | observer 接下來就能夠運行應用容器,使用weave提供的網絡功能了。
Weave的應用示例
1)機器環境準備: node-1 103.10.86.238 node-2 103.10.86.239 node-1宿主機上的應用容器my-test1: 192.168.0.2/24 node-2宿主機上的應用容器my-test2: 192.168.0.3/24 兩臺機上均安裝Docker及Weave,並均啓動好Weave路由容器(安裝及啓動操做如上)。最好關閉兩臺機器的防火牆!(若是打開防火牆,須要開放6783端口) 2)在兩臺機上均啓動一個應用容器,有如下兩種方式: 第一種方式:能夠直接使用weave run命令; [root@node-1 ~]# weave run 192.168.0.2/24 -itd docker.io/centos /bin/bash The 'weave run' command has been removed as of Weave Net version 2.0 Please see release notes for further information 由上可知,weave在2.0版本以後就沒有「weave run」這個命令了,因此仍是使用下面的第二種方式 第二種方式:先使用docker run啓動好容器,而後使用weave attach命令給容器綁定IP地址 在node-1機器上啓動第一個容器my-test1,容器ip綁定爲192.168.0.2 [root@node-1 ~]# docker run -itd --name=my-test1 docker.io/centos /bin/bash 06d70049141048798519bfa1292ed81068fc28f1e142a51d22afd8f3fc6d0239 [root@node-1 ~]# weave attach 192.168.0.2/24 my-test1 #使用容器名稱或容器id均可以;即給my-test1容器綁定ip爲192.168.0.2 192.168.0.2 [root@node-1 ~]# docker exec -ti my-test1 /bin/bash [root@00efd39d3a7d /]# ifconfig #執行安裝yum install -y net-tools,就會出現ifconfig命令 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::42:acff:fe11:2 prefixlen 64 scopeid 0x20<link> ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet) RX packets 5559 bytes 11893401 (11.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 5287 bytes 410268 (400.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ethwe: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1376 inet 192.168.0.2 netmask 255.255.255.0 broadcast 0.0.0.0 inet6 fe80::88b0:ddff:fea2:58c5 prefixlen 64 scopeid 0x20<link> ether 8a:b0:dd:a2:58:c5 txqueuelen 0 (Ethernet) RX packets 97 bytes 7234 (7.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 66 bytes 4316 (4.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 21 bytes 2352 (2.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 21 bytes 2352 (2.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 在node-2機器上啓動容器my-test2,容器ip綁定爲192.168.0.3 [root@node-2 ~]# docker run -itd --name=my-test2 docker.io/centos /bin/bash 8f2ecc2449a0be1f1be2825cb211f275f9adb2109249ab0ff1ced6bbb92dd733 [root@node-2 ~]# weave attach 192.168.0.3/24 my-test2 //weave detach 192.168.0.3/24 my-test2表示刪除這個綁定 192.168.0.3 [root@node-2 ~]# docker exec -ti my-test2 /bin/bash [root@e0ed62d30226 /]# ifconfig //或者ip addr命令查看 ...... ethwe: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1376 inet 192.168.0.3 netmask 255.255.255.0 broadcast 0.0.0.0 inet6 fe80::3064:8fff:fe3c:909a prefixlen 64 scopeid 0x20<link> ether 32:64:8f:3c:90:9a txqueuelen 0 (Ethernet) RX packets 63 bytes 4734 (4.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 34 bytes 2580 (2.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 舒適提示: 上面在docker run啓動容器時,能夠添加--net=none參數,這個表示容器啓動後不使用默認的虛擬網卡docker0自動分配的ip,而是使用weave綁定的ip; 固然也能夠選擇不添加這個參數去啓動容器,這樣,容器啓動後就會有兩個網卡,即兩個ip: 一個是docker0自動分配的ip,這個適用於同主機內的容器間通訊,即同主機的容器使用docker0分配的ip能夠相互通訊;另外一個就是weave網橋綁定的ip。 3)容器互聯 默認狀況下,上面在node-1和node-2兩臺宿主機上建立的2個容器間都是相互ping不通的。須要使用weave connect命令在兩臺weave的路由器之間創建鏈接。 [root@node-1 ~]# weave connect 103.10.86.239 //鏈接的是對方宿主機的ip,注意"weave forget ip" z則表示斷開這個鏈接 而後就會發現,此時位於兩臺不一樣主機上的相同子網段內的容器之間能夠相互ping通了 [root@node-1 ~]# docker exec -ti my-test1 /bin/bash [root@00efd39d3a7d /]# ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=3.27 ms 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.657 ms ..... [root@node-2 ~]# docker exec -ti my-test2 /bin/bash [root@e0ed62d30226 /]# ping 192.168.0.2 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. 64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.453 ms 64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.320 ms ..... 再在node-1上啓動容器my-test3,綁定ip爲192.168.0.8,在node-2上啓動容器my-test4,綁定ip爲192.168.0.10,會發現這四個在同一個子網內的容器都是能夠相互ping通的! 所以:只有兩個能通訊的宿主機作了weave connect操做,則在他們倆上建立並weave attach綁定同網段的容器都是能夠相互之間通訊的! -------------------------------------------------------------------------------------------------------- 再接着啓動與上面不在同一個子網內的容器 node-1上啓動容器my-test4,綁定ip爲192.168.10.10,node-2上啓動容器my-test5,綁定ip爲192.168.10.20 [root@node-1 ~]# docker run -itd --name=my-test5 docker.io/centos /bin/bash 2896b6cad7afcd57d8b9091a020f1837992bade2567752614caf3cb645b6d315 [root@node-1 ~]# weave attach 192.168.10.10/24 my-test5 192.168.10.10 [root@node-1 ~]# docker exec -ti my-test5 /bin/bash [root@2896b6cad7af /]# [root@node-2 ~]# docker run -itd --name=my-test6 docker.io/centos /bin/bash b4627f0a6e657f5dc719c917349ad832e15f360f75d5743b489f8e7e18b7dc2e [root@node-2 ~]# weave attach 192.168.10.20/24 my-test6 192.168.10.20 [root@node-2 ~]# docker exec -ti my-test6 /bin/bash [root@b4627f0a6e65 /]# ping 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. 64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.417 ms 64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.324 ms ...... 會發如今跨主機狀況下,相同子網內的容器是能夠相互通訊的;可是處於不一樣子網的兩個容器是不能互聯的,儘管這兩個容器在同一個主機下也是不能通訊的! 這樣的好處就是:使用不一樣子網進行容器間的網絡隔離了。 -------------------------------------------------------------------------------------------------------- 注意一個細節,在使用weave的時候: 1)若是使用Docker的原生網絡,在容器內部是能夠訪問宿主機以及外部網絡的。也就是說在啓動容器的時候,使用了虛擬網卡docker0分配ip, 這種狀況下,登錄容器後是能夠ping通宿主機ip,而且能夠對外聯網的! 這個時候,在宿主機上是能夠ping通docker0網橋的ip,可是ping不通weave網橋的ip。這個時候可使用 "weave expose 192.168.0.1/24"命令來給weave網橋添加IP,以實現容器與宿主機網絡連通。以下: 默認在node-1和node-2宿主機上是ping不通my-test1容器的weave網橋ip的 [root@node-1 ~]# ping 192.168.0.2 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. ....... [root@node-2 ~]# ping 192.168.0.3 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. ....... 在node-1和node-2兩臺機器上都添加weave網橋的ip [root@node-1 ~]# weave expose 192.168.0.1/24 //注意這裏的192.168.0.1/24是上面my-test一、my-test二、my-test三、my-test4容器的weave網橋的網關地址 [root@node-2 ~]# weave expose 192.168.0.1/24 //weave hide 192.168.0.1/24表示覆蓋/刪除這個設置 而後再在兩臺宿主機上ping上面同網段內的容器,發現均可以ping通了 [root@node-1 ~]# ping 192.168.0.2 PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data. 64 bytes from 192.168.0.2: icmp_seq=4 ttl=64 time=0.391 ms 64 bytes from 192.168.0.2: icmp_seq=5 ttl=64 time=0.363 ms [root@node-2 ~]# ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.391 ms 64 bytes from 192.168.0.3: icmp_seq=5 ttl=64 time=0.363 ms 而後再給另外一網段的容器的weave網橋添加ip(能夠在宿主機上對不一樣網段的容器的weave網橋添加ip) [root@node-1 ~]# weave expose 192.168.10.1/24 [root@node-2 ~]# weave expose 192.168.10.1/24 [root@node-1 ~]# ping 192.168.10.20 PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data. 64 bytes from 192.168.10.20: icmp_seq=1 ttl=64 time=2.50 ms 64 bytes from 192.168.10.20: icmp_seq=2 ttl=64 time=0.318 ms [root@node-2 ~]# ping 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. 64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.335 ms 64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.310 ms 2)若是不適用Docker的原生網絡,即在容器啓動的時候,添加--net=none,這樣容器啓動後,就不會使用docker0網卡分配ip。 這種狀況下,登錄容器後發現不能訪問宿主機以及外部網絡的,而在宿主機上也不能ping通容器ip。 這個時候添加對應容器網段的weave網橋ip,這樣能夠實現容器與宿主機網絡連通。可是,此時在容器內部依然不能訪問外部網絡。 因此說,能夠同時使用Docker的原生網絡和weave網絡來實現容器互聯及容器訪問外網和端口映射。 使用外部網絡及端口映射的時候就使用docker0網橋,須要容器互聯的時候就使用weave網橋。每一個容器分配兩個網卡。
weave的其餘特性
1)應用隔離: 不一樣子網容器之間默認隔離的,即使它們位於同一臺物理機上也相互不通(使用-icc=false關閉容器互通);不一樣物理機之間的容器默認也是隔離的 2)安全性: 能夠經過weave launch -password wEaVe設置一個密碼用於weave peers之間加密通訊 3)查看weave路由狀態:weave ps [root@node-1 ~]# weave ps weave:expose 06:9d:3b:91:3d:f3 192.168.0.1/24 192.168.10.1/24 2896b6cad7af 56:46:8c:14:42:e6 192.168.10.10/24 c9aa381c1203 4a:0d:16:4d:bb:c2 192.168.0.8/24 00efd39d3a7d 8a:b0:dd:a2:58:c5 192.168.0.2/24 [root@node-2 ~]# weave ps weave:expose 26:b8:82:03:ff:24 192.168.0.1/24 192.168.10.1/24 b4627f0a6e65 22:10:c4:b8:87:b3 192.168.10.20/24 61722c59e3a0 d2:d5:34:1e:86:df 192.168.0.10/24 e0ed62d30226 32:64:8f:3c:90:9a 192.168.0.3/24 4)效率 weave 路由經過pcap捕獲包這種方式來完成封裝和解封裝這個過程,效率應該是有問題的。 這個過程當中須要將數據包從內核態拷貝到用戶態,而後按照自定義的格式完成封裝和解封裝。 -------------------------------------------------------------------------------------------------- 在已經關閉了weave(weave stop)後,發現weave網橋信息還在: [root@node-2 ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242b0c9bf2d no weave 8000.22a85b2682a1 no vethwe-bridge [root@node-2 ~]# ifconfig ........ weave: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1376 inet 192.168.100.1 netmask 255.255.255.0 broadcast 0.0.0.0 inet6 fe80::20a8:5bff:fe26:82a1 prefixlen 64 scopeid 0x20<link> ether 22:a8:5b:26:82:a1 txqueuelen 0 (Ethernet) RX packets 57 bytes 3248 (3.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 22 bytes 1460 (1.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 刪除weave網橋信息(其餘ifconfig命令查出的網絡設備刪除的方法相似): [root@node-2 ~]# ip link set dev weave down [root@node-2 ~]# brctl delbr weave [root@node-2 ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242b0c9bf2d no