Windows 无法连接到 Docker 中的 ASP.Net 站点

Can't connect to ASP.Net site in Docker for Windows

我无法从主机连接到 Docker 上 Windows 容器中的 ASP.Net 网站 运行。我可以毫无问题地连接到 Linux 容器中的网站 运行。

我尝试连接到本地主机和分配给容器的 IP 端口,但在这两种情况下我都收到超时错误。

我尝试了几个 ASP.Net 示例,这些示例已经预先构建,并尝试构建我自己的自定义图像。在每种情况下,我都会遇到相同的超时错误。我也尝试过卸载并重新安装 docker 但这并没有改变任何东西。

我是 运行 Windows 10 Pro 和 Docker Community Edition Version 17.03.1-ce-win12 (12058)

最终,我能够使用 Microsoft Vitualization 清理脚本的自定义旧版本完全重置我的容器网络。 https://github.com/Microsoft/Virtualization-Documentation/tree/live/windows-server-container-tools/CleanupContainerHostNetworking 这重置了我的容器网络,现在一切都按预期工作。

摘要:

  • 当使用容器的 Dockerfile 中的 EXPOSE 指令定义容器的已发布 port/s 时,-P 参数必须与 docker run命令为了"activate"那些暴露的port/s.
  • Windows 容器主机无法使用 localhost127.0.0.1 或其外部访问它正在 运行ning 的容器主机 IP 地址。通过使用来自第二个主机 B 的 A 的 IP 地址,访问给定主机 A 上的容器 运行ning。或者,您可以直接使用容器的 IP 地址。

完整解释:

因此,在确保创建适当的防火墙规则方面存在一些细微差别,并且您的容器实际上可以在其发布的 port/s 上访问。

例如,我假设您的 ASP.Net 容器化应用程序是由容器映像定义的,而容器映像是由 Dockerfile 定义的。 如果是这样,您可能使用 Dockerfile EXPOSE 指令为 image/app 定义了发布端口。 在这种情况下,当您实际 运行 容器时您需要使用 docker run 命令的“-P”参数 "activate" 发布的端口。

例如,如果您的容器映像是 web_app,并且该映像的 Dockerfile 包含行 EXPOSE 80,那么当您继续 运行 时,您需要该映像做类似的事情:

    C:\> docker run -P web_app

容器 运行ning 后,它应该在容器端口 80 上可用。然后您可以继续通过浏览器查看应用程序。为此,您有两个选择:

  1. 您可以从容器主机访问应用程序,使用容器 IP 和端口

    使用 docker network inspect nat 查找容器 IP,然后查找与您的容器对应的 endpoint/IP 地址。

    你也可以通过运行宁docker exec <CONTAINER ID> ipconfig为容器IP注资,其中<CONTAINER ID>是你容器的ID。

    您可以在容器主机上通过 运行ning docker ps 获取容器的 ID 和容器的公开端口。

  2. 您可以从另一台主机访问该应用程序,使用容器主机 IP 和主机端口

    您可以使用 ipconfig.

    找到主机的 IP 地址

    您可以通过 运行ning docker ps 从主机识别您的应用程序在其上公开的主机端口。然后,在 PORTS 下,您将看到 0.0.0.0:<HOST PORT>-><CONTAINER PORT>/TCP 形式的映射。在此映射 <HOST PORT> 中,是您的应用程序在主机上可用的端口。

    获得容器主机的 IP 地址以及您的应用程序在主机上可用的端口后,您可以使用该信息从浏览器访问您的应用程序 在单独的主机上

    注意:今天你不能以这种方式从它自己的主机访问容器——目前Windows容器主机不能访问它所在的容器运行ning,无论是否使用 localhost127.0.0.1 或主机 IP 地址。