生产环境应使用自定义bridge网络而非默认docker0:创建带子网/网关的网络(如172.25.0.0/16),启用内置DNS实现服务名通信,关键服务可固定IP,所有容器显式加入同一网络,仅入口服务映射端口,后台服务禁止暴露,统一用Docker Compose编排。

生产环境用 Docker Bridge 网络,核心不是“能不能用”,而是“怎么用得稳、查得清、扩得开”。默认的 docker0 网桥不推荐直接用于多服务协作——它缺乏服务发现、IP 不固定、安全隔离弱。真正落地要靠自定义 bridge 网络 + 显式编排 + 合理暴露策略。
必须创建自定义 bridge 网络
默认 bridge 网络不支持容器名解析,重启后 IP 变化会导致服务调用中断。自定义网络内置 DNS,容器能直接用服务名通信,这是生产级稳定性的基础。
- 创建带子网和网关的网络,避免与宿主机或其他系统网段冲突:
docker network create --driver bridge --subnet 172.25.0.0/16 --gateway 172.25.0.1 prod-net - 为关键服务预留固定 IP(可选但推荐):
docker run -d --name db --network prod-net --ip 172.25.0.10 -e MYSQL_ROOT_PASSWORD=xxx mysql:8.0 - 所有业务容器必须显式加入该网络,禁止混用默认
bridge或host模式
容器间通信只走内部网络
Web、API、DB、Cache 等服务应部署在同一个自定义 bridge 网络中,彼此通过服务名访问,不依赖端口映射或外部 DNS。
- 例如:应用容器内执行
curl http://db:3306或ping redis应能通 - 验证方式:
docker exec -it app-container nslookup db—— 正常应返回172.25.0.x地址 - 禁止在容器内硬编码 IP;若需连接外部系统(如 SaaS 接口),走宿主机 outbound 路由即可,无需特殊配置
对外暴露严格按需控制
Bridge 模式下,容器端口默认不对外可见。生产环境必须明确区分“内部通信”和“外部访问”,避免过度暴露。
- 仅入口服务(如 Nginx、API 网关)使用
ports映射到宿主机:-p 443:443 -p 80:80 - 后台服务(如订单处理、消息消费者)完全不映射端口,仅保留在自定义网络内可访问
- 如需调试,临时用
docker exec -it container-name sh进入排查,而非开放管理端口
配合 Docker Compose 统一管理
手工运行容器难维护、易出错。生产环境建议用 docker-compose.yml 固化网络拓扑和依赖关系。
- 示例片段:
version: '3.8' services: web: image: nginx:alpine ports: ["80:80", "443:443"] networks: [prod-net] api: image: myapp/api:v2.3 networks: [prod-net] redis: image: redis:7-alpine networks: [prod-net] networks: prod-net: driver: bridge ipam: config: - subnet: 172.25.0.0/16 gateway: 172.25.0.1 - 启动后所有服务自动加入
prod-net,api可直接redis://redis:6379连接 - 网络名称、子网、服务名全部声明清晰,便于交接与审计


















