使用官方.NET镜像、多阶段Dockerfile构建、正确EXPOSE端口、环境变量覆盖配置、监听0.0.0.0及合理日志调试是Docker运行.NET Core应用的关键要点。

直接用 Docker 运行 .NET Core 应用不难,关键在于选对镜像、写好 Dockerfile、注意运行时环境和端口暴露。下面分几步说清楚实际操作中容易踩坑的要点。
选择合适的 .NET SDK 和 Runtime 镜像
Docker Hub 上官方 mcr.microsoft.com/dotnet/ 提供了多种镜像,别随便拉 latest。开发阶段用 sdk 镜像(含编译工具),生产环境必须用 runtime 镜像(更小、更安全)。
-
SDK 镜像示例:
mcr.microsoft.com/dotnet/sdk:8.0(用于构建) -
Runtime 镜像示例:
mcr.microsoft.com/dotnet/aspnet:8.0(用于运行 Web 应用)或mcr.microsoft.com/dotnet/runtime:8.0(用于控制台应用) - 镜像标签要明确版本号,避免因 latest 变动导致构建失败
编写简洁可靠的 Dockerfile
推荐多阶段构建:第一阶段用 SDK 编译,第二阶段用 Runtime 运行,最终镜像体积可减少 70% 以上。
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY *.csproj . RUN dotnet restore COPY . . RUN dotnet publish -c Release -o /app/publish FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY --from=build /app/publish . EXPOSE 80 ENTRYPOINT ["dotnet", "MyApp.dll"]
-
EXPOSE 80 是声明端口,不是映射;实际访问需用
docker run -p 5000:80绑定宿主机端口 - 确保
MyApp.dll名称与项目名一致,大小写敏感 - 若项目启用 HTTPS,默认监听 5001,Dockerfile 中需改
EXPOSE 5001并在启动时传参或配置环境变量
正确处理配置与环境变量
.NET Core 默认从 appsettings.json 读配置,但容器中更推荐用环境变量覆盖,比如数据库连接字符串、API 密钥等敏感信息。
- 启动容器时用
-e ASPNETCORE_ENVIRONMENT=Production指定环境 - 用
-e ConnectionStrings__DefaultConnection="..."覆盖 JSON 中的嵌套配置(双下划线表示层级) - 也可挂载配置文件:
docker run -v $(pwd)/appsettings.prod.json:/app/appsettings.json
调试与日志排查技巧
容器里看不到控制台输出?别急着重装,先确认几件事:
- 应用是否监听了
http://+:80而不是http://localhost:80(后者在容器内无法被外部访问) - 检查日志:
docker logs <container-id>或加--follow实时查看 - 进容器调试:
docker exec -it <container-id> /bin/sh,再手动执行dotnet MyApp.dll看报错 - ASP.NET Core 默认只输出 Warning 及以上级别日志,可在
Program.cs中临时加.ConfigureLogging(b => b.SetMinimumLevel(LogLevel.Information))

















