使用Docker运行ASP.NET Core Web API时遇连接拒绝问题求助
问题描述
我使用Visual Studio创建了一个ASP.NET Core Web API项目,并添加了自定义Dockerfile:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /app COPY *.csproj ./ RUN dotnet restore COPY . . RUN dotnet publish -c Release -o out FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY --from=build /app/out ./ EXPOSE 80 ENTRYPOINT ["dotnet", "weatherapplication.dll"]
尝试通过以下命令运行该应用:
docker build -t weatherapplication . docker run -dp 127.0.0.1:4003:80 weatherapplication
但在浏览器中访问http://localhost:4003/weatherforecast时,显示“ERR_CONNECTION_REFUSED”错误。
排查与解决步骤
核对DLL文件名是否正确
ENTRYPOINT中指定的weatherapplication.dll必须和项目发布后的实际DLL名称完全一致(注意大小写)。可以进入容器查看文件列表确认:docker exec -it <容器ID> ls /app如果文件名不匹配,直接修改ENTRYPOINT中的DLL名称即可。
检查容器内服务启动状态
通过容器日志排查服务启动是否报错:docker logs <容器ID>日志中如果出现找不到DLL、配置文件错误、端口占用等信息,针对性修复即可。
验证端口映射与容器运行状态
先确认容器是否正常运行:docker ps查看STATUS列是否为
Up状态。如果是,可尝试修改端口映射为0.0.0.0:4003:80,避免仅绑定本地回环地址导致的访问限制:docker run -dp 0.0.0.0:4003:80 weatherapplication之后重新访问接口地址。
检查ASP.NET Core监听配置
确认项目的Program.cs或appsettings.json中,服务监听的端口和地址是否正确。比如Program.cs中如果有类似以下代码:app.Run("http://0.0.0.0:5000");说明容器内服务实际监听5000端口,此时需要将端口映射改为
4003:5000。确保服务监听0.0.0.0:80才能让容器正常转发请求。排查本地防火墙与代理干扰
本地防火墙可能会拦截4003端口的请求,可暂时关闭防火墙测试;或者更换一个未被占用的端口重新运行容器:docker run -dp 127.0.0.1:4004:80 weatherapplication同时检查是否有VPN、代理软件干扰了本地请求。
内容的提问来源于stack exchange,提问作者Aleksander Chelpski

