首页 > 解决方案 > 如何为在 Docker 中运行的 .Net Core 3.1 API 指定端口绑定

问题描述

我有一个 .Net 3.1 API 在 Windows 10 上作为 Docker 容器(WSL2+ Linux 容器)运行。我无法在除 5000 之外的任何其他端口上访问 API:

当我运行容器时

docker run -d -p 8060:7110 golide/payapi:0.1.0

并在 Postman 中尝试 GET 到 http://localhost:7110/weatherforecast 我得到“无法连接”异常。但是当我运行容器时

docker run -d -p 5000:5000 golide/payapi:0.1.0

并在 Postman 中尝试 GET 到 http://localhost:5000/weatherforecast 我得到 API 响应。

关于 Kestrel 端口绑定的工作原理,我缺少什么?

我的 Dockerfile 如下所示:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:3.1
WORKDIR /app
ENV ASPNETCORE_URLS http://+:5000
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "PaymentsAPI.dll"]

为了访问任何其他端口上的 API,我应该做哪些额外的配置(如果有的话)?

标签: docker.net-corekestrel-http-server

解决方案


对于 的 port( -p) 选项docker run,格式类似于<host-port>:<container-port>. 由于您使用了值8060:7110并尝试localhost:7110在主机上访问,因此您定位到了错误的端口。您应该8060从主机定位,或者根据需要交换端口的位置。

然后你也想ENV ASPNETCORE_URLS http://+:<container-port>在你的 Dockerfile 中设置。


推荐阅读