主要參考天天5分鐘玩轉docker容器技術博客。 記錄下本身的實驗過程。 若是想學習,請直接參考該博客http://www.cnblogs.com/CloudMan6/
Weave建立的虛擬網絡將部署在多個主機上的容器鏈接起來。html
對容器而言,weave就像一個巨大的以太網交換機,全部容器都被接入這個交換機,容器能夠直接通訊,無需nat和端口映射。git
weave的dns模塊使容器能夠經過hostname訪問docker
weave不依賴分佈是數據庫交換網絡信息,每一個主機上只需運行weave組件就能創建起跨主機的容器網絡。數據庫
在實驗機器上執行以下命令網絡
curl -L git.io/weave -o /usr/local/bin/weave chmod a+x /usr/local/bin/weave
host1中執行weave launch,啓動weave相關服務。curl
weave的全部組件以容器運行oop
root@host1:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e6c28480e461 weaveworks/weave:2.3.0 "/home/weave/weaver ?? 4 seconds ago Up 4 seconds weave
weave會建立一個新的docker網絡weave學習
root@host1:~# docker network ls NETWORK ID NAME DRIVER SCOPE 810c1c359ba2 bridge bridge local 1085e045479e host host local 8a7c9f8a4f9f none null local 5cdb070956f9 weave weavemesh local
該網絡的詳情url
root@host1:~# docker network inspect 5cdb070956f9|more [ { "Name": "weave", "Id": "5cdb070956f9ce7ef2cdc29fc62cfe55c4128de3283b385de63074276956ff33", "Created": "2018-05-22T22:21:54.904364416+08:00", "Scope": "local", "Driver": "weavemesh", "EnableIPv6": false, "IPAM": { "Driver": "weavemesh", "Options": null, "Config": [ { "Subnet": "10.32.0.0/12" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": { "works.weave.multicast": "true" }, "Labels": {} } ]
在host1中運行容器bbox1rest
root@host1:~# eval $(weave env) root@host1:~# docker run --name bbox1 -itd busybox
首先執行 eval $(weave env) 很重要,其做用是將後續的 docker 命令發給 weave proxy 處理。若是要恢復以前的環境,可執行 eval $(weave env --restore)。
查看一下當前容器bbox1的網絡配置
root@host1:~# docker exec -it bbox1 ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever 14: ethwe@if15: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue link/ether 16:8c:eb:85:98:2c brd ff:ff:ff:ff:ff:ff inet 10.32.0.1/12 brd 10.47.255.255 scope global ethwe valid_lft forever preferred_lft forever
bbox1有兩個網絡接口eth0和ethwe,其中eth0鏈接的是默認bridge網絡,即docker0.
vethwe與vethwepl2516時一對veth pair。
root@host1:~# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242d3efdb74 no veth7fb85fa weave 8000.cebc0b34efc6 no vethwe-bridge vethwepl2516
網絡詳細講解可看連接
weave 網絡包含兩個虛擬交換機:Linux bridge weave 和 Open vSwitch datapath,veth pair vethwe-bridge 和 vethwe-datapath 將兩者鏈接在一塊兒。weave 和 datapath 分工不一樣,weave 負責將容器接入 weave 網絡,datapath 負責在主機間 VxLAN 隧道中並收發數據。
在host2上執行以下命令:
weave launch host1_ip
*必須指定host1的ip,這樣host1和host2才能加入到同一個weave網絡
root@host2:~# eval $(weave env) root@host2:~# docker run --name bbox3 -itd busybox
bbox3 能夠ping通bbox1
root@host2:~# docker exec bbox3 ping bbox1 PING bbox1 (10.32.0.1): 56 data bytes 64 bytes from 10.32.0.1: seq=0 ttl=64 time=1.867 ms 64 bytes from 10.32.0.1: seq=1 ttl=64 time=1.345 ms
若是要實現網絡隔離,能夠經過環境變量 WEAVE_CIDR 爲容器分配不一樣 subnet 的 IP