docker网络不提供传统路由策略,而是通过网络分域、规则注入与协议感知协同实现流量控制。具体包括:1. 用自定义桥接网络划分业务通信域;2. 通过iptables/nftables在宿主机层细粒度管控;3. docker 27+启用ebpf策略引擎实现应用层控制;4. 结合compose多网络定义构建混合拓扑。

Docker 网络本身不提供传统意义上的“路由策略”(如 BGP、静态路由表注入),它依赖 Linux 内核网络栈和 iptables/nftables/ebpf 实现流量控制。所谓“路由策略”,在 Docker 场景中实际指基于网络拓扑、策略驱动规则与数据平面干预的组合式流量调度与限制手段。真正能落地的业务流量控制,关键不在“路由”二字,而在网络分域 + 规则注入 + 协议感知三层协同。
以下从实战角度拆解可直接操作的路径:
用自定义桥接网络划分业务通信域
同一网络内容器默认互通,跨网络默认隔离——这是最轻量、最稳定的流量边界控制方式。 - 创建业务专属网络,避免混用默认 bridge ```bash docker network create --driver bridge --subnet=10.10.1.0/24 payment-net docker network create --driver bridge --subnet=10.10.2.0/24 user-net ``` - 启动服务时显式指定网络,天然隔离: ```bash docker run -d --name pay-svc --network payment-net alpine:latest docker run -d --name user-api --network user-net nginx:alpine ``` - 效果:`pay-svc` 和 `user-api` 默认无法 ping 通或建立 TCP 连接,无需额外防火墙规则。通过 iptables/nftables 在宿主机层做细粒度转发与限速
Docker 的 `docker0` 网桥及各 veth 接口均暴露在宿主机命名空间,可直接用系统工具管控: - 限制某容器出向带宽(以 `pay-svc` 容器 IP `10.10.1.2` 为例): ```bash tc qdisc add dev docker0 root handle 1: htb default 10 tc class add dev docker0 parent 1: classid 1:1 htb rate 1mbit tc filter add dev docker0 protocol ip parent 1:0 u32 match ip dst 10.10.1.2 flowid 1:1 ``` - 拦截特定 HTTP 路径请求(需容器开启 `NET_ADMIN`): ```bash iptables -t filter -A FORWARD -s 10.10.1.2 -d 10.10.2.3 -p tcp --dport 80 \ -m string --string "POST /transfer" --algo bm -j DROP ``` 注意:这类规则作用于宿主机 `FORWARD` 链,需确认 `net.bridge.bridge-nf-call-iptables=1` 已启用。升级到 Docker 27 启用 eBPF 策略引擎实现应用层控制
若运行 Docker 27+(内核 ≥5.15),可跳过 iptables,直接定义语义化策略: - 创建带策略标签的网络: ```bash docker network create --driver bridge \ --label policy.enforce=strict \ --opt com.docker.network.bridge.enable_ip_masquerade=false \ api-net ``` - 运行容器并附加路径级访问控制(YAML 声明): ```yaml # policy.yaml apiVersion: networking.docker.io/v1 kind: NetworkPolicy metadata: name: payment-api-policy spec: podSelector: matchLabels: app: pay-svc ingress: - from: - podSelector: matchLabels: app: gateway ports: - protocol: TCP port: 80 http: # Docker 27 新增字段 method: POST pathPrefix: "/v1/transactions" ``` - 加载策略: ```bash docker network policy apply -f policy.yaml api-net ``` 此时,只有带 `app=gateway` 标签的容器,且仅对 `/v1/transactions` 的 POST 请求才放行,其余全部拦截——毫秒级生效,无需 reload。结合 Docker Compose 多网络定义实现混合流量拓扑
适用于微服务场景下的“可控连通”: - 在 `docker-compose.yml` 中定义前端、后端、数据库三张网: ```yaml networks: frontend: { driver: bridge } backend: { driver: bridge } db-only: { driver: bridge, internal: true } # internal=true 禁止外联 services: web: networks: [frontend, backend] api: networks: [backend, db-only] db: networks: [db-only] ``` - 效果: - `web` 可访问 `api`(同属 backend) - `api` 可访问 `db`(同属 db-only) - `web` 无法直连 `db`(无共同网络) - 外部无法访问 `db-only` 网络中任何服务不复杂但容易忽略











