【问题标题】:Why does aspnet core start on port 80 from within Docker?为什么 aspnet 核心从 Docker 内部的端口 80 启动?
【发布时间】:2018-07-18 01:58:23
【问题描述】:

TL;DR: 为什么 aspnet 核心应用程序在 Docker 映像内的端口 80 上运行,但在 Docker 映像外的 5000 端口上运行。

详细说明

我浏览了此处的 aspnet core / 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 core 应用运行在 80 端口? 当我直接从机器上运行它时,它运行在 5000 端口。没有配置文件更改。

我怀疑这与基础 docker 映像有关,但我在 docker 方面还不够熟练,无法追踪到这一点。

【问题讨论】:

  • 在这一行docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp 中,您将 5000 的内部端口(在 docker 容器内)映射到 80 的外部端口(容器外)。意思是,当您浏览到 IP 地址时给您的容器,它将您的请求转发到端口 5000
  • 这在您链接到的教程页面上进行了解释,直接在this section中提供的代码下
  • @JamieTaylor 你是对的,但这不是“现在正在收听......”的消息所说的。该消息正在谈论容器内的 internal 端口,正如您正确地说的那样,该端口映射到容器外的端口 5000。
  • @JamieTaylor,omajid 是对的,这只告诉我我将内部端口 80 映射到外部端口 5000。这个选择会导致更多的混乱。问题是为什么内部端口是80?他们应该在外部示例中使用 5000 以外的数字,以强调我们所讨论的端口与前一个示例不同。

标签: asp.net docker .net-core kestrel-http-server


【解决方案1】:

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 访问应用程序。

【讨论】:

  • 非常感谢!我认为如果他们使用-p 5001:80 来强调我们不是在谈论与以前相同的端口,那将是一个更好的例子。
  • @PhillipScottGivens 可能你现在已经知道了,但是默认情况下,端口 5001 用于使用 SSL (https) 运行应用程序。我理解你最初的困惑,但正如答案所指出的那样,ASPNETCORE_URLS 决定了应用程序监听的端口
  • 嗨,我在我的 Dockerfile 中使用了 ENV ASPNETCORE_URLS http://+5000,但是当使用 docker-compose 启动容器时,仍然看到现在正在侦听:http://[::]:80。我看到了:第 4/7 步:ENV ASPNETCORE_URLS http://+5000 第 6/7 步:EXPOSE 5000。但是在我使用 'docker-compose up' 之后,我看到了同样的结果:现在正在监听:http://[:: ]:80
  • @Rroman docker-compose down,删除所有相关镜像,重新构建
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 不知道这个,浪费了这么多时间。谢谢
    【解决方案4】:

    Windows 网络堆栈限制在 Windows Docker Container 上发挥作用。Reference Video

    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"]
    

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

    http://localhost:5000
    

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

    ps c:/>docker inspect f31e8add55af

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

    http://{container IP}:8090
    

    Workaroud-2 来自 Windows 主机

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

    c:\>ipconfig
    

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

    http://{Your Machine IP}:5000
    

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

    Reference:Windows Containers and Docker: 101

    【讨论】:

      猜你喜欢
      • 2022-10-06
      • 2011-12-14
      • 2019-09-29
      • 1970-01-01
      • 2019-05-30
      • 2016-10-10
      • 1970-01-01
      • 2018-09-13
      相关资源
      最近更新 更多