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

相关推荐