【问题标题】:Unable to access Docker Nanoserver container web app无法访问 Docker Nanoserver 容器 Web 应用程序
【发布时间】:2017-05-11 13:50:14
【问题描述】:

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

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

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

鉴于以下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

鉴于上述情况,我做错了什么导致 Windows VM 主机无法访问我的 Web 应用程序容器?我能够ping 172.20.76.30 得到结果,并且我的容器能够ping 172.20.64.1(它的网关 IP 对应于 Windows VM 主机)但这是我能够确认的两个网络主机。

最后,我将观察到应用程序在 Windows VM 上运行良好。我可以直接发出完全相同的命令 dotnet WebApi.dll 并在 Chrome 中使用 localhost:5000 访问该站点。

【问题讨论】:

  • “nat”网络使用什么驱动程序?桥?主持人?空?
  • nat 网络在 Hyper-V 中设置为内部网络。如果您正在寻找比这更多的细节(以及在哪里可以找到它),请告诉我。感谢您的提问!
  • 好的,docker 虚拟局域网应该是内部的。如果您从终端执行docker network ls 命令并查看它在您的“nat”网络名称下列出的驱动程序。我相信您想使用bridge 驱动程序
  • docker network ls 产生以下内容:``` NETWORK ID NAME DRIVER Scope 1c086d38347a nat nat local 3e8fc51bda59 none null local ```

标签: docker nano-server


【解决方案1】:

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

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

【讨论】:

  • 感谢您的知识。我没有意识到 Kestrel 仅适用于本地流量 - 这解释了为什么尽管我的 Dockerfile 中有端口映射,它仍无法正常工作。
【解决方案2】:

编辑

windows 目前肯定有一个限制。

根据博客链接看起来是个坏消息:Docker Loop Back For Windows Containers

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

【讨论】:

  • 实际上,根据我在您的问题中提供给我的 OP 的输出,NAT 网络正在使用“nat”驱动程序。当我发出docker network rm nat 我得到Error response from daemon: none is a pre-defined network and cannot be removed.
  • 当我尝试创建一个新网络时(例如docker network create net1)我得到Error response from daemon: plugin not found
  • 我现在要运行这个 dockerfile,看看我是否有同样的问题。我之前在创建网络时没有看到过这个错误。
  • 听起来不错,谢谢先生!不用说,能够添加/删除网络可能与Dockerfile 无关,但我确实想确保在解决我的网络问题时不遗余力!
  • 我刚刚注意到您对答案的修改。在我的 OP 之前,我已经知道这篇文章。虚拟IP是docker inspect {containerName}返回的IP对吗?如果是这样,那么访问{containerName}:port 应该会产生应用程序。正如我在其他地方提到的,我能够运行 microsoft/iis 并在相应的容器 IP/端口上获取 IIS 默认页面,所以我认为这与 Windows 的网络设计(目前)无关。
【解决方案3】:

想出了解决办法。我将Dockerfile 的基本映像从FROM microsoft/dotnet:1.1-runtime-nanoserver 换成了FROM microsoft/aspnetcore:1.1.2-nanoserver,突然一切正常。

我有点惊讶这项工作,因为我可以在本地机器上运行 dotnet WebApi.dll 没有问题,但我很高兴我找到了一个有效的图像/标签!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2018-03-21
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多