docker容器vlan透传需用macvlan或ipvlan配合物理网卡的vlan子接口(如eth0.10),使报文携带802.1q标签,从而让交换机按vlan id进行隔离、acl、qos及跨设备二层转发。

要让 Docker 容器流量真正“透传”到物理交换机并参与 VLAN 识别与转发,关键不是用普通 bridge 网络,而是借助 macvlan 或 ipvlan 配合物理网卡的 VLAN 子接口(如 eth0.10)作为 parent 接口。这样,容器的报文在离开宿主机前就已携带 802.1Q VLAN Tag,交换机才能按 VLAN ID 做策略隔离、ACL、QoS 或跨设备二层转发。
下面分三类典型场景说明怎么做,直击实战要点:
用 macvlan + VLAN 子接口实现 VLAN 透传
适合需要容器拥有独立 MAC 地址、且交换机端口允许学习多个 MAC 的环境(如企业内网、自建机房)。
-
前提检查
- 宿主机网卡支持 VLAN(
modprobe 8021q已加载) - 物理交换机对应端口配置为 Trunk 模式,并放行目标 VLAN(如 VLAN 10)
- 宿主机上已创建 VLAN 子接口:
ip link add link eth0 name eth0.10 type vlan id 10 ip link set eth0.10 up
- 宿主机网卡支持 VLAN(
-
创建 macvlan 网络时指定 VLAN 子接口为 parent
docker network create -d macvlan \ --subnet=10.10.10.0/24 \ --gateway=10.10.10.1 \ -o parent=eth0.10 \ vlan10-macvlan
-
启动容器并指定 IP(该 IP 必须属于 VLAN 10 对应子网)
docker run -d --name app-a --net=vlan10-macvlan --ip=10.10.10.101 nginx
✅ 效果:容器发出的所有数据帧都带 VLAN 10 Tag;交换机可基于此做端口隔离、VLAN 间路由(若启用了三层)、甚至对接外部防火墙策略。
⚠️ 注意:macvlan 默认 bridge 模式下,同一 parent(eth0.10)下的容器可二层互通;如需严格隔离,改用--opt macvlan_mode=private。
用 ipvlan L2 模式 + VLAN 子接口实现轻量 VLAN 透传
适合高密度部署或交换机 MAC 表容量受限的场景(如云平台、多租户接入),避免 MAC 泛滥。
-
同样先创建 VLAN 子接口(如 eth0.20)
ip link add link eth0 name eth0.20 type vlan id 20 ip link set eth0.20 up
-
创建 ipvlan 网络,parent 指向 VLAN 子接口
docker network create -d ipvlan \ --subnet=10.20.20.0/24 \ --gateway=10.20.20.1 \ -o parent=eth0.20 \ -o ipvlan_mode=l2 \ vlan20-ipvlan
-
运行容器(无需指定 MAC,所有容器共享 eth0.20 的 MAC)
docker run -d --name db-01 --net=vlan20-ipvlan --ip=10.20.20.50 mysql:8
✅ 效果:报文仍带 VLAN 20 Tag;交换机看到的是同一个源 MAC,但不同目的 IP,转发行为完全由 IP 层和 VLAN 策略决定;性能比 macvlan 更稳,MAC 表压力小。
⚠️ 注意:宿主机默认无法 ping 通这些容器 IP(命名空间隔离),如需管理,可在宿主机起一个连接同一 ipvlan 网络的容器作跳板,或加 host-side 路由+proxy arp。
跨主机 VLAN 透传的关键补充
若两台 Docker 主机(Host-A 和 Host-B)都要接入同一 VLAN(如 VLAN 30),只需确保:
- 两台主机的物理网卡均接在同一个 Trunk 交换机端口组
- 两台主机都创建了相同的 VLAN 子接口(如 eth0.30)
- 两台主机都用相同参数创建 macvlan 或 ipvlan 网络(同 subnet、同 gateway、同 parent)
- 容器分配的 IP 在同一子网且不冲突
此时,Host-A 上的容器 10.30.30.101 可直接 ping 通 Host-B 上的 10.30.30.102,全程无 NAT、无 overlay 封装、无隧道开销,纯二层 VLAN 透传。
不复杂但容易忽略











