.NET 8.0 WebAPI/Swagger Docker部署后拒绝连接问题
问题分析与解决方法
核心问题
从日志可见,你的.NET 8应用在容器内实际监听的是8080端口,但Docker端口映射是将宿主机8860端口转发到容器的80端口,端口不匹配导致连接失败。
.NET 8的ASP.NET Core基础镜像默认行为与.NET 7存在差异:.NET 7的aspnet镜像默认监听80端口,而.NET 8镜像默认改为监听8080端口,这是引发问题的关键原因。
解决方法(二选一即可)
方法1:调整Docker端口映射规则
停止当前容器后,重新运行时将宿主机端口转发到容器的8080端口:
docker run -p 8860:8080 myapi
如果使用Docker Compose,修改ports配置项:
ports: - "8860:8080"
方法2:配置应用在容器内监听80端口(与.NET 7保持一致)
有两种实现方式:
- 通过Dockerfile设置环境变量:在
ENTRYPOINT前添加环境变量指定监听端口:FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env 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 # 指定应用监听80端口 ENV ASPNETCORE_URLS=http://+:80 RUN chmod -R 755 /app COPY --from=build-env /app/out . ENTRYPOINT ["dotnet", "myapi.dll"] - 在应用代码中明确配置:在
Program.cs里指定监听端口:var builder = WebApplication.CreateBuilder(args); // 其他配置代码... var app = builder.Build(); // 中间件配置代码... app.Run("http://+:80");
验证步骤
修改完成后重新构建镜像并启动容器,查看日志确认监听端口与映射端口一致,再访问http://1.2.3.4:8860即可正常连接。
内容的提问来源于stack exchange,提问作者SwissDev
相关产品推荐
相关产品推荐

