镜像拉取由 dockerd 进程发起,不走容器网络,关键在于让 dockerd 的 HTTPS 请求经指定网卡出口;需通过策略路由(iptables MARK + ip rule + 自定义路由表)或临时修改默认路由实现,并用 tcpdump 验证流量路径。

镜像拉取本身不走容器网络,而是由 Docker daemon(即 dockerd 进程)发起的 HTTP/HTTPS 请求,因此控制拉取流量出口的关键在于 **让 dockerd 的网络请求经由指定网卡发出**,而非配置容器网络。这与运行容器时绑定网卡是两回事。
确认 dockerd 使用的默认路由出口
Docker daemon 默认使用主机系统的默认路由(ip route show default)决定出向流量路径。若服务器有多网卡(如 eth0 走内网、eth1 走公网),而默认网关在 eth0 上,则所有 docker pull 都会走 eth0 —— 即使你后续让容器走 eth1,拉取阶段仍不受影响。
- 运行
ip route show default查看当前默认网关绑定的网卡 - 运行
curl -v https://registry-1.docker.io/v2/ 2>&1 | grep "Connected to"模拟拉取连接,观察实际连的是哪个 IP(对应哪张网卡)
强制 dockerd 流量走指定网卡(推荐:策略路由)
最可靠的方式是为 dockerd 进程打标记,并通过策略路由将其流量导向目标网卡。需配合 iptables + ip rule + 自定义路由表:
- 给 dockerd 进程打 netfilter 标记(需 dockerd 启动前设置,或用 systemd service wrapper)
- 例如:在 dockerd 启动命令前加
exec /usr/bin/iptables -t mangle -A OUTPUT -m owner --uid-owner root -p tcp --dport 443 -j MARK --set-mark 0x100(假设 dockerd 以 root 运行且访问 registry 走 443) - 创建专用路由表:
echo "200 docker-out" >> /etc/iproute2/rt_tables - 添加路由:
ip route add default via 10.0.0.1 dev eth1 src 10.0.0.100 table docker-out(替换为 eth1 的网关和本机 IP) - 绑定规则:
ip rule add fwmark 0x100 table docker-out - 重启 dockerd:
systemctl restart docker
临时替代方案:修改主机默认路由(慎用)
若仅临时调试,可临时调整默认路由指向目标网卡:
ip route del default-
ip route add default via 192.168.2.1 dev eth1(替换为 eth1 对应网关) - 注意:此操作会影响主机上所有未明确指定路由的出向流量,可能中断 SSH 或监控服务
- 建议搭配
ip route flush cache立即生效
验证是否生效
执行一次拉取并抓包确认:
docker pull hello-world- 另开终端:
tcpdump -i eth1 port 443 -n -c 2(替换 eth1 为目标网卡)—— 应能看到 TLS 握手包 - 对比:
tcpdump -i eth0 port 443 -n -c 2应无输出


















