Docker Compose 默认使用用户自定义bridge网络而非默认docker0;推荐显式定义driver: bridge的自定义网络(如app-net),以实现可控、可复用、可调试的容器通信,避免依赖不可控的_default网络。
docker compose 默认就是桥接(bridge)模式,不需要额外指定驱动——只要不写 network_mode: host 或 network_mode: none,它自动使用用户自定义的 bridge 网络。
真正需要你主动操作的,是显式定义并使用一个 bridge 类型的自定义网络,而不是依赖默认网络。这样更可控、可复用,也便于调试和隔离。
明确声明 bridge 网络(推荐做法)
在 docker-compose.yml 中用 networks 字段定义,并设 driver: bridge:
version: '3.8'
services:
web:
image: nginx
networks:
- app-net
db:
image: postgres
networks:
- app-net
networks:
app-net:
driver: bridge
这个配置会创建名为 app-net 的桥接网络,web 和 db 都接入其中,能通过服务名(如 ping db)互相访问。
使用默认 bridge 网络(不推荐用于生产)
如果你什么网络都不写,Compose 会自动创建一个名为 的 bridge 网络,所有服务都加入其中:
version: '3.8'
services:
web:
image: nginx
db:
image: postgres
这也能通信,但名字不可控、无法设置子网或 IP 段,也不方便多环境复用。
注意两个常见误区
-
❌ 不要混用
networks和network_mode: bridgenetwork_mode: bridge是老式配置,指向 Docker 默认的docker0网桥,和networks定义的用户自定义网络互斥,同时写会报错。 ✅ 想控制 IP 分配?加子网和网关:
networks:
app-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
gateway: 172.20.0.1
这样容器启动时会从该子网自动分配 IP,web 和 db 就能稳定获得 172.20.x.x 段地址。
验证是否生效
启动后执行:
docker network ls | grep app-net docker inspect <container-id> | grep IPAddress</container-id>
再进容器 docker exec -it web sh,尝试 ping db —— 能通说明 bridge 网络已正确建立并解析服务名。
不复杂但容易忽略











