我根据下面的图片制作了两个容器:

ASP.NET Core
mcr.microsoft.com/dotnet/aspnet:8.0.0-windowsservercore-ltsc2019

ASP.NET
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8-windowsservercore-ltsc2016

我按如下方式运行这两个容器:

docker run -d -p 8080:8080 aspcore
docker run -d -p 9090:9090 asp

ASP.NET核心容器在端口8080上运行,我可以在浏览器http://localhost:8080中打开它,但ASP.NET容器不能在http://localhost:9090上运行

docker ps -a表示ASP.NET核心在0.0.0.0:8080->8080/tcp上运行,而ASP.NET在80/tcp, 0.0.0.0:9090->9090/tcp上运行

这意味着ASP.NET只能通过端口80上的某个IP访问,例如http://172.20.235.45/.此IP属于Hyper-V虚拟适配器.

即使我用EXPOSE 9090构建这个映像,它的行为仍然是一样的.

In short, ASP.NET Core container works both ways:
http://localhost:8080
http://172.20.235.46:8080

But ASP.NET container is only accessible as:
http://172.20.235.45/

为什么会这样呢?这是因为它的基础形象是由微软构建的吗?

推荐答案

来自EXPOSE个文档:

EXPOSE指令实际上并不发布端口.它充当构建映像的人和运行容器的人之间的一种类型的文档,关于要发布的端口.

所以指定EXPOSE 9090不会改变ASP.NET监听的端口.

您可以自由地将"内部"端口映射到任何外部端口,因此最简单的 Select 是只将容器的默认80映射(publish)到9090:

docker run -d -p 9090:80 asp

如果要更改"内部"端口,则需要处理容器中用作Web服务器的IIS配置.

另外请注意,8080是ASP.NET Core映像自第8版以来的默认端口.

Asp.net相关问答推荐

从组件属性调用异步方法的正确方法

单个方法(即扩展方法)之间的调用不明确

如何从 JavaScript 调用 C# 函数?

模型项的类型为 CookMeIndexViewModel,但需要类型为 IEnumerable 的模型项

我可以根据角色隐藏/显示 asp:Menu 项吗?

如何在不使用 Session 的情况下在 ASP.net 中的页面之间传递值

GridView 与嵌套类的属性绑定

可空日期时间转换

是否应该将 project.lock.json 文件签入源代码管理? (ASP.NET 核心 1.0)

跟踪点有什么用途?

IIS Express - 增加内存限制

带有模型的 ASP.NET MVC 重定向

ASP .NET 单例

在资源文件中使用 HTML

ASP.Net 错误:应用程序池的标识无效

使用 Twitter Bootstrap 在 @html.actionlink 中显示 html

当文件上传超出 ASP.NET MVC 中允许的大小时显示自定义错误页面

简单的 LINQ 和列表错误:WhereListIterator`1[Task]' to type 'System.Collections.Generic.List`1[Task]'

为什么 C# 对于 CSC 文件会遇到此错误?

如何使用实体框架执行原始 SQL 查询而无需使用模型?