docker桥接网络的路由由守护进程与内核自动管理,冲突时应删除冲突网络或改用指定不重叠子网的自定义bridge网络,而非手动配路由。

Docker 桥接网络本身不手动配置路由表,它的路由行为是自动完成的,由 Docker 守护进程和 Linux 内核协同管理。你看到的路由条目(比如 172.17.0.0/16 via 172.17.0.1 dev docker0)是系统自动生成的直连路由,不是用户手动添加的。真正需要你干预的,通常是避免冲突或满足特定通信需求时的调整。
下面分几种常见场景说明关键点和操作方式:
桥接网络默认路由怎么来的
Docker 启动时会创建虚拟网桥(如 docker0),并为其分配一个子网(默认 172.17.0.0/16)。
- 宿主机上会自动添加一条内核路由:目标网段
172.17.0.0/16→ 出接口docker0(类型为link或local) - 容器启动后,Docker 为它分配 IP(如
172.17.0.2),并设置172.17.0.1(即docker0的 IP)为默认网关 - 这个网关能通宿主机、NAT 出外网,但不能直接访问宿主机所在物理网段以外的其他内网网段(比如
192.168.2.0/24或172.16.251.0/24)
路由冲突时怎么处理
当宿主机已有某网段(如 172.16.251.0/24),而 Docker 自动创建了同网段或重叠网段的 bridge 网络(如 br-xxx 分配了 172.16.251.0/24),就会导致:
- 宿主机发往
172.16.251.x的包被错误导向br-xxx,而不是走物理网卡 - 表现为“服务器能 ping 通容器,但容器或宿主机无法访问同网段其他机器”
解决办法不是“配路由”,而是清理或规避冲突:
- 查看冲突路由:
ip route | grep "172.16.251" - 找到对应 bridge 网络 ID:
docker network ls+docker network inspect <id></id> - 停掉使用该网络的容器:
docker stop $(docker ps -q --filter network=<id>)</id> - 删除网络:
docker network rm <id></id>(注意:默认bridge网络不能删) - 若需保留服务,改用自定义 bridge 并指定不冲突子网:
docker network create --driver bridge --subnet=172.30.0.0/24 mynet
想让容器访问宿主机所在局域网(如 192.168.2.0/24)
默认情况下,容器通过 docker0 网关只能访问宿主机本身(172.17.0.1),不能直接访问宿主机的物理网段。
要实现,有两种常用方式:
-
方式一:在宿主机加回程路由(推荐)
宿主机执行(假设容器网段是172.17.0.0/16,物理网卡是eth0):ip route add 172.17.0.0/16 via 192.168.2.163 dev eth0
这样,局域网里其他设备(如
192.168.2.100)发给容器的包就能正确返回。 -
方式二:用 host 网络模式(简单但牺牲隔离)
docker run --network host nginx
容器直接共享宿主机网络栈,所有端口和路由都一致,无需额外配置。
自定义 bridge 网络时如何控制子网和路由
创建时显式指定 --subnet,可避免与现有网络重叠,并让路由更可控:
docker network create \ --driver bridge \ --subnet=192.168.100.0/24 \ --gateway=192.168.100.1 \ mynet
- 这会创建新网桥(如
br-xxxx),分配192.168.100.1为网关 - 宿主机自动添加
192.168.100.0/24 dev br-xxxx scope link - 启动容器时指定 IP:
docker run --network mynet --ip 192.168.100.10 nginx
不复杂但容易忽略











