Docker Compose容器通信失败:测试脚本无法访问server-test服务
以下是可能导致连接失败的原因及对应的排查/解决步骤:
1. depends_on仅保证容器启动,不保证服务就绪
Docker Compose的depends_on只会等待server-test容器启动完成,但不会等待容器内的Node服务完全初始化并开始监听端口。当tester启动时,server-test的服务可能还没准备好接收请求,直接导致连接被拒绝。
解决办法:
在tester的启动流程中添加等待逻辑,确保服务就绪后再执行测试:
- 方式一:集成
wait-for-it脚本到tester镜像中
修改tester的Dockerfile:# 在COPY步骤前添加 ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /usr/local/bin/wait-for-it.sh RUN chmod +x /usr/local/bin/wait-for-it.sh # 修改CMD CMD wait-for-it.sh server-test:38478 -- yarn jest - 方式二:在
docker-compose.yml中直接添加轮询逻辑tester: # ...其他配置 command: sh -c "until curl -s http://server-test:38478/testing/clearDb; do sleep 1; done; yarn jest"
2. server-test容器未持续运行服务
检查server-test的启动命令yarn server secret是否为长期运行的服务启动命令。如果该命令是一次性任务(比如仅生成密钥后就退出),容器会直接停止,导致tester无法连接。
验证方式:
- 执行
docker compose ps server-test查看容器状态,若状态为Exited则说明服务未持续运行 - 查看容器日志:
docker compose logs server-test,确认命令执行结果
解决办法:
修改server-test的command为真正启动服务的命令,比如yarn start或pm2 start <服务入口文件>,确保容器保持运行状态。
3. 确认server-test服务实际监听的端口与地址
虽然Dockerfile中声明了EXPOSE 38478/tcp,但需确认Node服务代码中确实监听38478端口,且绑定地址为0.0.0.0(而非localhost,否则容器外部无法访问)。
验证方式:
- 进入
server-test容器:docker compose exec server-test bash - 安装
net-tools(若未安装):apt install net-tools,然后执行netstat -tulpn,查看是否有进程监听0.0.0.0:38478
解决办法:
检查Node服务的配置文件或启动参数,确保端口设置为38478,监听地址为0.0.0.0。
4. 检查server-test容器是否正常运行
如果server-test容器启动失败或崩溃,tester自然无法连接。
验证方式:
- 执行
docker compose ps查看所有容器状态,确保server-test的状态为Up - 查看启动日志:
docker compose logs server-test,排查是否有启动错误(如依赖缺失、配置错误等)
5. 确认容器在同一网络中
Docker Compose默认会为项目创建共享网络,但如果手动修改过网络配置,可能导致tester和server-test不在同一网络,无法通过服务名通信。
验证方式:
- 执行
docker network ls找到当前项目的网络,然后执行docker network inspect <网络名称>,确认两个容器都在该网络中
解决办法:
如果网络配置异常,删除现有网络后重新启动:docker compose down -v,再执行docker compose up -d server-test
内容的提问来源于stack exchange,提问作者djfm

