一、简介
一些程序,特别是应用程序或者网络流量监控程序,期望直接连接到物理网络,这种情况下,可使用Macvlan网络模式,给每个容器的虚拟网络接口配置一个mac地址,使得连接容器,看起来是直接到一个物理主机上。这种情况下,需要在主机上 为macvlan驱动,指定一个物理接口,一起子网与默认网关,甚至使用不同的物理网络接口,隔离navlan网络。但必须了解如下几点:
(1)IP地址溢出,和虚拟网络传播(VLAN spreads)将很容易导致网络损坏。例如网络中有众多无效的唯一mac地址,
(2)网络设备需要处理“混杂模式”, 多个mac地址关联一个物理接口
(3)如果应用程序可使用 bridge 模式 或者 overlay 模式,从长远来讲,将是更好的选择。
二、创建一个macvlan 网络
当创建一个macvlan网络时,我们可选如下两种模式
bridge mode : 桥接模式, 该模式下,网络数据路由,通过主机的一个物理设备。
802.1 q trunk birdge mode: 802.1 q主干桥接模式, (虚拟桥接局域网),流量通过docker 动态创建一个以 802.1 q的子接口传输(这里不深入解释802.1 q)这允许用户在更细的层次上控制路由和筛选。
2.1 Bridge mode
创建一个该模式下的网络,需要一个给定的物理接口,指定 --driver macvlan , 使用指令 docker 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
如果需要,正在使用的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
2.2 802.1 q trunk bridge mode
如果以包含点号 "."命名方式 指定一个 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
2.3 使用 ipvlan 提到 macvlan
2.1 和 2.2 依然使用的L3的桥接网络,可使用 iplvan 替代,获取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
2.4 启动ipv6
如果配置了docker daemon 的启动参数,运行使用ipv6, 可在macvlan网络中,同时使用 ipv4、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