You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 22.04下DotNet 7应用Docker部署后无法访问求助

Docker打包DotNet 7应用后无法外部访问问题处理

我在Ubuntu 22.04系统上开发DotNet 7应用,本地执行dotnet run后可正常通过localhost:7222访问应用,但使用提供的Dockerfile构建镜像并映射5000端口运行容器后,无法在浏览器访问该应用,Windows环境下也出现相同问题。


本地运行日志

dotnet run
Building...
warn: Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer[8]
      The ASP.NET Core developer certificate is not trusted. For information about trusting the ASP.NET Core developer certificate, see https://aka.ms/aspnet/https-trust-dev-cert.
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7222
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5222
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /home/fit/Desktop/webapp/Dental App

Dockerfile内容

# Multi stage Docker Image Build

# Build Stage
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /source
COPY . .
RUN dotnet restore "./Dental App.csproj" --disable-parallel
COPY . ./
RUN dotnet publish "./Dental App.csproj" -c release -o /app

# Serve Stage
FROM mcr.microsoft.com/dotnet/sdk:7.0
WORKDIR /app
COPY --from=build /app ./

EXPOSE 5000


ENTRYPOINT ["dotnet", "Dental App.dll"]

容器运行日志

$ docker container run --publish 5000:5000 appdental:latest
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /app

问题原因

容器日志显示应用仅监听localhost:5000,这意味着应用只能接收容器内部的请求,外部主机无法通过映射的端口访问。

解决方法

方法1:通过环境变量指定监听地址

修改Dockerfile的Serve阶段,添加环境变量让Kestrel监听所有IP:

# Serve Stage
FROM mcr.microsoft.com/dotnet/aspnet:7.0  # 推荐用runtime镜像替代sdk,减少镜像体积
WORKDIR /app
COPY --from=build /app ./

ENV ASPNETCORE_URLS=http://0.0.0.0:5000
EXPOSE 5000

ENTRYPOINT ["dotnet", "Dental App.dll"]

方法2:在启动命令中指定监听地址

直接修改ENTRYPOINT命令,添加--urls参数:

ENTRYPOINT ["dotnet", "Dental App.dll", "--urls=http://0.0.0.0:5000"]

额外优化

Serve阶段使用mcr.microsoft.com/dotnet/aspnet:7.0镜像而非sdk镜像,因为sdk包含编译工具,运行时不需要,能大幅减小镜像体积。

内容的提问来源于stack exchange,提问作者4tire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:35:16