无法访问 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
或任何你想要的端口。
这个问题与其他关于 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
或任何你想要的端口。