Docker当期望直接连接到物理网络时使用macvlan网络

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

  • 很容易无意间损坏您的网络,由于IP地址耗尽或“VLAN传播”,在这种情况下,您的网络中有大量不适当的唯一MAC地址。

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

  • 如果您的应用程序可以使用网桥(在单个Docker主机上)或覆盖(跨多个Docker主机进行通信)工作,那么从长远来看,这些解决方案可能会更好。

创建一个macvlan网络

创建macvlan网络时,它可以处于桥接模式或802.1q中继桥接模式。

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

  • 在802.1q中继桥接模式下,流量通过Docker动态创建的802.1q子接口。 这使您可以更精细地控制路由和过滤。

桥接模式

要创建与给定物理网络接口桥接的macvlan网络,请在docker network create命令中使用--driver macvlan。 您还需要指定parentparent是流量将在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中继桥接模式

如果您指定一个包含点的父接口名称,例如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 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

下一步