docker 本身不直接支持绑定物理网卡,但可通过自定义 bridge 网络 + iptables snat 规则(如 -t nat -a postrouting -s 192.168.100.0/24 -o eth1 -j snat --to-source 10.0.0.100)或 macvlan 网络(-o parent=eth1)实现流量定向至指定网卡,并配合 -p 10.0.0.100:8080:80 控制入向监听。

Docker 本身不直接支持“绑定到某块物理网卡”,但可以通过网络模型选择、自定义桥接配置和系统级路由控制,让容器流量明确走指定网卡。关键不是 Docker 主动“绑定”,而是通过组合手段把流量导向目标接口。
确认物理网卡与用途
先用 ip -br a 或 ip link show 查清网卡名(如 eth0、ens33、enp0s8)及其 IP 地址、所属子网。
明确哪块网卡用于内网通信、哪块用于公网出口、哪块专供容器服务——这是后续所有配置的前提。
创建自定义 bridge 网络并关联物理接口
Docker 默认的 docker0 桥无法指定底层物理网卡,必须新建用户定义 bridge,并配合 iptables 或 --opt com.docker.network.bridge.name(注意:该参数实际作用是设置桥设备名,不能直接绑定物理网卡,但可配合后续规则使用):
# 创建自定义网段(避开默认 172.17.0.0/16) docker network create \ --driver bridge \ --subnet=192.168.100.0/24 \ --gateway=192.168.100.1 \ --opt "com.docker.network.bridge.name"="br-ext" \ ext-net
这条命令创建了名为 br-ext 的 Linux 网桥(而非 docker0),但它仍只是虚拟桥,尚未关联物理网卡。真正绑定靠下一步。
用 iptables 强制出向流量走指定网卡
假设你希望所有来自 ext-net(即 192.168.100.0/24)的容器流量,统一从物理网卡 eth1 出去(其 IP 是 10.0.0.100):
# SNAT:修改源地址为 eth1 的 IP,确保返回路径正确 iptables -t nat -A POSTROUTING \ -s 192.168.100.0/24 \ -o eth1 \ -j SNAT --to-source 10.0.0.100 # 允许转发(若未启用,需先执行:sysctl -w net.ipv4.ip_forward=1) iptables -A FORWARD -i br-ext -o eth1 -j ACCEPT iptables -A FORWARD -i eth1 -o br-ext -m state --state RELATED,ESTABLISHED -j ACCEPT
这样,容器发出的请求会经 br-ext → eth1 出去,响应也能正确返回。
入向流量:端口映射时指定宿主机监听网卡
若需外部访问容器服务(如 Web),用 -p 显式绑定到目标网卡的 IP:
docker run -d \ --name web \ --network ext-net \ -p 10.0.0.100:8080:80 \ nginx
这表示只在 eth1(IP 10.0.0.100)上监听 8080 端口,不监听 eth0 或其他接口。
替代方案:macvlan(更干净,推荐用于隔离场景)
如果希望容器拥有和宿主机同网段的独立 IP,并直接走某块物理网卡(跳过 NAT 和桥接),用 macvlan:
docker network create \ -d macvlan \ --subnet=10.0.0.0/24 \ --gateway=10.0.0.1 \ -o parent=eth1 \ macvlan-net
-o parent=eth1 是关键:它把 macvlan-net 的流量直接绑定到 eth1 接口。容器启动后获得 10.0.0.x 地址,和宿主机在同一二层网络,无需 SNAT,性能更好、拓扑更清晰。
验证是否生效
- 进入容器:
docker exec -it web ip r,检查默认路由是否指向192.168.100.1(bridge)或10.0.0.1(macvlan) - 在容器内
curl ifconfig.me或ping 8.8.8.8,同时在宿主机用tcpdump -i eth1 icmp抓包,确认流量确实经过eth1 - 检查
iptables -t nat -vnL POSTROUTING是否有对应 SNAT 规则
不复杂但容易忽略细节,核心就三点:选对网络模型、配好 SNAT 或用 macvlan、端口映射写明 IP。











