.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
相关产品推荐
相关产品推荐

