Macvlan 网络驱动

一些应用程序,特别是遗留应用程序或监控网络流量的应用程序,期望直接连接到物理网络。在这种情况下,您可以使用macvlan网络驱动程序为每个容器的虚拟网络接口分配一个MAC地址,使其看起来像是直接连接到物理网络的物理网络接口。在这种情况下,您需要指定Docker主机上的一个物理接口用于Macvlan,以及网络的子网和网关。您甚至可以使用不同的物理网络接口来隔离您的Macvlan网络。

请记住以下几点:

  • 您可能会无意中由于IP地址耗尽或“VLAN扩散”而降低网络性能,这种情况发生在您的网络中存在不适当的大量唯一MAC地址时。

  • 您的网络设备需要能够处理“混杂模式”,在这种模式下,一个物理接口可以被分配多个MAC地址。

  • 如果你的应用程序可以使用桥接(在单个Docker主机上)或覆盖网络(在多个Docker主机之间通信),这些解决方案从长远来看可能更好。

选项

下表描述了在使用macvlan驱动程序创建网络时,可以传递给--option的驱动程序特定选项。

OptionDefaultDescription
macvlan_modebridgeSets the Macvlan mode. Can be one of: bridge, vepa, passthru, private
parentSpecifies the parent interface to use.

创建一个Macvlan网络

当你创建一个Macvlan网络时,它可以是桥接模式或802.1Q中继桥接模式。

  • 在桥接模式下,Macvlan流量通过主机上的物理设备传输。

  • 在802.1Q中继桥接模式下,流量通过Docker动态创建的802.1Q子接口传输。这使您能够在更细粒度的级别上控制路由和过滤。

桥接模式

要创建一个与给定物理网络接口桥接的macvlan网络,请使用--driver macvlandocker 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

如果你需要排除某些IP地址不被用于macvlan网络,例如当某个给定的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 驱动。