Windows下Docker运行.NET Core 6.0 Web API无法访问问题求助
问题根因
- 核心故障点:从启动日志
Now listening on: http://localhost:80可以确认,Kestrel服务仅绑定了容器内部的回环地址127.0.0.1。Docker的端口转发规则只会把宿主机请求转发到容器的虚拟网卡地址,无法转发到容器内部回环地址,因此宿主机通过映射的5000端口发起的请求根本无法到达服务。 - 配置缺陷1:Dockerfile多阶段构建配置错误,运行时阶段误用了体积庞大的SDK镜像,没有使用专门为ASP.NET Core运行时优化的轻量镜像,从日志显示的内容根路径
C:\app\还能看出,当前拉取的镜像和容器运行环境存在系统匹配问题。 - 配置缺陷2:应用当前运行在
Production环境,代码中Swagger页面仅在Development环境下启用,就算端口连通,直接访问站点根路径也会返回404,容易被误判为服务未启动。
解决方法
1. 修正Kestrel监听地址
两种方案二选一即可:
- 无需改代码,启动容器时通过环境变量指定服务监听所有网卡地址:
docker run -d -p 5000:80 -e ASPNETCORE_URLS="http://+:80" web-app
- 修改Program.cs,硬编码配置Kestrel默认监听所有地址,无需每次启动加环境变量:
在构建WebApplication的代码前添加配置:
var builder = WebApplication.CreateBuilder(args); // 新增监听地址配置 builder.WebHost.UseUrls("http://0.0.0.0:80"); // 后续原有服务注册代码保持不变 builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // ...其余原有代码不变
配置生效后,启动日志会显示Now listening on: http://0.0.0.0:80,代表监听地址配置正常。
2. 修正Dockerfile配置
替换运行时阶段的基础镜像,移除冗余的路径切换逻辑,修正后的Dockerfile如下:
# 运行时阶段使用ASP.NET Core专用轻量镜像,替换原有的SDK镜像 FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 # 构建阶段保留SDK镜像用于编译发布 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY *.csproj . RUN dotnet restore "WebApp.csproj" COPY . . # 移除冗余的WORKDIR切换,直接在当前目录执行构建 RUN dotnet build "WebApp.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "WebApp.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "WebApp.dll"]
修改完成后重新执行构建命令生成新镜像:
docker build --pull -t web-app .
3. 访问验证
启动新容器后,不要直接访问站点根路径,先访问已存在的控制器接口(比如默认模板自带的http://localhost:5000/WeatherForecast)验证连通性。如果需要在生产环境访问Swagger页面,可移除Program.cs中app.UseSwagger()和app.UseSwaggerUI()外层的if (app.Environment.IsDevelopment())判断,注意生产环境暴露Swagger存在接口信息泄露风险。
内容的提问来源于stack exchange,提问作者Stack
相关产品推荐
相关产品推荐

