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

时间:2018-02-07 17:10:16

标签: 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

除此之外,还打印出这个:

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

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

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

4 个答案:

答案 0 :(得分:41)

microsoft/aspnetcore-build容器构建在 microsoft/aspnetcore容器之上。 dockerhub page for that说:

  

关于港口的说明

     

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

因此,这是主动将端口设置为80的容器。如果需要,可以在Dockerfile中执行此操作来覆盖它:

  

ENV ASPNETCORE_URLS = http://+:5000

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

答案 1 :(得分:12)

没有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

更多详细信息

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

答案 2 :(得分:6)

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

答案 3 :(得分:0)

Windows Networking Stack Limitation在Windows Docker Container上发挥了重要作用。Reference Video

docker run -it --rm -p {主机端口}:{容器端口} --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"]

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

http://localhost:5000

让我们开始第一个解决方法。 解决方法1:直接击中Container。 (在PowerShell或命令提示符下的命令下方)

ps c:/>docker inspect f31e8add55af

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

http://{container IP}:8090

Windows主机上的Workaroud-2

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

c:\>ipconfig

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

http://{Your Machine IP}:5000

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

Reference:Windows Containers and Docker: 101