docker容器可通过自定义bridge网络或macvlan模式实现多网卡效果:先创建多个子网不重叠的自定义网络并连接容器,或用macvlan直连物理网卡,使容器获得多个独立网络接口及对应物理出口。

Docker 容器本身不直接支持“绑定多块物理网卡”,但可以通过组合网络模式与宿主机配置,让容器具备多个网络接口(即双网卡或多网卡效果),实现不同流量走不同路径、内外网分离、或对接多个物理网络。关键在于:不是容器主动绑定网卡,而是通过网络驱动选择 + 自定义网络 + 连接操作,把多个虚拟网络接口挂载到容器里,每个接口背后对应宿主机的不同物理出口。
确认宿主机网卡与用途
先理清物理基础:
- 运行
ip -br a查看所有网卡名(如eth0、ens33、enp0s8)及其 IP 和子网 - 明确每块网卡的职责:哪块连内网、哪块接公网、哪块专用于容器服务通信
- 若需复用同一物理网卡承载多个子网,可配 IP 别名(如
ip addr add 192.168.2.100/24 dev eth0 label eth0:1)
创建多个自定义 bridge 网络
默认 bridge 不支持静态 IP 和多网卡灵活挂载,必须用自定义网络:
# 网络1:用于内网通信(对应物理网卡 eth0) docker network create --subnet=192.168.10.0/24 --gateway=192.168.10.1 net-internal # 网络2:用于外网出口(对应物理网卡 eth1) docker network create --subnet=192.168.20.0/24 --gateway=192.168.20.1 net-external
注意:每个网络子网不能重叠,且需避开 Docker 默认网段(如
172.17.0.0/16)
启动容器并连接多个网络
容器启动时默认只连一个网络,其余需动态接入:
# 1. 启动容器(先连第一个网络) docker run -d --name app --network net-internal --ip 192.168.10.10 nginx # 2. 再连接第二个网络(指定固定 IP) docker network connect --ip 192.168.20.10 net-external app
进入容器后执行 ip a,会看到 eth0(来自 net-internal)和 eth1(来自 net-external)两个接口,各自有独立 IP 和路由。
✅ 支持静态 IP 分配(仅限自定义 bridge)、路由策略可按需设置(如
ip route add default via 192.168.20.1 dev eth1)
进阶:用 macvlan 直连物理网卡(更贴近“绑定”)
若希望容器像物理机一样直出某块网卡(无需 NAT、低延迟),用 macvlan:
# 将容器直接桥接到 eth1,获取同网段真实 IP docker network create -d macvlan \ --subnet=10.0.0.0/24 \ --gateway=10.0.0.1 \ -o parent=eth1 \ macvlan-eth1 # 启动容器并指定 IP(必须在该物理网段内) docker run -d --network macvlan-eth1 --ip=10.0.0.50 nginx
此时容器 eth0 的 MAC 和 IP 都直接暴露在 eth1 所在物理网络中,交换机可识别,适合需要二层互通或 DHCP 获取地址的场景。
⚠️ 注意:
macvlan模式下宿主机默认无法直接 ping 容器 IP(需额外配置 host-local 路由或启用mode=bridge+--aux-address)
不复杂但容易忽略











