无法访问 Docker Nanoserver 容器 Web 应用程序

Unable to access Docker Nanoserver container web app

这个问题与其他关于 Windows 网络及其与 Docker 容器的关系的问题类似,但我似乎找不到解决我的确切问题的方法。

我正在为新的预构建预发布 .NET Core 1.1 应用程序设置一个 Docker 容器。我有一个 Docker 文件,它将应用程序构建到启用 nanoserver/.NET Core 1.1 的图像中,但我无法从 Windows 主机访问 运行 应用程序。

使用:Docker for Windows 17.0.31-ce-win10 (11972) 在由 macOS/vmWare Fusion 8.5.1 托管的 Windows 10 Pro 虚拟机上。

给出以下 Dockerfile

FROM microsoft/dotnet:1.1-runtime-nanoserver WORKDIR \app COPY \out . EXPOSE 80 EXPOSE 5000 ENTRYPOINT ["dotnet", "WebApi.dll"]

如果我使用命令 docker run {image} -P 5000:5000,我会得到以下输出(来自 .NET Core 1.1 Hello World 应用程序):

Hosting environment: Production Content root path: C:\app Now listening on: http://localhost:5000 Application started. Press Ctrl+C to shut down.

然后,在另一个终端 window,我发出以下命令:

docker inspect {container-name} 在那里我得到了这个显着的输出:

"Networks": { "nat": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "246469d0fe2936d87c5a923 "EndpointID": "2401e38f20539ac9fe562e "Gateway": "172.20.64.1", "IPAddress": "172.20.76.30", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "00:15:5d:33:3e:7a" } }

我无法使用以下位置访问 Web 应用程序:

localhost:5000, 172.20.76.30:80, 172.20.76.30:5000

然而奇怪的是,如果我 docker run microsoft/iis 我能够访问 {container's IP}:80

鉴于上述情况,我做错了什么导致 Windows VM 主机无法访问我的 Web 应用程序容器?我能够 ping 172.20.76.30 结果,我的容器能够 ping 172.20.64.1 (它的网关 IP 对应于 Windows VM 主机)但这是我所能做到的确认两个网络主机之间的路径。

最后,我将观察到该应用程序在 Windows 虚拟机上运行良好。我可以直接发出完全相同的命令 dotnet WebApi.dll 并使用 Chrome.

中的 localhost:5000 访问站点

编辑

目前 windows 确实存在限制。

根据博客 link 看来这是个坏消息:Docker Loop Back For Windows Containers

目前,window 容器只能通过其虚拟 IP 地址访问。尚不支持环回访问。

找出解决方案。我将 Dockerfile 的基本图像从 FROM microsoft/dotnet:1.1-runtime-nanoserver 换成了 FROM microsoft/aspnetcore:1.1.2-nanoserver,然后突然一切正常了。

我对它的工作原理感到有点惊讶,因为我可以从我的本地计算机 运行 dotnet WebApi.dll 没有问题,但我很高兴我找到了一个可以工作的 image/tag !

如果它开始工作是因为您切换到 aspnetcore 图像,那么它可能是端口映射问题,而不是网络问题。 aspnetcore 基础映像设置 ASP.NET Core 环境变量,告诉 Kestrel 侦听端口 80,而不绑定到 localhost:5000。最后一条语句中的关键是 localhost,除非您另有说明,否则 Kestrel 仅适用于本地流量。来自您的主机的流量不是本地的,因此它不会起作用。

如果出于某种原因你想使用 dotnet 图像而不是 aspnetcore 图像,那么你可以将 ASPNETCORE_URL 环境变量设置为 http://+:5000 或任何你想要的端口。