关键在于避开默认网段重叠、使用自定义网络替代bridge、收敛端口映射、清理冗余网络与路由;需停Docker、删docker0、修改daemon.json指定bip与default-address-pools、创建带subnet的自定义网络、内部服务不映射端口、对外统一走反向代理。

解决 Docker 容器网络配置带来的资源开销与冲突问题,关键在于避免默认行为的“自动分配陷阱”,从源头控制子网范围、隔离通信路径、减少路由干扰。不是调高资源限制,而是精简网络结构。
避开默认网段重叠
Docker 默认用 172.17.0.0/16 创建 docker0 网桥,一旦宿主机或内网也用了 172.17.x.x(比如办公网段、云服务器 VPC),就会抢路由、丢包、失联。
- 停掉 Docker:
sudo systemctl stop docker - 删旧网桥:
sudo ip link set docker0 down && sudo ip link delete docker0 - 改配置文件
/etc/docker/daemon.json,指定干净网段:{ "bip": "10.255.0.1/24", "default-address-pools": [{"base":"10.255.1.0/16","size":24}] } - 重启服务:
sudo systemctl start docker
用自定义网络替代默认 bridge
默认 bridge 网络不隔离、不固定、不支持子网声明,多个 compose 项目共用时极易 IP 冲突或跨项目误通。
- 创建带明确子网的网络:
docker network create --subnet=10.255.10.0/24 --gateway=10.255.10.1 myapp-net - 启动容器时绑定:
docker run --network=myapp-net --ip=10.255.10.5 nginx - 在 docker-compose.yml 中显式声明:
networks:<br> app-net:<br> driver: bridge<br> ipam:<br> config:<br> - subnet: 10.255.11.0/24
端口映射冲突要主动收敛
不是所有服务都需要暴露到宿主机。盲目用 -p 80:80 或 -p 3306:3306 会挤占端口、触发 iptables 规则膨胀、增加 NAT 开销。
- 内部服务(如 Redis、RabbitMQ)不映射端口,只靠自定义网络互通
- 对外服务统一走反向代理(Nginx / Traefik),宿主机只开 80/443
- 必须调试时用临时映射:
docker run -p 127.0.0.1:8080:80 nginx,限制仅本地访问 - 查谁占了端口:
sudo ss -tulpn | grep ':3306'或lsof -i :8080
清理冗余网络与残留路由
反复启停、失败的 compose 部署常留下未删除的网络和错误路由,长期积累导致 docker network ls 越来越长、ip route 出现多条 172.x.x.x 冲突项。
- 删无用网络:
docker network prune(确认无运行中容器依赖) - 查异常路由:
ip route | grep '172\|192\.168' | grep -v 'docker0\|cni0' - 手动删错路由(如残留的
172.17.0.0/16 via ...):sudo ip route del 172.17.0.0/16 - 检查容器实际 IP 分配:
docker inspect CONTAINER_NAME | jq '.[0].NetworkSettings.Networks'


















