docker compose容器默认路由由网络添加顺序决定,首个network的网关通常设为默认路由;可通过调整networks列表顺序、显式配置自定义bridge网关、entrypoint动态修改或使用macvlan驱动实现精准控制。

在 Docker Compose 中,容器默认路由由网络接口的顺序和内核路由表决定,Compose 本身不提供直接设置网络优先级或默认网关的语法。但你可以通过组合使用自定义网络、手动配置容器网络命名空间、或借助 init 容器等方式,间接控制多网卡容器的默认路由走向。
理解默认路由生成机制
Docker 启动容器时,会为每个连接的网络分配一个虚拟以太网接口(如 eth0、eth1),并按“网络添加顺序”为第一个网络配置默认路由(即 0.0.0.0/0)。这个顺序就是 docker-compose.yml 中 networks: 下列出的顺序,越靠前的网络,其网关越可能成为默认路由。
例如:
-
networks: [net-a, net-b]→net-a的网关通常设为默认路由 -
networks: [net-b, net-a]→net-b的网关更可能成为默认路由
⚠️ 注意:这并非绝对,还受网络驱动类型(bridge / macvlan)、子网 CIDR、是否启用 internal、以及宿主机路由策略影响。
用自定义 bridge 网络显式指定网关
为关键网络显式定义网关 IP,并确保它具备外网可达性(如能访问公网或目标服务):
networks:
public:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
gateway: 172.20.0.1 # ← 显式指定,且该网关需能转发到外部
private:
driver: bridge
internal: true
ipam:
config:
- subnet: 192.168.100.0/24
再将该网络放在 services.networks 列表首位:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
services:
app:
image: nginx
networks:
- public # ← 放第一位,让 eth0 对应 public 网络
- private
这样容器启动后,ip route | grep default 通常显示 via 172.20.0.1,即走 public 网络出口。
进阶:启动后动态修改默认路由(适合调试或特殊场景)
若需更精细控制(比如让流量走 private 网络出口,但只限特定目标),可在容器启动后执行路由命令。推荐用 entrypoint 脚本实现:
services:
app:
image: alpine:latest
networks:
- public
- private
entrypoint: ["/bin/sh", "-c"]
command: |
ip route del default &&
ip route add default via 192.168.100.1 dev eth1 && # ← 指向 private 网络网关
exec nginx -g "daemon off;"
⚠️ 前提是:private 网络网关(如 192.168.100.1)真实存在且已配置 NAT/转发;容器需有 NET_ADMIN 权限:
cap_add:
- NET_ADMIN
替代方案:用 macvlan 或 ipvlan 实现物理级路由控制
当需要彻底绕过 Docker 默认桥接行为,让容器直接使用宿主机物理网卡并自主选路时,可考虑 macvlan:
networks:
upstream:
driver: macvlan
driver_opts:
parent: eth0 # ← 绑定到宿主机真实网卡
ipam:
config:
- subnet: 192.168.1.0/24
gateway: 192.168.1.1
此时容器获得独立 MAC 和 IP,路由完全由自身网络栈控制,default 可自由设为任意网关(只要二层可达),不再受 Compose 网络顺序限制。










