为什么 aspnet 核心从 Docker 的80端口开始?

为什么一个 aspnet 核心应用程序在80端口上运行,从 Docker 映像内部运行,而在 Docker 映像外部运行5000端口。

说详细点

我浏览了在这里找到的 aspnet core/docker 教程: Https://learn.microsoft.com/en-us/dotnet/core/docker/building-net-docker-images

Half way through the page, I start the application with the following as prescribed:

dotnet run

除此之外,这本书还印刷了这样的内容:

Now Listening on: http://localhost:5000

很好。我就知道会这样。本教程的下一步是从 Docker 映像中启动完全相同的应用程序。

docker build -t aspnetapp .
docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp

结果是

Now listening on: http://[::]:80

Wait. Wat? 为什么 aspnet 核心应用程序在端口80上运行? It was running on port 5000 when I ran it directly from the machine. There were no configuration file changes.

我怀疑它与基地码头图像有关,但还没有足够的熟练程度,在码头跟踪这一点。

59842 次浏览

microsoft/aspnetcore-build容器构建在 Microsoft/aspnetcore 容器

关于港口的说明

这张图片将 ASPNETCORE _ URLS 环境变量设置为 http://+:80,这意味着如果你没有明确设置应用程序中的 URL,通过应用程序。例如,在 Program.cs 中使用 UseUrl,那么您的应用程序将侦听容器内的端口80。

所以这是一个积极地将端口设置为80的容器。你可以覆盖它,如果你想的话,通过在你的 Dockerfile中这样做:

ENV ASPNETCORE _ URLS = http://+:5000

另外,值得注意的是,由于正在使用 docker 命令,无论是直接运行应用程序还是在容器中运行应用程序,您仍然能够在 http://localhost:5000访问应用程序。

If you are using .NET Core 2.2 or higher, then you should to use another image: mcr.microsoft.com/dotnet/core/aspnet:2.2. In that case specifying ENV ASPNETCORE_URLS=http://+:5000 does not help. You still can force app to listen to port 5000 by using UseUrls("http://*:5000") in Programs.cs file.

没有 dockerfile,您可以设置任何端口的 docker 容器。(.NET Core 3.1.NET 5.NET 6.NET 7 + )与 docker 参数

docker run -it --rm -p 5000:80 -p 5001:443 -e ASPNETCORE_HTTPS_PORT=https://+:5001
-e ASPNETCORE_URLS=http://+:5000 --name aspnetcore_sample aspnetapp

更多细节 :

Https://github.com/dotnet/dotnet-docker/blob/17c1eec582e84ba9cbea5641cd9cc13fe1a41c39/samples/run-aspnetcore-https-development.md?plain=1#l85

Https://github.com/dotnet/dotnet-docker/blob/5926a01d44bd47b6202ba71e30f9faa08fad1aec/samples/run-in-sdk-container.md?plain=1#l109

Windows 网络堆栈限制在 Windows Docker Container.参考影片上很难使用

docker run -it --rm -p ${host_computer_port}:${container_port} --name ${container_name} ${image_name}

命令示例:

docker run -it --rm -p 5000:8090 --name dockerwebapp9172020c dockerwebapp9172020

上面的命令是什么意思?

您的机器端口(5000)映射到容器端口(8090)。这并不意味着应用程序运行在监听 PORT: 8090的容器中。请参阅下面的 Docker 文件,了解如何将容器端口映射到应用程序端口。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1903 AS base
WORKDIR /app
EXPOSE 8090
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1903 AS build
WORKDIR /src
COPY ["DockerWebApp/DockerWebApp.csproj", "DockerWebApp/"]
RUN dotnet restore "DockerWebApp/DockerWebApp.csproj"
COPY . .
WORKDIR "/src/DockerWebApp"
RUN dotnet build "DockerWebApp.csproj" -c Release -o /app/build


FROM build AS publish
RUN dotnet publish "DockerWebApp.csproj" -c Release -o /app/publish


FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENV ASPNETCORE_URLS http://*:8090
ENTRYPOINT ["dotnet", "DockerWebApp.dll"]

测试

WindowsNetworkStack 限制不允许直接运行以下命令。

http://localhost:5000

让我们开始第一个变通方案。 1直接命中容器。(在 PowerShell 或命令提示符下面的命令)

ps c:/>docker inspect f31e8add55af

从“网络”节点的最后查找一个容器的 IP 地址,并在浏览器中运行命令。

http://{container IP}:8090

来自 Windows 主机的 Workaroud-2

Let's find Your Machine IP address first.

c:\>ipconfig

找到机器 IP 后,运行以下命令。

http://{Your Machine IP}:5000

因为5000被映射到容器端口(8090) ,而 asp.net 核心应用程序也在监听容器内的8090端口。

参考文献: Windows 容器和 Docker: 101

其他答案中的一些链接是针对旧版本的,或者已经不存在了。

All the mcr.microsoft.com/dotnet/aspnet images are 给你. Suppose you are using the alpine version.

aspnet图像基于 runtime图像,如图 给你所示。

runtime图像基于 runtime-deps图像,如图 给你所示。

runtime-deps图像基于 amd64/alpine图像,如图所示 给你(旧版本,但具有相同的结构)。它设置 ENV ASPNETCORE_URLS=http://+:80,如图所示 给你,这意味着容器正在监听端口80。