docker - 如何为在 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,我应该做哪些额外的配置(如果有的话)?
解决方案
对于 的 port( -p
) 选项docker run
,格式类似于<host-port>:<container-port>
. 由于您使用了值8060:7110
并尝试localhost:7110
在主机上访问,因此您定位到了错误的端口。您应该8060
从主机定位,或者根据需要交换端口的位置。
然后你也想ENV ASPNETCORE_URLS http://+:<container-port>
在你的 Dockerfile 中设置。