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

Phi*_*ens 35 asp.net docker .net-core kestrel-http-server

TL; DR:为什么aspnet核心应用程序在Docker镜像中的端口80上运行,但在docker镜像之外运行5000.

阐述

我浏览了这里的aspnet核心/ docker教程:https: //docs.microsoft.com/en-us/dotnet/core/docker/building-net-docker-images

在页面的一半,我按照规定启动应用程序:

dotnet run
Run Code Online (Sandbox Code Playgroud)

除此之外,这打印这个:

Now Listening on: http://localhost:5000
Run Code Online (Sandbox Code Playgroud)

大.这就是我的预期.本教程的下一步是从Docker镜像中启动完全相同的应用程序.

docker build -t aspnetapp .
docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp
Run Code Online (Sandbox Code Playgroud)

这导致了

Now listening on: http://[::]:80
Run Code Online (Sandbox Code Playgroud)

等待.笏?为什么aspnet核心应用程序在端口80上运行?当我直接从机器运行它时,它在端口5000上运行.没有配置文件更改.

我怀疑它与基本的docker图像有关,但是在docker中还不够熟练以跟踪它.

Oma*_*jid 62

microsoft/aspnetcore-build容器建立在顶部 microsoft/aspnetcore容器.在该dockerhub页说:

关于港口的说明

此映像将ASPNETCORE_URLS环境变量设置为http:// +:80,这意味着如果您没有明确地在应用程序中设置URL,例如通过Program.cs中的app.UseUrl,那么您的应用程序将在端口上侦听80在容器内.

所以这是主动将端口设置为80的容器.如果需要,可以通过以下方式覆盖它Dockerfile:

ENV ASPNETCORE_URLS = http:// +:5000

此外,值得注意的是,由于您使用的是docker命令,您仍然可以http://localhost:5000直接或在容器中运行应用程序来访问应用程序.

  • 您好,我在 Dockerfile 中使用 ENV ASPNETCORE_URLS http://+5000,但在使用 docker-compose 启动容器时仍然看到 Now Listening on: http://[::]:80 。我看到:步骤 4/7:ENV ASPNETCORE_URLS http://+5000 步骤 6/7:EXPOSE 5000。但是在我使用“docker-compose up”之后,我看到了相同的内容:现在正在收听:http://[:: ]:80 (2认同)

ASL*_*LIM 17

如果没有 dockerfile,您可以在 docker 容器之外设置任何端口。( .NET Core 3.1 , .NET 5 ) 与 docker args

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
Run Code Online (Sandbox Code Playgroud)

更多细节

https://github.com/dotnet/dotnet-docker/blob/17c1eec582e84ba9cbea5641cd9cc13fe1a41c39/samples/run-aspnetcore-https-development.md#L85

https://github.com/dotnet/dotnet-docker/blob/5926a01d44bd47b6202ba71e30f9faa08fad1aec/samples/run-in-sdk-container.md#L109


小智 8

Windows 网络堆栈限制对 Windows Docker 容器影响很大。参考视频

docker run -it --rm -p ${host_computer_port}:${container_port} --name ${container_name} ${image_name}
Run Code Online (Sandbox Code Playgroud)

命令示例:

docker run -it --rm -p 5000:8090 --name dockerwebapp9172020c dockerwebapp9172020
Run Code Online (Sandbox Code Playgroud)

上面的命令是什么意思?

您的机器端口(5000)映射到容器端口(8090)。这并不意味着在容器中运行的应用程序侦听端口: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"]
Run Code Online (Sandbox Code Playgroud)

测试

Windows 网络堆栈限制不允许直接运行以下命令。

http://localhost:5000
Run Code Online (Sandbox Code Playgroud)

让我们继续第一个解决方法。解决方法-1 直接点击Container。(以下是 PowerShell 或命令提示符中的命令)

ps c:/>docker inspect f31e8add55af

从最后的“NETWORKS”节点找到容器的IP地址,并在浏览器中运行命令。

http://{container IP}:8090
Run Code Online (Sandbox Code Playgroud)

来自 Windows 主机的解决方法 2

我们首先找到您的机器 IP 地址。

c:\>ipconfig
Run Code Online (Sandbox Code Playgroud)

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

http://{Your Machine IP}:5000
Run Code Online (Sandbox Code Playgroud)

由于 5000 映射到容器端口(8090),并且 ASP.NET Core 应用程序也在容器内侦听 8090 端口。

参考:Windows容器和Docker:101


lon*_*nix 6

其他答案中的某些链接适用于旧版本,或者不再存在。以下内容适用于 v6。

所有mcr.microsoft.com/dotnet/aspnet图像都在这里。假设您使用的是 alpine 版本。

aspnet图像基于runtime图像,如下所示

runtime图像基于runtime-deps图像,如下所示

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


Rro*_*man 5

如果使用的是.NET Core 2.2或更高版本,则应使用另一个映像:mcr.microsoft.com/dotnet/core/aspnet : 2.2。在这种情况下,指定ENV ASPNETCORE_URLS=http://+:5000无济于事。您仍然可以通过UseUrls("http://*:5000")在Programs.cs文件中使用来强制应用监听端口5000 。