主要参考每天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: 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: 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: 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