更多文章:WorkMap技术博客
MacVlan
有些应用程序,特别是老的应用程序或监视网络流量的应用程序,期望直接连接到物理网络。在这种情况下,可以使用macvlan网络驱动程序为每个容器的虚拟网络接口分配一个MAC地址,使其看起来像是直接连接到物理网络的物理网络接口。
在这种情况下,需要指定Docker主机上要用于Macvlan的物理接口,以及网络的子网和网关。
也可以使用不同的物理网络接口,隔离同一主机上的多个Macvlan网络。
注意
-
由于IP地址耗尽或“VLAN扩散”(网络中有大量的MAC地址),可能会降低网络质量。
-
网络设备需要能够处理“混杂模式”,即:一个物理接口可以分配多个MAC地址。
-
尽量优先使用bridge(单个Docker主机)或overlay(跨多个Docker主机)网络。
前置条件
-
大多数云提供商会阻止 macvlan 网络。可能需要连接到物理接口。
-
macvlan 网络驱动程序仅适用于 Linux 主机,不支持 Docker Desktop for Mac、Docker Desktop for Windows 或 Docker EE for Windows Server。
-
至少 3.9 版本的 Linux 内核,推荐使用 4.0 或更高版本。
参数
-
macvlan_mode
设置 Macvlan 模式。可以是以下之一:bridge,vepa,passthru,private。默认是bridge
-
parent
指定要使用的父接口。
创建Macvlan 网络
Bridge模式(直接连接到主机的物理设备)
- 创建Macvlan网络
docker network create -d macvlan \ --subnet=172.16.86.0/24 \ --gateway=172.16.86.1 \ -o parent=eth0 \ my-macvlan-net
- 创建容器,并连接到该macvlan
docker run --rm -dit \ --network my-macvlan-net \ --name my-macvlan-alpine \ alpine:latest \ ash
- 查看容器信息,其中的Networks部分,可以看到容器分配了mac地址
输出:docker container inspect my-macvlan-alpine
"Networks": { "my-macvlan-net": { "IPAMConfig": null, "Links": null, "Aliases": [ "bec64291cd4c" ], "NetworkID": "5e3ec79625d388dbcc03dcf4a6dc4548644eb99d58864cf8eee2252dcfc0cc9f", "EndpointID": "8caf93c862b22f379b60515975acf96f7b54b7cf0ba0fb4a33cf18ae9e5c1d89", "Gateway": "172.16.86.1", "IPAddress": "172.16.86.2", "IPPrefixLen": 24, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:10:56:02", "DriverOpts": null } }
- 查看容器内部的网络信息
输出docker exec my-macvlan-alpine ip addr show eth0
9: eth0@tunl0: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:10:56:02 brd ff:ff:ff:ff:ff:ff inet 172.16.86.2/24 brd 172.16.86.255 scope global eth0 valid_lft forever preferred_lft forever
- 删除容器及macvlans
docker container stop my-macvlan-alpine docker network rm my-macvlan-net
802.1Q trunk bridge 模式(连接到主机上,基于802.1Q协议创建的VLAN子设备)
- 创建eth0.50 Vlan,并以此作为parent,创建Macvlan
docker network create -d macvlan \ --subnet=192.168.50.0/24 \ --gateway=192.168.50.1 \ -o parent=eth0.50 macvlan50
支持双栈IPv4/IPv6的Macvlan网络
docker network create -d macvlan \
--subnet=192.168.216.0/24 --subnet=192.168.218.0/24 \
--gateway=192.168.216.1 --gateway=192.168.218.1 \
--subnet=2001:db8:abc8::/64 --gateway=2001:db8:abc8::10 \
-o parent=eth0.218 \
-o macvlan_mode=bridge macvlan216