TL;DR:为什么aspnet core应用程序在Docker映像内的端口80上运行,而在Docker映像外的端口5000上运行.

Elaborate

我浏览了下面的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

等.WAT?Why is the aspnet core app running on port 80?当我直接从机器上运行它时,它正在5000端口上运行.没有配置文件更改.

我怀疑这与基本docker图像有关,但我对docker的技术还不足以追踪到这一点.

推荐答案

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

关于港口的注解

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

这是主动将端口设置为80的容器.如果您愿意,您可以通过在您的Dockerfile中执行以下操作来覆盖它:

ENV ASPNETCORE_url=http://+:5000

另外,值得注意的是,因为您使用的是docker命令,所以无论您是直接运行应用程序还是在容器中运行应用程序,您都仍然能够在http://localhost:5000级访问该应用程序.

Asp.net相关问答推荐

DBSet 不包含 Where 的定义

没有身份的 ASP.NET Core 2.0 承载身份验证

使用 IIS 的 ASP.NET 调试超时

文本框的输入按键触发事件

MvcBuildViews true 与 ASP.NET MVC 2 中的实体框架

我应该如何在类和应用层之间传递数据?

以编程方式添加跨度标签,而不是标签控件?

使 Web.config 转换在本地工作

如何在 asp.net 中更改 DataBinder.Eval 的日期格式?

Windows Azure PaaS(网络角色)的真正替代品?

捕获的异常本身为 null !

投票有什么问题?

ASP.Net 无法创建/卷影复制

在 Asp.Net Core 中动态更改连接字符串

asp.net core 2.0 - 值不能为空.参数名称:连接字符串

x-powered by是什么意思?

Page.IsPostBack 和 Page.IsCallBack 有什么区别?

从服务器下载 ASP.NET 文件

将字符串转换为时间

System.Web.Caching 还是 System.Runtime.Caching 更适合 .NET 4 Web 应用程序