无法访问Docker Nanoserver容器web应用
这个问题与其他关于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) 给定以下无法访问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
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
时,我从后台程序得到错误响应:没有一个是预定义的网络,无法删除。
当我尝试创建新网络时(.edocker network create net1
)我从daemon:plugin not found得到错误响应
我现在要运行这个dockerfile,看看是否有同样的问题。我以前在创建网络时没有看到过这个错误。听起来不错,谢谢您,先生!不用说,能够添加/删除网络可能与Dockerfile
无关,但我确实想确保,在解决我的网络问题时,没有一块石头不被碰!我刚注意到你对答案的修改。在我的操作之前,我已经知道了这篇文章。虚拟IP是从docker inspect{containerName}
返回的IP,对吗?如果是这样,那么访问{containerName}:port
应该会产生应用程序。正如我在其他地方提到的,我能够运行microsoft/iis
,并在相应的co上获取iis默认页面