You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose容器间调用失败:ECONNREFUSED 127.0.0.1:8081求助

问题排查与解决方案

核心问题定位

错误显示连接127.0.0.1:8081被拒绝,但你的客户端配置里指定的host是abha-services,这说明实际发起请求的目标地址被覆盖成了localhost,或者服务启动顺序、监听配置存在问题。

可能的原因及修复步骤

1. 环境变量覆盖客户端配置

检查你的.env文件,是否存在类似ABHA_SERVICE_HOST=127.0.0.1或其他覆盖客户端host配置的变量。如果NestJS客户端代码实际通过环境变量读取host(而非硬编码),就会导致请求指向容器内部的localhost,而非目标服务容器。

验证方法:
进入parchaa-ndhm容器,打印相关环境变量:

docker exec -it parchaa-ndhm printenv | grep -i abha

如果输出包含指向127.0.0.1的变量,修改.env文件将其改为abha-services,然后重启容器。

2. 服务启动顺序未保证就绪

你的parchaa-ndhm服务未配置depends_on依赖abha-services,即使配置了depends_on,Docker也只保证容器启动顺序,不保证服务内部完全就绪(比如NestJS微服务完成初始化)。

修复方法:

  • 在parchaa-ndhm的docker-compose配置中添加depends_on:
    parchaa-ndhm:
      # ...其他配置
      depends_on:
        - abha-services
        - user-services
    
  • 额外添加启动等待逻辑(可选但推荐):在parchaa-ndhm的启动脚本中,先检查abha-services的8081端口是否可用,再启动服务。可以手动创建wait-for-it.sh脚本放入项目,内容如下:
    #!/usr/bin/env bash
    # wait-for-it.sh
    
    set -e
    
    host="$1"
    shift
    port="$1"
    shift
    cmd="$@"
    
    until nc -z "$host" "$port"; do
      >&2 echo "$host:$port is unavailable - sleeping"
      sleep 1
    done
    
    >&2 echo "$host:$port is up - executing command"
    exec $cmd
    
    然后修改parchaa-ndhm的Dockerfile和启动命令:
    # Dockerfile中添加
    COPY wait-for-it.sh /usr/src/app/wait-for-it.sh
    RUN chmod +x /usr/src/app/wait-for-it.sh
    
    # docker-compose中修改command
    command: /usr/src/app/wait-for-it.sh abha-services:8081 -- npm run start parchaa-ndhm
    

3. 验证abha-services的监听状态

确认abha-services确实在8081端口监听,并且服务已完全启动:

  • 查看abha-services的容器日志,确认是否输出了abha-services started:
    docker logs abha-services
    
  • 进入abha-services容器,检查端口监听情况:
    docker exec -it abha-services netstat -tulpn | grep 8081
    
    如果没有监听记录,检查bootstrap代码中的端口配置是否正确,或者是否有其他进程占用了8081端口。

4. Docker网络连通性测试

验证两个容器之间的网络连通性:

  • 从parchaa-ndhm容器ping abha-services:
    docker exec -it parchaa-ndhm ping abha-services
    
    如果ping不通,检查my_network网络是否正常创建,所有容器是否都加入了该网络:
    docker network inspect my_network
    
    确认输出中的Containers列表包含两个服务的容器ID。

5. 检查NestJS微服务配置匹配性

确认客户端和服务端的Transport配置完全一致:

  • 服务端使用Transport.TCP,客户端也必须使用相同的Transport,你的代码中已经匹配,但如果有额外TCP配置选项,需保证两边一致。
  • 服务端设置host: '0.0.0.0'是正确的,这样可以监听容器内所有网卡,保证同一网络的其他容器可以访问。

总结

优先排查环境变量是否覆盖了host配置和服务启动顺序/就绪状态,这是最常见的原因。如果以上步骤都无法解决,可以尝试删除所有容器和网络,重新构建启动:

docker-compose down -v
docker-compose up --build

内容的提问来源于stack exchange,提问作者Rajveer -parchaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:52:13