在Docker中运行.NET Core 2.0 Web API时遭遇连接拒绝问题
解决Docker中.NET Core Web API连接拒绝问题
嘿,我来帮你排查这个Docker容器里.NET Core API连接拒绝的问题!结合你描述的本地正常、容器异常的情况,还有给出的Dockerfile片段,我整理了几个最可能的原因和对应的解决步骤:
1. Dockerfile可能未完成多阶段构建(缺少运行阶段)
你贴出的Dockerfile只到RUN dotnet restore的构建阶段,没有把编译好的应用发布到轻量的运行镜像里。完整的多阶段构建应该包含发布和运行环节,示例如下:
# 构建阶段:编译并发布应用 FROM microsoft/dotnet:2.0-sdk as builder ENV DOTNET_CLI_TELEMETRY_OPTOUT 1 WORKDIR /app COPY . ./ RUN dotnet restore PickCashOut.API/PickCashOut.Web.csproj RUN dotnet publish PickCashOut.API/PickCashOut.Web.csproj -c Release -o /publish # 运行阶段:用轻量运行镜像启动应用 FROM microsoft/dotnet:2.0-aspnetcore-runtime WORKDIR /app COPY --from=builder /publish . # 强制应用监听所有网络接口,适配容器网络环境 ENV ASPNETCORE_URLS=http://0.0.0.0:80 ENTRYPOINT ["dotnet", "PickCashOut.Web.dll"]
如果只停留在构建阶段,容器里只是SDK环境,并没有正确启动你的API服务,自然会出现连接拒绝。
2. 运行容器时未配置端口映射
本地运行时API监听80端口,但容器的网络是隔离的,你需要把容器内的80端口映射到主机的某个端口(比如5000)。运行容器时必须添加端口映射参数:
docker run -p 5000:80 你的镜像名称/镜像ID
之后访问http://localhost:5000就能正常连接了,如果没加-p参数,主机根本无法访问容器内的端口,必然会出现连接拒绝。
3. 检查容器内应用是否正常启动
如果上面两步都做了还是有问题,可以先查看容器的运行日志,确认API服务有没有正常启动:
docker logs 你的容器ID/容器名称
如果日志里没有出现类似本地的Application started. Press Ctrl+C to shut down.提示,说明应用在容器内启动失败,可能是发布路径错误、dll名称写错,或者依赖缺失,这时候需要核对dotnet publish的输出路径和ENTRYPOINT里的dll文件名是否一致。
按照这几个步骤排查,应该能解决你的连接拒绝问题!
内容的提问来源于stack exchange,提问作者Mjollnir951
相关产品推荐
相关产品推荐

