Macvlan 网络驱动程序
某些应用程序(特别是旧版应用程序或监视网络流量的应用程序)需要直接连接到物理网络。在这种情况下,您可以使用macvlan
网络驱动程序为每个容器的虚拟网络接口分配MAC地址,使其看起来像是直接连接到物理网络的物理网络接口。在这种情况下,您需要指定Docker主机上要用于Macvlan的物理接口,以及网络的子网和网关。您甚至可以使用不同的物理网络接口隔离Macvlan网络。
请记住以下几点
由于IP地址耗尽或“VLAN扩展”(当您的网络中存在过多的唯一MAC地址时会发生这种情况),您可能会无意中降低网络性能。
您的网络设备需要能够处理“混杂模式”,其中一个物理接口可以分配多个MAC地址。
如果您的应用程序可以使用桥接(在单个Docker主机上)或覆盖网络(跨多个Docker主机通信),那么从长远来看,这些解决方案可能更好。
选项
下表描述了在使用macvlan
驱动程序创建网络时,您可以传递给--option
的驱动程序特定选项。
选项 | 默认值 | 描述 |
---|---|---|
macvlan_mode | bridge | 设置Macvlan模式。可以是以下之一:bridge 、vepa 、passthru 、private |
parent | 指定要使用的父接口。 |
创建 Macvlan 网络
创建Macvlan网络时,它可以是桥接模式或802.1Q中继桥接模式。
在桥接模式下,Macvlan流量通过主机上的物理设备。
在802.1Q中继桥接模式下,流量通过Docker动态创建的802.1Q子接口。这允许您在更细粒度的级别控制路由和过滤。
桥接模式
要创建一个与给定物理网络接口桥接的macvlan
网络,请使用--driver macvlan
和docker network create
命令。您还需要指定parent
,即流量将在Docker主机上物理通过的接口。
$ docker network create -d macvlan \
--subnet=172.16.86.0/24 \
--gateway=172.16.86.1 \
-o parent=eth0 pub_net
如果需要排除在macvlan
网络中使用的IP地址(例如,当给定的IP地址已在使用时),请使用--aux-addresses
$ docker network create -d macvlan \
--subnet=192.168.32.0/24 \
--ip-range=192.168.32.128/25 \
--gateway=192.168.32.254 \
--aux-address="my-router=192.168.32.129" \
-o parent=eth0 macnet32
802.1Q 中继桥接模式
如果您指定包含点的parent
接口名称,例如eth0.50
,Docker会将其解释为eth0
的子接口并自动创建子接口。
$ docker network create -d macvlan \
--subnet=192.168.50.0/24 \
--gateway=192.168.50.1 \
-o parent=eth0.50 macvlan50
使用 IPvlan 代替 Macvlan
在上面的示例中,您仍然使用的是L3桥接。您可以改用ipvlan
,并获得L2桥接。指定-o ipvlan_mode=l2
。
$ docker network create -d ipvlan \
--subnet=192.168.210.0/24 \
--subnet=192.168.212.0/24 \
--gateway=192.168.210.254 \
--gateway=192.168.212.254 \
-o ipvlan_mode=l2 -o parent=eth0 ipvlan210
使用 IPv6
如果您已配置Docker守护程序以允许IPv6,则可以使用双栈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
后续步骤
了解如何在Macvlan网络教程中使用Macvlan驱动程序。