Docker Compose实现容器间通信的核心机制是自动创建隔离的自定义bridge网络并集成内置DNS服务,使服务可通过名称直接互通,无需手动配置IP或修改hosts;默认情况下所有服务加入Compose自建bridge网络,启用服务名解析;支持多网络隔离与动态跨网连接。

默认网络:开箱即用的服务名通信
只要不显式声明网络,Compose 启动的所有服务会自动加入一个由它创建的默认 bridge 网络。该网络启用了 Docker 内置 DNS,服务名即主机名。
- 服务 A(如 web)可直接用
curl http://api:3000访问服务 B(api) - 服务名解析由 Docker 守护进程实时维护,无需额外工具
- 端口只需在容器内监听(如 api 监听 3000),无需宿主机暴露即可被同网服务访问
多网络隔离:按需划分通信边界
当需要控制哪些服务能互相访问时(例如数据库只允许后端访问、禁止前端直连),应定义多个自定义网络并精确挂载。
- 在
networks:区块声明多个网络,如frontend、backend - 每个服务通过
networks:列表选择接入哪些网络 - 只有至少共有一个网络的服务才能通信;无共同网络则完全隔离
示例结构:
services:
web:
image: nginx
networks: [frontend]
api:
image: my-api
networks: [frontend, backend]
db:
image: postgres
networks: [backend]
networks:
frontend:
driver: bridge
backend:
driver: bridge
跨网络连接:动态扩展已有容器网络
运行中的容器也能临时加入新网络,适用于调试或临时打通链路。
- 使用
docker network connect <network-name> <container-name> - 连接后,该容器立即获得目标网络的 DNS 解析能力和服务发现
- 例如:把已运行的
monitoring容器接入backend网络,以便采集 db 指标
避免常见通信失败
多数连通问题源于配置疏漏而非网络本身故障。
-
别用默认 bridge 网络:手动用
docker run启的容器若没指定自定义网络,无法被 Compose 服务通过名称访问 -
检查服务启动顺序:DNS 解析依赖服务已就绪;可用
healthcheck+depends_on控制依赖逻辑 -
确认端口监听地址:应用需监听
0.0.0.0:port而非127.0.0.1:port,否则仅本容器内可访问 -
验证 DNS 是否生效:进入容器执行
nslookup api或getent hosts api


















