Macvlan 网络驱动程序

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

请注意以下事项

  • 您可能会因 IP 地址耗尽或“VLAN 扩散”(当网络中出现不恰当的大量唯一 MAC 地址时发生的情况)而无意中降低网络性能。

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

  • 如果您的应用程序可以使用 bridge(在单个 Docker 主机上)或 overlay(跨多个 Docker 主机通信),从长远来看,这些解决方案可能更好。

选项

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

选项默认值说明
macvlan_modebridge设置 Macvlan 模式。可以是以下之一:bridgevepapassthruprivate
parent指定要使用的父接口。

创建 Macvlan 网络

创建 Macvlan 网络时,它可以在 bridge 模式或 802.1Q trunk bridge 模式下运行。

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

  • 在 802.1Q trunk bridge 模式下,流量通过 Docker 动态创建的 802.1Q 子接口。这允许您在更精细的粒度上控制路由和过滤。

Bridge 模式

要创建一个与给定物理网络接口桥接的 macvlan 网络,请在使用 docker network create 命令时使用 --driver macvlan。您还需要指定 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 trunk bridge 模式

如果您指定的 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 bridge。您可以改用 ipvlan,以获得 L2 bridge。指定 -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 Daemon 允许使用 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 驱动程序。

页面选项