当容器需要直连入物理网络时,可以使用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