这个问题类似于其他关于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主机对应)但是_2926659已经能够确认两个网络主机之间的路径 .
最后,我能够直接发出完全相同的命令 dotnet WebApi.dll
并在Chrome中使用 localhost:5000
访问该网站 .
3 回答
如果它因为你切换到
aspnetcore
图像而开始工作,那么它可能是一个端口映射问题而不是网络映射问题 . aspnetcore基本映像设置ASP.NET Core环境变量,该变量告诉Kestrel侦听端口80,而不绑定到localhost:5000
. 最后一个语句中的关键是localhost,除非您另有说明,Kestrel仅适用于本地流量 . 来自您的主机的流量不是本地流量,因此无法使用 .如果由于某种原因想要使用
dotnet
图像而不是aspnetcore
图像,那么可以将ASPNETCORE_URL
环境变量设置为类似http://+:5000
或所需的任何端口 .编辑
Windows目前肯定有限制 .
根据博客链接看起来像坏消息:Docker Loop Back For Windows Containers
目前,窗口容器只能通过其虚拟IP地址访问 . 尚不支持环回访问 .
找出解决方案 . 我将
Dockerfile
的基本图像从FROM microsoft/dotnet:1.1-runtime-nanoserver
交换为FROM microsoft/aspnetcore:1.1.2-nanoserver
,突然一切正常 .我有点惊讶这个工作,因为我可以从我的本地机器运行
dotnet WebApi.dll
没有问题,但我很高兴我发现一个图像/标签工作!