这个问题类似于其他关于Windows网络主题的问题以及它们与Docker容器的关系,但我似乎无法找到解决我确切问题的方法。
我正在为新的预构建预发布的.NET Core 1.1应用程序设置Docker容器。我有一个Dockerfile,它将应用程序构建为支持nanoserver / .NET Core 1.1的映像,但我无法从Windows主机访问正在运行的应用程序。
在由macOS / vmWare Fusion 8.5.1托管的Windows 10 Pro VM上使用:Docker for Windows 17.0.31-ce-win10(11972)。
鉴于以下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.
然后,在另一个终端窗口中,我发出以下命令:
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
。
鉴于上述情况,我做错了什么导致我的Web应用程序容器无法访问Windows VM主机?我能够ping 172.20.76.30
获得结果,而我的容器能够ping 172.20.64.1
(其网关IP与Windows VM主机相对应),但就我而言#39}已经能够确认两个网络主机之间的路径。
最后,我将结束观察到该应用程序在Windows VM上运行得非常好。我可以直接发出完全相同的命令dotnet WebApi.dll
,并使用Chrome中的localhost:5000
访问该网站。
答案 0 :(得分:2)
如果它因为你切换到aspnetcore
图像而开始工作,那么它可能是一个端口映射问题而不是网络映射问题。 aspnetcore基本映像设置ASP.NET Core环境变量,该变量告诉Kestrel侦听端口80,而不绑定到localhost:5000
。最后一个语句中的关键是localhost,除非您另有说明,Kestrel仅适用于本地流量。来自您的主机的流量不是本地流量,因此无法使用。
如果您出于某种原因想要使用dotnet
图片而不是aspnetcore
图片,那么您可以将ASPNETCORE_URL
环境变量设置为http://+:5000
或任何端口你想要的。
答案 1 :(得分:0)
修改的
目前对Windows有一定的限制。
根据博客链接看似坏消息:Docker Loop Back For Windows Containers
目前,窗口容器只能通过其虚拟IP地址访问。尚不支持环回访问。
答案 2 :(得分:0)
找出解决方案。我将Dockerfile
的基本图片从FROM microsoft/dotnet:1.1-runtime-nanoserver
换成FROM microsoft/aspnetcore:1.1.2-nanoserver
,然后突然一切正常。
我有点意外,因为我可以毫无问题地从我的本地机器运行dotnet WebApi.dll
,但我很高兴我发现了一个有效的图像/标签!