默认 ASP.NET Core 端口已更改为 80 到 8080

.NET 容器映像中配置的默认 ASP.NET Core 端口已从端口 80 更新为 8080。

我们还添加了新的 ASPNETCORE_HTTP_PORTS 环境变量,作为 ASPNETCORE_URLS 的更简单的替代方法。 新变量预期接收以分号分隔的端口号列表,而旧变量需要使用更复杂的语法。

使用旧版 WebHost.CreateDefaultBuilder() API 生成的应用不会遵循新的 ASPNETCORE_HTTP_PORTS 环境变量。 现在,ASPNETCORE_URLS 不再自动设置,它们将切换为使用默认 URL http://localhost:5000,而不是 http://*:80,如前所述。

旧行为

在 .NET 8 之前,可以运行端口 80 预期为默认端口的容器,并且能够访问正在运行的应用。

例如,可运行以下命令,然后在端口 8000 本地访问应用,该端口映射到容器中的端口 80:

docker run --rm -it -p 8000:80 <my-app>

新行为

从 .NET 8 开始,如果在未将容器中使用的 ASP.NET Core 端口显式设置为 80 的情况下映射到容器中的端口 80,则连接到该映射端口的任何尝试都将失败。

例如,如果运行以下命令,则无法使用端口 8000 在本地连接到应用程序。

docker run --rm -it -p 8000:80 <my-app>

请更改命令,以便使用容器中的端口 8080:

docker run --rm -it -p 8000:8080 <my-app>

可以在以下示例中看到行为差异。

映射端口 80(失败):

$ docker run --rm -d -p 8000:80 mcr.microsoft.com/dotnet/samples:aspnetapp
ba88b746bd7097e503f8ab6e5320c595640e242f6de4f734412944a0e2836acc
$ curl http://localhost:8000/Environment
curl: (56) Recv failure: Connection reset by peer
$ docker kill ba88b746bd7097e503f8ab6e5320c595640e242f6de4f734412944a0e2836acc
ba88b746bd7097e503f8ab6e5320c595640e242f6de4f734412944a0e2836acc

映射端口 8080

$ docker run --rm -d -p 8000:8080 mcr.microsoft.com/dotnet/samples:aspnetapp
74d866bdaa8a5a09e4a347bba17ced321d77a2524a0853294a123640bcc7f21d
$ curl http://localhost:8000/Environment
{"runtimeVersion":".NET 8.0.0-rc.1.23419.4","osVersion":"Alpine Linux v3.18","osArchitecture":"Arm64","user":"root","processorCount":4,"totalAvailableMemoryBytes":4123820032,"memoryLimit":0,"memoryUsage":30081024,"hostName":"74d866bdaa8a"}
$ docker kill 74d866bdaa8a5a09e4a347bba17ced321d77a2524a0853294a123640bcc7f21d
74d866bdaa8a5a09e4a347bba17ced321d77a2524a0853294a123640bcc7f21d

映射端口 80ASPNETCORE_HTTP_PORTS 设置为端口 80

$ docker run --rm -d -p 8000:80 -e ASPNETCORE_HTTP_PORTS=80 mcr.microsoft.com/dotnet/samples:aspnetapp
3cc86b4b3ea1a7303d83171c132b0645d4adf61d80131152936b01661ae82a09
$ curl http://localhost:8000/Environment
{"runtimeVersion":".NET 8.0.0-rc.1.23419.4","osVersion":"Alpine Linux v3.18","osArchitecture":"Arm64","user":"root","processorCount":4,"totalAvailableMemoryBytes":4123820032,"memoryLimit":0,"memoryUsage":95383552,"hostName":"3cc86b4b3ea1"}
$ docker kill 3cc86b4b3ea1a7303d83171c132b0645d4adf61d80131152936b01661ae82a09
3cc86b4b3ea1a7303d83171c132b0645d4adf61d80131152936b01661ae82a09

引入的版本

.NET 8 预览版 1

更改类型

此更改为行为更改

更改原因

之所以更改端口号的原因是因为在切换到 non-root 用户时,需要提供良好的可用性体验。 如果以 non-root 用户的身份运行,则在某些环境中需要使用非特权端口。 由于端口 80(前一个默认端口)是特权端口,因此默认端口已更新为端口 8080,这是一个非特权端口。

响应此中断性变更有两种方法:

  • (建议的操作)将 ASPNETCORE_HTTP_PORTSASPNETCORE_HTTPS_PORTSASPNETCORE_URLS 环境变量显式设置为所需的端口。 示例: docker run --rm -it -p 8000:80 -e ASPNETCORE_HTTP_PORTS=80 <my-app>
  • 将依赖预期的 80 默认端口的现有命令和配置更新为引用端口 8080。 示例: docker run --rm -it -p 8000:8080 <my-app>

如果你的应用是使用较旧的 WebHost.CreateDefaultBuilder() 方法生成的,请设置 ASPNETCORE_URLS(而不是 ASPNETCORE_HTTP_PORTS)。 示例:docker run --rm -it -p 8000:80 -e ASPNETCORE_URLS=http://*:80 <my-app>

如果使用的是 KubernetesDocker Compose,需要根据这些架构更改端口。 有关示例,请参阅将 .NET 与 Kubernetes 配合使用

如果使用 Azure 容器服务托管 ASP.NET Core 容器应用,需要更新容器环境以设置所需的端口:

  • 对于 Azure 应用服务,请使用 CLI 或在门户中设置 WEBSITES_PORT
  • 对于 Azure 容器应用,可以在资源创建期间更改端口。
  • 对于 Azure 容器实例,可以在资源创建期间更改端口。

受影响的 API

无。

请参阅