【发布时间】: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