我根据以下图片制作了两个容器:
ASP.Net 核心
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 Core 容器在端口 8080 上运行,我可以在浏览器中打开它
http://localhost:8080
但 ASP.Net 容器无法在 http://localhost:9090
上运行
docker ps -a
显示 ASP.Net core 正在 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
构建该图像,其行为仍然相同。
简而言之,ASP.Net Core 容器是双向工作的:
http://localhost:8080
http://172.20.235.46:8080
但是 ASP.Net 容器只能通过以下方式访问:
http://172.20.235.45/
为什么会有这样的表现?是因为它的基础镜像是微软构建的吗?
EXPOSE
文档:
指令实际上并不发布端口。它充当构建镜像的人和运行容器的人之间的一种文档,关于要发布哪些端口。EXPOSE
因此指定
EXPOSE 9090
不会更改 ASP.NET 正在侦听的端口。
您可以自由地将“内部”端口映射到任何外部端口,因此最简单的选择是将容器的默认
80
映射到 9090
:
docker run -d -p 80:9090 asp