docker网络学习-weave
主要参考每天5分钟玩转docker容器技术博客。 记录下自己的实验过程。 如果想学习,请直接参考该博客http://www.cnblogs.com/CloudMan6/
概述
Weave创建的虚拟网络将部署在多个主机上的容器连接起来。
对容器而言,weave就像一个巨大的以太网交换机,所有容器都被接入这个交换机,容器可以直接通信,无需nat和端口映射。
weave的dns模块使容器可以通过hostname访问
weave不依赖分布是数据库交换网络信息,每个主机上只需运行weave组件就能建立起跨主机的容器网络。
搭建实验环境
安装部署weave
在实验机器上执行如下命令
curl -L git.io/weave -o /usr/local/bin/weave chmod a+x /usr/local/bin/weave
在host1中启动weave
host1中执行weave launch,启动weave相关服务。
weave的所有组件以容器运行
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
该网络的详情
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中运行容器bbox1
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
weave网络连通性
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