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
相关产品推荐
相关产品推荐

