Docker端口映射异常:Mac无法访问容器内.NET Core API
解决Docker中.NET Core API无法从主机访问的问题
核心问题
你的.NET Core API在容器内仅监听http://localhost:5206,而容器的localhost是独立的网络命名空间,与主机的localhost互不连通。主机的端口映射无法将请求转发到容器内部的localhost地址,导致无法访问。
解决步骤
1. 修改API监听地址
让API监听容器的所有网卡(0.0.0.0),有三种方式可选:
- 方式一:在启动命令中指定URL
修改Dockerfile的ENTRYPOINT:ENTRYPOINT dotnet run --project helloWorld.csproj --urls=http://0.0.0.0:5206 - 方式二:修改配置文件
在项目的appsettings.json中添加监听地址配置:{ "Urls": "http://0.0.0.0:5206", // 其他配置项... } - 方式三:设置环境变量
在Dockerfile中添加环境变量:ENV ASPNETCORE_URLS=http://0.0.0.0:5206
2. 优化Dockerfile(推荐)
你当前使用Ubuntu镜像手动安装.NET环境的方式会导致镜像体积庞大,推荐使用官方的.NET分层构建镜像,更轻量、高效:
# 基础运行时镜像 FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base WORKDIR /app EXPOSE 5206 ENV ASPNETCORE_URLS=http://0.0.0.0:5206 # 构建阶段:使用SDK编译项目 FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build WORKDIR /src COPY ["helloWorld/helloWorld.csproj", "helloWorld/"] RUN dotnet restore "helloWorld/helloWorld.csproj" COPY . . WORKDIR "/src/helloWorld" RUN dotnet build "helloWorld.csproj" -c Release -o /app/build # 发布阶段 FROM build AS publish RUN dotnet publish "helloWorld.csproj" -c Release -o /app/publish /p:UseAppHost=false # 最终镜像:复制发布文件到运行时镜像 FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "helloWorld.dll"]
3. 重新构建并运行
# 构建镜像 docker build -t hello-world-api . # 运行容器,映射主机8080端口到容器5206端口 docker run -p 8080:5206 hello-world-api
此时访问http://localhost:8080即可正常调用API。
内容的提问来源于stack exchange,提问作者NatarajC
相关产品推荐
相关产品推荐

