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

NestJS+gRPC微服务部署Docker遇14 UNAVAILABLE连接错误求助

问题排查与解决方案

这个错误的核心原因是Docker容器的网络隔离特性——你代码里使用的127.0.0.1在容器环境中仅指向容器自身,无法跨容器访问其他服务。以下是具体修复步骤:

1. 修改用户服务的gRPC监听地址

用户服务当前仅监听容器内部的127.0.0.1,导致网关服务无法从外部容器访问。需要改为监听所有网卡(0.0.0.0):

const app = await NestFactory.createMicroservice<MicroserviceOptions>(
    UserServiceModule,
    {
      transport: Transport.GRPC,
      options: {
        package: USER_PACKAGE_NAME,
        protoPath: join(__dirname, '.././user.proto'),
        url: '0.0.0.0:50001', // 替换为0.0.0.0
      },
    },
);

2. 修改网关服务的gRPC连接地址

网关服务需要通过Docker Compose的服务名(user-service)访问用户服务,而非127.0.0.1:

@Module({
  imports: [
    ClientsModule.register([
      {
        name: USER_PACKAGE_NAME,
        transport: Transport.GRPC,
        options: {
          package: USER_PACKAGE_NAME,
          protoPath: join(__dirname, '.././user.proto'),
          url: 'user-service:50001', // 替换为服务名+端口
        },
      },
    ]),
  ],
  controllers: [GatewayServiceController],
  providers: [GatewayServiceService],
})

3. 可选:在docker-compose中暴露用户服务端口(用于宿主机调试)

如果需要从宿主机直接访问用户服务的gRPC端口,可在user-service配置中添加端口映射:

user-service:
  # ... 其他配置不变
  ports:
    - "50001:50001" # 添加端口映射

原理说明

  • Docker Compose创建的自定义网络(sgod_network)会为每个服务分配独立IP,且支持通过服务名做DNS解析,user-service会自动指向用户服务容器的IP。
  • 0.0.0.0表示监听容器所有网络接口,允许同一Docker网络内的其他容器发起连接。

内容的提问来源于stack exchange,提问作者Đức Nguyễn Đức

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:13:31