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

.NET应用Docker部署端口无法访问问题求助

.NET应用Docker部署后端口无法访问问题排查与解决

问题描述

我有一个.NET 6应用,本地运行时通过8082端口可正常访问,相关配置及部署文件如下:

appsettings.json中的Kestrel配置

"Kestrel": {
  "Endpoints": {
    "Http": {
      "Url": "http://localhost:8082"
    }
  }
},

Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 8082

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src

<COPY ...> # copy my files and projects

RUN dotnet restore "proj/proj.csproj"
COPY . .
WORKDIR "/src/proj"
RUN dotnet build "proj.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "proj.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "proj.dll"]

docker-compose.yml

services:
  bs:
    image: bs
    ports:
      - "8091:8082"

执行docker build -t bs .构建镜像,docker compose up -d启动容器后,访问宿主机8091端口(如http://localhost:8091/swagger)提示无法访问,容器日志显示应用仅监听http://localhost:8082:

2023/07/29 09:47:07 [WRN] Overriding address(es) '"http://+:80"'. Binding to endpoints defined via IConfiguration and/or UseKestrel() instead.
2023/07/29 09:47:07 [INF] Now listening on: "http://localhost:8082"
2023/07/29 09:47:07 [INF] Application started. Press Ctrl+C to shut down.
2023/07/29 09:47:07 [INF] Hosting environment: "Production"
2023/07/29 09:47:07 [INF] Content root path: "/app/"

问题原因

应用配置的Kestrel监听地址为http://localhost:8082,这意味着应用仅接受容器内部localhost的请求,而Docker端口映射是将宿主机的端口转发到容器的公共网络接口,此时外部(包括宿主机)的请求无法被容器内的应用接收。

解决方法

以下三种方式任选其一即可:

1. 修改appsettings.json配置

将Kestrel监听地址改为http://0.0.0.0:8082,让应用监听容器的所有网络接口:

"Kestrel": {
  "Endpoints": {
    "Http": {
      "Url": "http://0.0.0.0:8082"
    }
  }
},

2. 通过环境变量覆盖配置

利用.NET的环境变量优先级特性,强制应用监听所有接口:

  • 修改Dockerfile:在final阶段添加环境变量
FROM base AS final
WORKDIR /app
ENV ASPNETCORE_URLS=http://0.0.0.0:8082
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "proj.dll"]
  • 修改docker-compose.yml:在服务配置中添加环境变量
services:
  bs:
    image: bs
    ports:
      - "8091:8082"
    environment:
      - ASPNETCORE_URLS=http://0.0.0.0:8082

3. 代码中直接配置Kestrel

在Program.cs中显式指定Kestrel监听所有IP的8082端口:

var builder = WebApplication.CreateBuilder(args);

// 配置Kestrel监听所有IP
builder.WebHost.ConfigureKestrel(options =>
{
    options.ListenAnyIP(8082);
});

// 其他业务配置...

var app = builder.Build();

// 中间件配置...

app.Run();

验证步骤

重新构建镜像并启动容器:

docker build -t bs .
docker compose up -d

此时访问http://localhost:8091/swagger即可正常访问应用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:37:49