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

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相关问答推荐

502 DotNet WebApplication的网关nginx已损坏

属性包含破折号的 ServiceStack 请求对象?

使用会话变量有多安全 - asp.net / c#

无法读取配置部分system.servicemodel,因为它缺少部分声明

SameSite 属性如何自动添加到我的 Asp.net_SessionID cookie 中?

无法让嵌套在 UpdatePanel 中的 WebControl 中的 ScriptManager.RegisterStartupScript 工作

如何在集线器类之外获取 SignalR 用户连接 ID?

ASP.NET Core 中的授权. [Authorize] 属性总是 401 Unauthorized

如何找出我的 Windows 域上托管 LDAP 的服务器?

ASP.NET 中的全局资源与本地资源

如何在 ASP.NET Core Web API 中配置 JSON 格式的缩进

如何获取正在访问 ASP.NET 应用程序的当前用户?

如何删除asp.net中的特定会话?

Azure Functions 中的 DI

WebForm_PostBackOptions 文档

如何从 ASP.NET 中的数据表/数据视图中 Select 前 n 行

避免将重复元素添加到列表 C#

我可以在 .NET Framework 4.0 上运行 MVC 5 应用程序吗?

在后面的代码中删除 css 类

如何在不遍历每个循环的情况下从字典对象中获取所有键(仅键)