docker物理网卡直通首选macvlan驱动,通过内核原生支持让容器直接绑定物理接口;次选ipvlan(兼容严控mac环境);host模式零开销但无隔离;禁用pipework等过时方案。

在 Docker 中实现物理网卡直通,核心目标是让容器绕过宿主机的网络协议栈(如 iptables、NAT、docker0 桥接等),直接使用底层物理网卡收发数据包,从而降低延迟、提升吞吐量。这不是“把 PCI 设备透传给容器”(那是虚拟机场景),而是通过 Linux 内核原生网络虚拟化机制,在容器网络命名空间中绑定真实物理接口或其虚拟子接口。
优先推荐:macvlan 网络驱动(生产级首选)
macvlan 是最成熟、轻量、无需额外工具且内核原生支持的方案,适用于绝大多数高性能场景(如边缘网关、实时流处理、NFV 容器化)。
- 确认内核支持:
modprobe macvlan && lsmod | grep macvlan,需 Linux ≥ 3.9(建议 ≥ 4.18) - 创建 macvlan 网络,指定物理出口和子网:
docker network create -d macvlan \<br> --subnet=192.168.1.0/24 \<br> --gateway=192.168.1.1 \<br> -o parent=eth0 \<br> mynet
- 运行容器并分配静态 IP(必须在同一子网):
docker run -d --network=mynet --ip=192.168.1.50 nginx - 注意:宿主机 eth0 本身不能与容器同网段通信(会路由冲突),建议将宿主机管理口换到另一张网卡或用独立 VLAN
简化替代:host 网络模式(调试/低隔离需求)
不新建网络命名空间,容器直接复用宿主机的网络协议栈和所有网卡。零配置、零开销,但牺牲网络隔离性和端口管理灵活性。
- 启动即生效:
docker run -d --net=host --name api-server nginx - 容器内
ip a显示与宿主机完全一致的网卡列表和 IP - 适用场景:监控代理(Prometheus Node Exporter)、日志采集器(Fluent Bit)、单点高性能服务(如 DPDK 用户态应用容器)
- 风险提示:容器可直接 bind 宿主机任意端口,需严格控制镜像来源和权限
进阶可控:ipvlan(macvlan 的补充方案)
当交换机不支持混杂模式或 MAC 地址学习限制严(如某些云厂商 VPC 或企业接入交换机),macvlan 的 bridge 模式可能失效。ipvlan 共享同一 MAC 地址,仅靠 IP 区分流量,兼容性更强。
- 创建 ipvlan 网络(L2 模式类比 macvlan bridge):
docker network create -d ipvlan \<br> --subnet=192.168.2.0/24 \<br> --gateway=192.168.2.1 \<br> -o parent=eth1 \<br> -o ipvlan_mode=l2 \<br> myipvlan
- 与 macvlan 使用方式一致,容器获得独立 IP,但所有容器共用 eth1 的 MAC 地址
- 需内核 ≥ 4.2,且启用
CONFIG_IPVLAN=m或内置
不推荐用于常规直通的方案
以下方法要么已弃用、维护困难,要么本质不是“直通”,而是桥接或 NAT 增强:
- pipework:第三方脚本,依赖 brctl 和手动 netns 操作,Docker 1.9+ 原生网络功能已覆盖其能力,易出错且无官方支持
- --device=/dev/net/tun 或类似设备挂载:仅暴露字符设备,不提供 L2/L3 网络路径,无法实现网卡级直通
- 修改 docker0 或 --bip:仍属 bridge 模式,只是调整默认网桥地址,无法绕过 NAT 和 veth 转发,延迟和吞吐无本质改善











