多服务互通失败核心三点:网络连通、服务名可解析、端口暴露且可达;需按顺序排查——先确认同网络,再验证DNS解析,最后检查服务监听与端口访问。
多服务互通失败,核心就三点:网络是否连通、服务名能否解析、端口是否暴露且可访问。不是所有“ping不通”都该先查网络,得按逻辑顺序一层层验证。
确认服务是否在同一个网络里
Docker Compose 默认为整个项目创建一个专属桥接网络,所有服务自动接入。但一旦你手动加了 networks 配置,就容易出问题——比如只给 web 加了自定义网络,db 却没写,那它们实际不在同一张网里。
- 运行 docker network ls,找名字含项目名的网络(如 myapp_default)
- 用 docker network inspect myapp_default 查看里面有没有你关心的两个服务容器
- 如果某个服务没出现在列表里,说明它没接入这个网络,检查 docker-compose.yml 中该服务的 networks 字段是否遗漏或拼错
验证服务名能否被正确解析
容器之间靠服务名通信(比如 web 要连 db,就用 db:5432),这依赖 Docker 内置 DNS。DNS 失败,再通的网络也没用。
- 进其中一个容器:docker-compose exec web sh
- 执行 nslookup db 或 ping -c 2 db,看能否解析并通
- 如果报 server can't find db,常见原因是服务名大小写不一致、拼错,或者用了 container_name 却没配 aliases
- 注意:depends_on 不影响 DNS,只控制启动顺序;DNS 生效的前提是容器已加入同一网络
检查目标服务是否真在监听、端口是否可达
能解析服务名 ≠ 服务已就绪。数据库可能容器起来了,但 PostgreSQL 还在初始化,端口暂时没开;Web 服务可能监听了 127.0.0.1:8080,导致其他容器连不上(必须监听 0.0.0.0)。
- 进 db 容器:docker-compose exec db sh,运行 netstat -tuln | grep :5432,确认端口在监听且绑定的是 0.0.0.0 或 *
- 从 web 容器里尝试直连:telnet db 5432(若无 telnet,可用 apk add busybox-extras && telnet db 5432)
- 连接失败但端口显示监听?可能是服务健康检查没配好,或应用本身启动慢——这时要加 healthcheck 并配合 condition: service_healthy
别漏掉防火墙和宿主机端口映射干扰
虽然容器间通信走 Docker 内部网络,一般不受宿主机防火墙影响,但某些 Linux 发行版(如 CentOS Stream)默认启用 firewalld,可能拦截跨容器流量;另外,如果你把服务端口映射到宿主机(如 ports: ["8080:80"]),而本地又起了另一个进程占了 8080,Compose 启动会卡住或报错,间接导致服务没起来。
- 临时关 firewalld 测试:sudo systemctl stop firewalld
- 检查宿主机端口占用:lsof -i :8080 或 ss -tuln | grep :8080
- 确认 ports 是给外部访问用的,容器间通信不需要也不应该依赖它


















