Docker容器网络路由核心在于宿主机路由表、iptables规则与网络规划:先确认容器子网(如172.20.1.0/24),再添加静态路由(ip route add)、启用IP转发(sysctl net.ipv4.ip_forward=1)并配置FORWARD链放行,最后逐层排查通路。

Linux中配置Docker容器网络路由,核心是打通“容器内网 → 宿主机 → 外部网络/其他子网”的三层路径。重点不在改容器本身,而在宿主机的路由表、iptables规则和Docker网络规划上。
明确容器网络所处的子网范围
先确认每个Docker网络使用的子网,这是后续所有路由操作的前提:
- 查看默认 bridge:docker network inspect bridge | grep Subnet
- 查自定义网络(如 my-net):docker network inspect my-net | grep -A 2 Subnet
- 进容器看自己的IP:docker exec -it container-name ip -4 addr show eth0
例如你看到容器IP是 172.20.1.5/24,说明它属于 172.20.1.0/24 网段——这个网段必须在宿主机路由表中可达,否则跨网通信会失败。
为容器子网添加宿主机静态路由
当容器需要访问非本机Docker子网的目标(比如另一台机器上的容器、或宿主机外的某内网服务),需在宿主机上手动加路由:
- 目标是远程容器子网(如 10.0.20.0/24),下一跳是对方宿主机IP:ip route add 10.0.20.0/24 via 192.168.91.129
- 若该路由需开机持久化(Ubuntu/Debian):写入 /etc/network/interfaces 的 up 指令,或使用 netplan 配置;CentOS/RHEL 可写入 /etc/sysconfig/network-scripts/route-eth0
- 验证是否生效:ip route show | grep 10.0.20
启用IP转发并配置iptables转发规则
Docker默认只允许容器访问外网(靠SNAT),但若要让外部设备主动访问容器(尤其是跨主机场景),必须显式放行转发:
- 开启内核IP转发:sysctl -w net.ipv4.ip_forward=1,并写入 /etc/sysctl.conf 持久化
- 允许容器子网进出流量(以 172.20.1.0/24 为例):
iptables -I FORWARD -s 172.20.1.0/24 -j ACCEPT
iptables -I FORWARD -d 172.20.1.0/24 -j ACCEPT - 若宿主机有防火墙(ufw/firewalld),还需额外放行对应源/目的网段,例如:ufw allow from 172.20.1.0/24
跨主机通信时检查关键链路节点
路由配置后仍不通?按顺序排查以下四点:
- 源容器能否 ping 通自己宿主机的 docker0 或自定义网桥IP?(测试容器→宿主通路)
- 源宿主机能否 ping 通目标宿主机IP?(测试主机间基础连通性)
- 目标宿主机路由表中是否有指向源容器子网的条目?ip route show
- 目标宿主机 iptables FORWARD 链是否 DROP 了来自源子网的包?用 iptables -L FORWARD -v 查计数器



















