无法访问Docker Nanoserver容器web应用

无法访问Docker Nanoserver容器web应用,docker,nano-server,Docker,Nano Server,这个问题与其他关于Windows网络以及它们与Docker容器的关系的问题类似,但我似乎找不到解决我的确切问题的方法 我正在为新的预构建预发布的.NETCore1.1应用程序设置Docker容器。我有一个Dockerfile,它将应用程序构建到启用nanoserver/.NET Core 1.1的映像中,但我无法从Windows主机访问正在运行的应用程序 在macOS/vmWare Fusion 8.5.1托管的Windows 10 Pro虚拟机上使用:Docker for Windows 17

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

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

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

给定以下
Dockerfile


来自microsoft/dotnet:1.1-runtime-nanoserver
WORKDIR\app
复制\输出。
暴露80
曝光5000
入口点[“dotnet”,“WebApi.dll”]

如果我使用命令
dockerrun{image}-p5000:5000
,我会得到以下输出(来自.NETCore1.1HelloWorld应用程序):


托管环境:生产
内容根路径:C:\app
现在收听:http://localhost:5000
应用程序已启动。按Ctrl+C组合键关闭。

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

docker-inspect{container-name}
我从中得到了这个值得注意的输出:


“网络”:{
“nat”:{
“IPAMConfig”:空,
“链接”:空,
“别名”:空,
“网络ID”:“246469d0fe2936d87c5a923
“端点ID”:“2401e38f20539ac9fe562e
“网关”:“172.20.64.1”,
“IP地址”:“172.20.76.30”,
“IPPrefixLen”:16,
“IPv6Gateway”:“,
“Globalipv6地址”:“,
“GlobalIPv6PrefixLen”:0,
“MacAddress”:“00:15:5d:33:3e:7a”
}
}

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

localhost:5000
172.20.76.30:80
172.20.76.30:5000

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

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

最后,我将通过观察得出结论,即该应用程序在Windows虚拟机上运行良好。我能够直接发出完全相同的命令
dotnetwebapi.dll
,并使用Chrome中的
localhost:5000
访问该站点。

编辑

目前windows肯定有一个限制

从博客链接来看,这似乎是个坏消息:


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

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


我有点惊讶,因为我可以从本地机器上毫无问题地运行
dotnetwebapi.dll
,但我很高兴我找到了一个有效的图像/标记

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


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

nat网络使用的是什么驱动程序?桥?主办Null?nat网络在Hyper-V中设置为内部网络。请让我知道,如果你正在寻找更多的细节比这(和我在哪里可以找到它。)谢谢你的询问!好,docker虚拟lan应该是内部的。如果从终端执行
docker network ls
命令,并查看它在“nat”网络名称下列出的驱动程序。我相信您希望使用
网桥
驱动程序
docker network ls
生成以下内容:``网络ID名称驱动程序作用域1c086d38347a nat nat local 3e8fc51bda59 none null local``实际上,NAT网络正在使用“NAT”驱动程序,根据我在您的问题中向我的OP提供的输出。当我发出
docker network rm NAT
时,我从后台程序得到
错误响应:没有一个是预定义的网络,无法删除。
当我尝试创建新网络时(.e
docker network create net1
)我从daemon:plugin not found得到
错误响应
我现在要运行这个dockerfile,看看是否有同样的问题。我以前在创建网络时没有看到过这个错误。听起来不错,谢谢您,先生!不用说,能够添加/删除网络可能与
Dockerfile
无关,但我确实想确保,在解决我的网络问题时,没有一块石头不被碰!我刚注意到你对答案的修改。在我的操作之前,我已经知道了这篇文章。虚拟IP是从
docker inspect{containerName}
返回的IP,对吗?如果是这样,那么访问
{containerName}:port
应该会产生应用程序。正如我在其他地方提到的,我能够运行
microsoft/iis
,并在相应的co上获取iis默认页面