一、背景
macvlan 本身是 linux kernel 模块,是一种网卡虚拟化技术;
它允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置自己的 IP。
macvlan 的最大优点是性能极好,它不需要创建 Linux bridge,而是直接通过以太 interface 连接到物理网络。
二、实验容器 macvlan 网络
因为我们需要模拟跨主机容器通信,因此需要两台机器,每个机器拥有自己的网卡,连到同一网络
首先,分别开启两台机器网卡的混杂模式 (注意替换 ens160 为你的实际物理网卡接口名称)
如果你使用的虚拟机,注意在虚拟机网络设置也要打开允许混杂模式选项
# ip link set ens160 promisc on
然后,分别在两台机器上创建容器 macvlan 网络
# docker network create -d macvlan --subnet=10.20.14.0/24 --gateway=10.20.14.254 -o parent=ens160 mac_net1
这里的网络信息跟物理网卡所在网络信息一致,parent 指明使用的物理网卡接口
然后,分别在两台机器上运行容器,使用 macvlan 网络
Host 1:
# docker run -it --ip=10.20.14.150 --network=mac_net1 busybox sh
Host 2:
# docker run -it --ip=10.20.14.151 --network=mac_net1 busybox sh
我们从 Host 1 内的容器 ping Host 2 内的容器
可以看到通信正常!
一个 interface 只能创建一个 macvlan,如果想在一块物理网卡创建多个 macvlan,可以使用 sub-interface
我们使用类似如下命令创建 sub-interface 设备
# ip link add link ens160 name ens160.1 type vlan id 1
# ip addr add 10.20.14.226/24 brd 10.20.14.255 dev ens160.1
# ip link set dev ens160.1 up
删除命令:
# ip link set dev ens160.1 down
# ip link delete ens160.1
查看设备:
# ip addr