# 简单了解 Macvlan
macvlan 是一种网络虚拟化技术,它允许在一个物理网络接口上配置多个虚拟网络接口,简单的说 macvlan 类型类似于子接口,但是相对于子接口来说,macvlan 的每个虚拟网络接口都有自己独立的 MAC 地址,并且可以配置上 IP 地址进行通信
- 查询当前内核是否加载 macvlan 内核
查询驱动 1
lsmod | grep macvlan
如果没有查询到,则可以手动载入,内核代码路径为 /drivers/net/macvlan.c载入驱动 1
modprobe macvlan
- macvlan 四种模式
- vepa 模式:各个子设备直接无法直接通信(可以通过支持端口聚合的交换机通信),可以和外部通信。
- private 模式:和 vepa 模式类似,各个子设备之间无法通信,即使通过支持端口聚合的交换机也不能。
- bridge 模式:各个子设备之间可以通信,通过虚拟桥接模式
- passthru 模式:会接管父设备(网口),父设备不能接收数据包,并且每个父设备只允许存在一个 macvlan 设备
# 通过 macvlan 实现容器与外部主机通信
网卡开启混杂模式
混杂模式 1
2
3
4#网卡开启混杂模式
ifconfig eno1 promisc
#网卡关闭混杂模式
ifconfig eno1 -promisc创建 macvlan 网络模式
创建网络模式 1
docker network create -d macvlan --subnet=192.168.128.0/24 --gateway=192.168.128.2 -o parent=eth0 -o macvlan_mode=vepa vepamv
--subnet 为子网掩码 CIDR 格式
--gateway 为网关
parent 为网卡名称
创建两个容器 mac1 与 mac2
创建容器 1
docker run -itd --name mac1 --net=vepamv --ip=192.168.128.222 -v /sys/fs/cgroup:/sys/fs/cgroup --privileged=true --restart=always mac:latest /usr/sbin/init
查看存在两 mac 地址
查看模式信息 1
2#查看网络模式信息
docker network inspect vepamvmac1 与 mac2 容器之间相互无法 ping 通,删除上述网络模式与容器
创建 bridge 模式的 macvlan 网络,重新新建 mac1 与 mac2 发现能够相互 ping 通