macvlan 为容器分配独立 mac 地址而非复用宿主机物理网卡 mac,通过在 parent 接口上虚拟子接口实现同网段通信;需启用混杂模式、指定 parent 创建网络,并注意交换机/路由器的 mac 过滤限制。
macvlan 模式本身不会直接赋予容器宿主机物理网卡的 mac 地址,而是为容器分配独立、合法的新 mac 地址,使其在局域网中表现为一台“新设备”。宿主机的 mac 地址仍由物理网卡独占,不可共享或复用——这是以太网底层协议决定的。真正发生的是:macvlan 在物理网卡(parent 接口)上虚拟出多个具备不同 mac 的子接口,每个容器绑定一个,从而获得与宿主机同网段的真实 ip 和网络身份。
下面分三步说明关键操作和注意事项:
确认物理网卡并启用混杂模式
Macvlan 依赖物理网卡接收目标非本机 MAC 的帧,因此必须开启混杂模式(promiscuous mode):
- 查看主网卡名:
ip -o link show | awk -F': ' '{print $2}' | grep -v "lo\|docker\|veth" - 临时启用混杂:
sudo ip link set dev eth0 promisc on(替换eth0为实际网卡名) - 持久化需写入
/etc/network/interfaces或 systemd network unit(如 Ubuntu/Debian 中添加post-up ip link set dev eth0 promisc on)
创建 Macvlan 网络时指定 parent 和子网
命令中 -o parent=xxx 是核心,它把虚拟接口挂载到真实网卡上,后续所有容器 MAC 均由此生成:
- 示例(假设宿主机 IP 为
192.168.1.10/24,网关192.168.1.1):docker network create -d macvlan \ --subnet=192.168.1.0/24 \ --gateway=192.168.1.1 \ -o parent=eth0 \ my-macvlan
- Docker 会自动为每个连接该网络的容器生成唯一 MAC(基于 parent MAC + 随机后缀),无需手动指定,也不建议硬编码 MAC(除非有特殊审计或白名单需求)
启动容器并验证 MAC 与连通性
容器运行后,其网络接口拥有独立 MAC 和同网段 IP,可被局域网其他设备直接访问:
- 启动示例:
docker run -d --name nginx-mac --network my-macvlan --ip=192.168.1.110 nginx
- 进入容器检查:
docker exec nginx-mac ip link show eth0 | grep "link/ether" # 输出类似:link/ether 02:42:c0:a8:01:6e brd ff:ff:ff:ff:ff:ff
- 该 MAC 与宿主机
eth0的 MAC 不同,但属于同一广播域,且交换机/路由器需允许该 MAC 通过(部分家用路由器需关闭「端口安全」或「MAC 地址过滤」)
注意:若确需固定某容器使用特定 MAC(如对接硬件白名单系统),可用 --mac-address 参数:
docker run -d --mac-address=00:11:22:33:44:55 --network my-macvlan --ip=192.168.1.111 nginx
但该 MAC 必须未被局域网内其他设备占用,且不能与 parent 网卡 MAC 冲突。
不复杂但容易忽略











