Docker网络之Macvlan

当容器需要直连入物理网络时,可以使用Macvlan。Macvlan本身不创建网络,本质上首先使宿主机物理网卡工作在‘混杂模式’,这样物理网卡的MAC地址将会失效,所有二层网络中的流量物理网卡都能收到。接下来就是在这张物理网卡上创建虚拟网卡,并为虚拟网卡指定MAC地址,实现一卡多用,在物理网络看来,每张虚拟网卡都是一个单独的接口。使用Macvlan有几点需要注意:

  • 容器直接连接物理网络,由物理网络负责分配IP地址,可能的结果是物理网络IP地址被耗尽,另一个后果是网络性能问题,物理网络中接入的主机变多,广播包占比快速升高而引起的网络性能下降问题。
  • 前边说过了,宿主机上的某张网上需要工作在‘混乱模式’下。
  • 从长远来看bridge网络与overlay网络是更好的选择,原因就是虚拟网络应该与物理网络隔离而不是共享。

创建Macvlan网络

Macvlan网络有两种模式:bridge模式与802.1q trunk bridge模式。

  • bridge模式,Macvlan网络流量直接使用宿主机物理网卡。
  • 802.1q trunk bridge模式,Macvlan网络流量使用Docker动态创建的802.1q子接口,对于路由与过虑,这种模式能够提供更细粒度的控制。

bridge模式

命令如下:

$ docker network create -d macvlan \
  --subnet=172.16.86.0/24 \
  --gateway=172.16.86.1  \
  -o parent=eth0 pub_net

上述命令中,-o parent=eth0表示使用的物理网卡名称。问题:应该不需要指定subnet与gateway,这个由物理网络决定。

对于subnet中指定的IP地址段,如果某个IP地址已经被占用,需要将这个地址排除在外,不能让它被分配,命令如下:

$ 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

上述命令指定了子网网段,并且对可以使用的IP地址范围进行了更变更的限制,可使用范围被限制在192.168.32.128/25,并且不允许分配192.168.32.129,因此使用Macvlan网络时要注意IP地址的分配问题。

802.1q trunk bridge模式

命令如下:

$ docker network  create  -d macvlan \
    --subnet=192.168.50.0/24 \
    --gateway=192.168.50.1 \
    -o parent=eth0.50 macvlan50

注意其中的eth0.50,它是物理网卡eth0的从设备,由Docker负责创建。

使用ipvlan替换macvlan 

ipvlan,基于ip地址划分vlan,是一种三层网络虚拟化技术,命令如下:

$ 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 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

原文:https://docs.docker.com/network/macvlan/#use-an-ipvlan-instead-of-macvlan 

你可能感兴趣的:(Docker)