docker基础之六network-2-overlay和macvlan

跨主机的容器网络

跨主机网络方案包括:

1.docker原生的overlay和macvlan

2.第三方方案:

常用的包括flannel/weave/calico

网络方案如何与docker集成在一起:libnetwork && CNM

libnetwork是docker容器网络库,最核心的内容是其定义的container network model,这个模型对容器网络进行了抽象,由一下三类组件组成:

sandbox
sandbox是容器的网络栈,包含容器的interface、路由表和DNS设置。linux network namespace是sandbox的标准实现。sandbox可以包含来自不同network的endpoint

endpoint
endpoint的作用将sandbox接入network。endpoint的典型实现是veth pair,一个endpoint只能属于一个网络,也只能属于一个sandbox

network
network包含一组endpoint,同一network的endpoint可以直接通信。network的实现可以是linux bridge/vlan等

 

CNM示例:

 

libnetwork cnm定义了docker容器的网络模型,按照该模型开发出的driver就能与docker daemon协同工作,实现容器网络,

native drivers 包含:none,bridge,overlay,macvlan

remote drivers 包含:flannel,weave,calico,etc

 

libnetwork CNM的实现

1.docker bridge driver

容器环境:

1.俩个network:默认网络bridge和自定义网络my_net2。

2.三个endpoint,由veth pair实现,一端veth***挂载linux bridge上,另一端eth0挂在容器内。

3.三个sandbox,由network namespace实现,每个容器都有自己的sandbox

 

overlay网络

docker提供了overlay driver,可以创建基于vxlan的overlay网络。vxlan可将二层数据封装到udp进行传输,vxlan提供与vlan相同的以太网二层服务,但是拥有更强的扩展性和灵活性。

docker overlay网络需要一个k-v数据库用于保存网络状态信息,包括network,endpoint,ip等。可用软件:consul,etcd,zookeeper

当前环境使用consul

-h, --hostname string Container host name

docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap

页面访问,http://10.1.1.100:8500

nas4和nas5的docker daemon的配置文件/usr/lib/systemd/system/docker.service

--cluster-store=consul://10.1.1.100:8500 --cluster-advertise=ens33:2376

  

--cluster-store=consul://10.1.1.100:8500 指定consul地址
--cluster-advertise=ens33:2376 告知consul自己的连接地址

 

systemctl daemon-reaload
systemctl restart docker

  

nas4和nas5将自动注册到consul数据库中

创建overlay网络

docker network create -d overlay  ov_net1
c2ad1635250ffe3e3c17a08e8ce13ad6ee76b7581653712aa85fa0de39068aa6

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
3ab5c7bc09a5        bridge              bridge              local
d2847ceac9a3        host                host                local
11b44b36f998        none                null                local
c2ad1635250f        ov_net1             overlay             global

  

ov_net1的scope为global,其它网络为local。
在nas4上创建,nas5上也是可见的,因为创建ov_net1时nas4将overlay网络信息存入consul,nas5从consul读取到了新网络的数据。之后会实时同步

docker network inspect ov_net1
[
    {
        "Name": "ov_net1",
        "Id": "c2ad1635250ffe3e3c17a08e8ce13ad6ee76b7581653712aa85fa0de39068aa6",
        "Created": "2019-08-13T17:06:33.782594971+08:00",
        "Scope": "global",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

  

IPAM 指IP Address Management

实验,ov_net1中运行容器并分析网络

在nas4中运行容器bbox1

docker run -itd --name bbox1 --network ov_net1 busybox

docker exec bbox1 ip a
7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 02:42:0a:00:00:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.2/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
10: eth1@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever

docker exec bbox1 ip r
default via 172.18.0.1 dev eth1 
10.0.0.0/24 dev eth0 scope link  src 10.0.0.2 
172.18.0.0/16 dev eth1 scope link  src 172.18.0.2 

  

bbbox1有两个网卡:
eth0 ip为10.0.0.2,连接的是overlay的ov_net1
eth1 ip为172.18.0.2,容器的默认路由是走eth1,

docker会创建一个bridge网络docker_gwbridge,为所有连接到overlay网络的容器提供访问外网的能力

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
3ab5c7bc09a5        bridge              bridge              local
a3e0ded2d587        docker_gwbridge     bridge              local
d2847ceac9a3        host                host                local
11b44b36f998        none                null                local
c2ad1635250f        ov_net1             overlay             global


docker network inspect docker_gwbridge 
[
    {
        "Name": "docker_gwbridge",
        "Id": "a3e0ded2d587f27894be98688efb7cf6a0adb163dd75adcba303b90f23ecec79",
        "Created": "2019-08-13T17:17:37.996698552+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "03c88352b5613833018a591837846954da5c9c67a8cbfb271f185b384e8942dc": {
                "Name": "gateway_7b2ca5aab1af",
                "EndpointID": "c8bc719fb26ff1a24690f5ca0271e3bdff985afbf9ff83fad54f27efd6defb30",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.enable_icc": "false",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.name": "docker_gwbridge"
        },
        "Labels": {}
    }
]

  

由上可看出该docker_gwbridge当前连接的容器就是bbox1(172.18.0.2)

ifconfig docker_gwbridge
docker_gwbridge: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        inet6 fe80::42:46ff:fe34:223d  prefixlen 64  scopeid 0x20<link>
        ether 02:42:46:34:22:3d  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  


此网络的网关就是网桥docker_gwbridge的ip 172.18.0.1,实现访问外网。

验证:

docker exec bbox1 ping www.baidu.com -c 1
PING www.baidu.com (39.156.66.18): 56 data bytes
64 bytes from 39.156.66.18: seq=0 ttl=52 time=10.598 ms

--- www.baidu.com ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 10.598/10.598/10.598 ms

  

验证overlay网络跨主机通信

在nas5中运行bbox2

docker run -itd --name bbox2 --network ov_net1 busybox

[root@nas5 ~]# docker exec -it bbox2 ip r
default via 172.18.0.1 dev eth1 
10.0.0.0/24 dev eth0 scope link  src 10.0.0.3 
172.18.0.0/16 dev eth1 scope link  src 172.18.0.2 

  

bbox2的ip为10.0.0.3,可以直接ping bbox1

[root@nas5 ~]# docker exec -it bbox2 ping bbox1 -c 1
PING bbox1 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=4.900 ms

--- bbox1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 4.900/4.900/4.900 ms

  

结论:overlay网络中容器可以通信,同时docker也实现了dns服务

具体实现:

docker为overlay网络创建一个独立的network namespace,其中会有一个br0,endpoint还是由veth pair实现,一端连接到容器中为eth0,另一端连接到namespace的br0上,

br0除连接所有的endpoint,还会连接一个vxlan设备,用于与其他host建议vxlan tunnel,容器之间通过tunnel通信。

 

要查看overlay网络的namespace,需要先执行ln -s /var/run/docker/netns /var/run/netns,后执行ip netns可以看到nas4和nas5有相同的namespace,(1-c2ad163525)

(2-c2ad163525)

[root@nas4 docker]# ln -s /var/run/docker/netns /var/run/netns
[root@nas4 docker]# ip netns
2c7d5aba687e (id: 1)
1-c2ad163525 (id: 0)

  

这就是ov_net1的namespace,查看namespace中br0上的设备

[root@nas4 docker]# ip netns exec 1-c2ad163525 brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.66ef8919d8cf	no		veth0
							vxlan0

  

查看vxlan0设备的具体配置信息,vni为256

[root@nas4 docker]# ip netns exec 1-c2ad163525 ip -d link show vxlan0
13: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group default 
    link/ether 66:ef:89:19:d8:cf brd ff:ff:ff:ff:ff:ff link-netnsid 0 promiscuity 1 
    vxlan id 256 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 noudpcsum noudp6zerocsumtx noudp6zerocsumrx 
    bridge_slave state forwarding priority 32 cost 100 hairpin off guard off root_block off fastleave off learning on flood on port_id 0x8001 port_no 0x1 designated_port 32769 designated_cost 0 designated_bridge 8000.66:ef:89:19:d8:cf designated_root 8000.66:ef:89:19:d8:cf hold_timer    0.00 message_age_timer    0.00 forward_delay_timer    0.00 topology_change_ack 0 config_pending 0 proxy_arp off proxy_arp_wifi off mcast_router 1 mcast_fast_leave off mcast_flood on addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 


[root@nas5 ~]# ln -s /var/run/docker/netns /var/run/netns
[root@nas5 ~]# ip netns
f7e310e97190 (id: 0)
2-c2ad163525 (id: 1)
[root@nas5 ~]# ip netns exec 2-c2ad163525 brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.1e36689029c4	no		veth0
							vxlan0
[root@nas5 ~]# ip netns exec 2-c2ad163525 ip -d link show vxlan0
13: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group default 
    link/ether 9e:66:28:03:4b:15 brd ff:ff:ff:ff:ff:ff link-netnsid 0 promiscuity 1 
    vxlan id 256 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 noudpcsum noudp6zerocsumtx noudp6zerocsumrx 
    bridge_slave state forwarding priority 32 cost 100 hairpin off guard off root_block off fastleave off learning on flood on port_id 0x8001 port_no 0x1 designated_port 32769 designated_cost 0 designated_bridge 8000.1e:36:68:90:29:c4 designated_root 8000.1e:36:68:90:29:c4 hold_timer    0.00 message_age_timer    0.00 forward_delay_timer    0.00 topology_change_ack 0 config_pending 0 proxy_arp off proxy_arp_wifi off mcast_router 1 mcast_fast_leave off mcast_flood on addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 

  

overlay的隔离特性

不同的overlay网络是相互隔离的

创建第二个overlay网络ov_net2并运行容器bbox3

docker network create -d overlay ov_net2

docker run -itd --name bbox3 --network ov_net2 busybox

  

bbox3分配的地址是10.0.1.2,ping bbox1(10.0.0.2),是不通的

[root@nas5 ~]# docker exec -it bbox3 ip r
default via 172.18.0.1 dev eth1 
10.0.1.0/24 dev eth0 scope link  src 10.0.1.2 
172.18.0.0/16 dev eth1 scope link  src 172.18.0.3 
[root@nas5 ~]# docker exec -it bbox3 ping -c 2 10.0.0.2
PING 10.0.0.2 (10.0.0.2): 56 data bytes

--- 10.0.0.2 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss

  

即使通过docker_gwbridge也不能通信

[root@nas5 ~]# docker exec -it bbox3 ping -c 2 172.18.0.2
PING 172.18.0.2 (172.18.0.2): 56 data bytes

--- 172.18.0.2 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss

  

overlay IPAM

docker 默认为overlay网络分配24位掩码的子网(10.0.x.0/24),所有主机共享这个subnet,容器启动顺序分配IP,也可以通过--subnet指定子网

docker network create -d overlay --subnet 10.22.1.0/24 ov_net3

[root@nas5 ~]# docker network inspect ov_net3 |jq ".[0].IPAM.Config"
[
  {
    "Subnet": "10.22.1.0/24"
  }
]

  

macvlan网络

支持跨主机容器网络的driver: macvlan

macvlan是linux kernel 模块,功能是允许在同一个物理网卡上配置多个mac地址,即多个interface,每个interface可以配置自己的IP,macvlan本质是一种网卡虚拟化技术

macvlan最大的优点:性能极好,相比其他而言,macvlan不需要创建linux bridge,而是直接通过以太interface连接到物理网络

实验环境准备:

使用nas4和nas5上单独的网卡ens33创建macvlan.

为保证多mac的网络包都可以从ens33通过,需要打开网卡的混杂模式

[root@nas4 ~]# ip link set ens33 promisc on
[root@nas4 ~]# ip a |grep ens33
2: ens33: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 10.1.1.14/24 brd 10.1.1.255 scope global ens33


[root@nas5 ~]# ip link set ens33 promisc on
[root@nas5 ~]# ip a |grep ens33
2: ens33: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 10.1.1.15/24 brd 10.1.1.255 scope global ens33

  

补充:

若virtualbox虚拟机,需要在网卡配置选项页中设置混杂模式
Promiscuous Mode 设置 Allow All

 

在nas4和nas5中创建macvlan网络mac_net1

docker network create -d macvlan \
	--subnet=10.1.1.0/24 \
	--gateway=10.1.1.1 \
	-o parent=ens33 mac_net1

  

注意:
nas4和nas5都执行相同的命令

macvlan网络的local网络,为保证跨主机能够通信,用户需要自己管理ip subnet

docker不会为macvlan创建网关,创建指定的网关需要真实存在,否则容器无法路由

-o parent 指定使用的网络interface

在nas4中创建bbox11

docker run -itd --name bbox11 --ip=10.1.1.111 --network mac_net1  busybox

  

在nas5中创建bbox21

docker run -itd --name bbox21 --ip=10.1.1.121 --network mac_net1  busybox

  


注意:

在nas4和nas5中的mac_net1本质是独立的,为避免ip冲突,最好通过--ip指定地址

验证bbox11和bbox21的连通性

[root@nas4 ~]# docker exec bbox11 ip r
default via 10.1.1.1 dev eth0 
10.1.1.0/24 dev eth0 scope link  src 10.1.1.111 

[root@nas5 ~]# docker exec bbox21 ip r
default via 10.1.1.1 dev eth0 
10.1.1.0/24 dev eth0 scope link  src 10.1.1.121 

[root@nas5 ~]# docker exec bbox21 ping -c 2 10.1.1.111
PING 10.1.1.111 (10.1.1.111): 56 data bytes
64 bytes from 10.1.1.111: seq=0 ttl=64 time=5.410 ms
64 bytes from 10.1.1.111: seq=1 ttl=64 time=0.403 ms

--- 10.1.1.111 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.403/2.906/5.410 ms

[root@nas5 ~]# docker exec bbox21 ping -c 2 bbox11
ping: bad address 'bbox11'

  

现象:

bbox21无法解析bbox11主机名

结论:

docker没有为macvlan提供dns服务。

 

macvlan网络结构分析

查看bbox21的网络设备

[root@nas5 ~]# docker exec bbox21 ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
23: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:0a:01:01:79 brd ff:ff:ff:ff:ff:ff

  

eth0后面的@if2,表明interface有一个对应的interface,全局编号是2,根据macvlan的原理,查看主机nas5的全局为2的网卡就是ens33,

[root@nas5 ~]# ip a |grep '2: '
2: ens33: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
22: vethe583037@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP group default 

  

所以容器的eth0是通过macvlan虚拟出来的interface,容器的interface直接与主机的网卡连接,这种方案使得容器无需nat和端口映射就能与外网直接通信(只要有网关),在网络上与其他独立主机没区别

 

用sub-interface实现多macvlan网络

macvlan会独占主机的网卡,那么一个网卡就只能创建一个macvlan网络,

主机网卡数量有限,为支持更多的macvlan网络,只能将网卡做vlan

 

实验环境准备:

ip link set ens38 promisc on

  

先配置vlan

方法一:命令行

ip link add link ens38 name ens38.10 type vlan id 10
ip address add dev ens38.10 172.16.10.1/24
ip link set ens38.10 up

ip link add link ens38 name ens38.20 type vlan id 20
ip address add dev ens38.20 172.16.20.1/24
ip link set ens38.20 up

  

方法二:配置文件

涉及网卡配置文件ens38、ens38.10、ens38.20
BOOTPROTO=none

另vlan配置文件内,加
VLAN=yes

ens38.10、ens38.20,修改名称
NAME=
DEVICE=

重启network即可

注意:ens38网卡的模式不可以是仅主机模式,当前配置为桥接模式

sub-interface未开混杂模式并未有影响,无需做

ip link set ens38.10 promisc on
ip link set ens38.20 promisc on

  

创建macvlan网络

docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.254 -o parent=ens38.10 mac_net10

docker network create -d macvlan --subnet=172.16.20.0/24 --gateway=172.16.20.254 -o parent=ens38.20 mac_net20

  

在nas4中运行容器

docker run -itd --name bbox1  --ip=172.16.10.10  --network mac_net10  busybox

docker run -itd --name bbox2  --ip=172.16.20.10  --network mac_net20 busybox

  

在nas5中运行容器

docker run -itd --name bbox3  --ip=172.16.10.11  --network mac_net10 busybox

docker run -itd --name bbox4  --ip=172.16.20.11  --network mac_net20 busybox

  

验证macvlan连通性

[root@nas4 ~]# docker exec bbox1 ping -c 2 172.16.10.11
PING 172.16.10.11 (172.16.10.11): 56 data bytes
64 bytes from 172.16.10.11: seq=0 ttl=64 time=5.272 ms
64 bytes from 172.16.10.11: seq=1 ttl=64 time=1.311 ms

--- 172.16.10.11 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.311/3.291/5.272 ms
[root@nas4 ~]# docker exec bbox2 ping -c 2 172.16.20.11
PING 172.16.20.11 (172.16.20.11): 56 data bytes
64 bytes from 172.16.20.11: seq=0 ttl=64 time=5.666 ms
64 bytes from 172.16.20.11: seq=1 ttl=64 time=1.538 ms

--- 172.16.20.11 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.538/3.602/5.666 ms

  

bbox1能ping通bbox3,bbox2能ping通bbox4。即:同一macvlan网络能通信

[root@nas4 ~]# docker exec bbox1 ping -c 2 172.16.20.10
PING 172.16.20.10 (172.16.20.10): 56 data bytes

--- 172.16.20.10 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
[root@nas4 ~]# docker exec bbox1 ping -c 2 172.16.20.11
PING 172.16.20.11 (172.16.20.11): 56 data bytes

--- 172.16.20.11 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss

  

bbox1无法ping通bbox2和bbox4.即:不同macvlan网络之间不能通信。

准确来说:不同macvlan网络不能在二层通信,下面通过配置vm-vpn为虚拟路由器,设置网关并转发vlan10和vlan20。

首先启动操作系统ip_forward

sysctl -w net.ipv4.ip_forward=1

sysctl -a |grep ip_forward
net.ipv4.ip_forward = 1

  

将网关IP配置到sub-interface

ifconfig ens38.10  172.16.10.254 netmask 255.255.255.0 up
ifconfig ens38.20  172.16.20.254 netmask 255.255.255.0 up

  

添加iptables规则,转发不同vlan的数据包

iptables -t nat -A  POSTROUTING -o ens38.10 -j MASQUERADE
iptables -t nat -A  POSTROUTING -o ens38.20 -j MASQUERADE

iptables -A FORWARD -i ens38.10 -o ens38.20 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i ens38.20 -o ens38.10 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A FORWARD -i ens38.10 -o ens38.20 -j ACCEPT
iptables -A FORWARD -i ens38.20 -o ens38.10 -j ACCEPT

  

验证bbox1到bbox2和bbox4的连通性,已经可以通信啦

[root@nas4 ~]# docker exec bbox1 ping -c 2 172.16.20.10
PING 172.16.20.10 (172.16.20.10): 56 data bytes
64 bytes from 172.16.20.10: seq=0 ttl=63 time=5.375 ms
64 bytes from 172.16.20.10: seq=1 ttl=63 time=1.674 ms

--- 172.16.20.10 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.674/3.524/5.375 ms
[root@nas4 ~]# docker exec bbox1 ping -c 2 172.16.20.11
PING 172.16.20.11 (172.16.20.11): 56 data bytes
64 bytes from 172.16.20.11: seq=0 ttl=63 time=5.567 ms
64 bytes from 172.16.20.11: seq=1 ttl=63 time=1.598 ms

--- 172.16.20.11 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.598/3.582/5.567 ms

  

分析bbox1(172.16.10.10)到bbox4(172.16.20.11)的数据包

1)因为bbox1与bbox4在不同的网段,先查询bbox1的路由表

[root@nas4 ~]# docker exec bbox1 ip r
default via 172.16.10.254 dev eth0 
172.16.10.0/24 dev eth0 scope link  src 172.16.10.10 

  

走默认路由,送到网关172.16.10.254

2)路由器ens33.10收到数据包,发现地址172.16.20.11,查看自己的路由表

[root@vm-vpn ~]# route -n |grep -v "169.254"
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.200.1   0.0.0.0         UG    101    0        0 ens37
10.1.1.0        0.0.0.0         255.255.255.0   U     102    0        0 ens33
172.16.10.0     0.0.0.0         255.255.255.0   U     0      0        0 ens38.10
172.16.20.0     0.0.0.0         255.255.255.0   U     0      0        0 ens38.20
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.200.0   0.0.0.0         255.255.255.0   U     101    0        0 ens37

  

于是将数据包从ens38.20转发走

3)通过arp记录的信息,路由表能够得知172.16.20.11在nas5上,于是将数据发送给nas5

4)nas5根据目的地址和vlan信息将数据包发送给bbox4


macvlan网络的连通和隔离完全依赖vlan,ip subnet和路由,docker本身不做限制,用户可以像管理传统vlan网络那样管理macvlan

 

posted @ 2019-09-11 15:57  larlly  阅读(505)  评论(0)    收藏  举报