postman 查询在 docker 容器中运行的 gRPC 服务时出错

问题描述 投票:0回答:1

TLDR:> 我无法让邮递员成功查询在 docker 容器中运行的 gRPC 服务。

我有带有 gRPC 端点的 C#/dotnet 服务器。当我在本地运行服务器(也称为桌面 shell)时,我可以使用 postman 进行 gRPC 调用并成功获得预期响应。 (参见屏幕截图

但是,当我尝试使用邮递员查询在 docker 容器中运行的同一服务器时,它失败并出现错误

Operation cancelled
。 (见截图

我的 docker compose 文件是这样构建的:

version: '3.8'
name: boot_node
services:
  boot-node:
    container_name: boot-node
    build:
      context: .
      dockerfile: boot_node.dockerfile
    ports:
      - "8080:8080"
      - "50051:50051"
    volumes:
      - ./app:/app
    networks:
      - ironbar-network

networks:
  ironbar-network:
    driver: bridge

和我的 docker 文件

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env

WORKDIR /node_dir

COPY ./src ./src

WORKDIR /node_dir/src
RUN dotnet restore
RUN dotnet publish -c Release -o /node_dir/bin

EXPOSE 443
EXPOSE 80
EXPOSE 50051 

WORKDIR /node_dir/bin
ENTRYPOINT ["dotnet", "node.dll"]

看起来端口正常可用

d:\engineering\dotnet\ironbar\src\node>docker container ls
CONTAINER ID   IMAGE                 COMMAND             CREATED          STATUS         PORTS                                                               NAMES
2ab951699288   boot_node-boot-node   "dotnet node.dll"   23 minutes ago   Up 6 seconds   80/tcp, 0.0.0.0:8080->8080/tcp, 443/tcp, 0.0.0.0:50051->50051/tcp   boot-node

我已经尝试过:

  • 关闭防火墙
  • 使用 10.0.0.106 和 host.docker.internal 代替 localhost(来自我的主机文件)
  • 代替 localhost,使用 172.18.0.2,这是从 docker 检查中找到的 boot_node_ironbar-network 的 IP 地址(这给了我一个 14 unavailable 错误)
  • 回顾了我的工作到此来源链接

我想我已经发布了所有相关内容。整个代码库可以在 github 上找到。

是否可以使用postman查询docker容器中运行的gRPC服务?如果是这样,我无法成功调用该服务是什么问题?

c# docker docker-compose grpc
1个回答
0
投票

解决方案是更改我在 gRPC 端口上设置 Kestrel 侦听的方式。我需要监听 0.0.0.0(任何)而不是 localhost。

EG:

builder.WebHost.ConfigureKestrel(kestrelOptions =>
{               
    kestrelOptions.Listen(IPAddress.Any, configurationOptions.RPCPort, o => o.Protocols = HttpProtocols.Http2);
});
© www.soinside.com 2019 - 2024. All rights reserved.