首页 > 解决方案 > 如何在 docker 容器中运行 .net core grpc?

问题描述

您好我已经使用 .Net 5 创建了 GRPC 项目。下面是我的 Docker 文件。

FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ./*.sln ./
COPY */*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p ${file%.*} && mv $file ${file%.*}; done
RUN dotnet restore
COPY . .
WORKDIR "/src/Geography"
RUN dotnet build "Geography.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Geography.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Geography.dll"]

我尝试使用 Docker 在 Visual Studio 中运行解决方案,我看到容器已启动并正在运行。我看到下面暴露的端口。

 0.0.0.0:32775->80/tcp, 0.0.0.0:32774->443/tcp

我创建了客户端应用程序并尝试点击如下 grpc 端点。

using var channel = GrpcChannel.ForAddress("http://localhost:32774");
var client = new Geographys.GeographysClient(channel);

在这里我得到以下错误

Status(StatusCode="Internal", Detail="Error starting gRPC call. HttpRequestException: 发送请求时出错。IOException: 无法从传输连接中读取数据: 现有连接被远程主机强行关闭.. SocketException : 现有连接被远程主机强行关闭。", DebugException="System.Net.Http.HttpRequestException: 发送请求时出错。---> System.IO.IOException: 无法从传输中读取数据连接:现有连接被远程主机强行关闭.. --->

有人可以帮助我了解这个问题的根本原因吗?任何帮助将不胜感激。谢谢

标签: dockerasp.net-coregrpc

解决方案


您确定您的 .NET 代码在容器端口上公开了一个非 TLS HTTP 端点,80并在 .NET 上公开了一个 TLS HTTP 端点443吗?

32775我怀疑不是这样,这可以解释为什么当端口绑定到主机(分别在主机上和32774分别)时,您无法通过端口访问服务。

注意您的客户端代码尝试访问http://localhost:32774可能映射到容器的 TLS 端点 ( :443),因此您需要使用https://和配置证书。

如果你在主机上运行 Linux,你可以尝试 telnet'ing 到这些端口,看看你是否得到响应:

telnet localhost 32775
telnet localhost 32774

如果您有gRPCurl(并且 IMO 应该适用于任何 gRPC 开发人员),您可以尝试列出方法:

grpcurl \
-plaintext \
-proto path/to/your.proto \
localhost:32775 \
list

grpcurl \
-plaintext \
-proto path/to/your.proto \
localhost:32774 \
list

注意我认为这grpcurl对于 TLS 和非 TLS 都是正确的,但是无法测试


推荐阅读