带 Docker 的 Windows 容器 : Cannot reach httpd in container from host (Win2016 TP5)

标签 windows docker containers

我有一台用作容器主机的 Windows Server 2016 TP5 机器。

我有一个正在运行的 Windows 容器,我使用 Docker 管理。在这个容器中,我有一个在端口 88 上运行的 Apache httpd。

我启动容器时的端口映射是:0.0.0.0:80->88/tcp,所以我把我容器主机的80端口映射到容器的88端口。 这是 docker inspect 的输出:http://pastebin.com/AVem1eGV

我现在可以通过 DNS 或 IP 从网络中的任何其他计算机访问 Apache http 起始页。

以我为例:

但是当我尝试从主机系统本身或容器内部调用它时,它不起作用。因此,在主机系统上,我尝试通过浏览器或 wget 访问相同的 URL,并获得:

C:\> wget -UseBasicParsing http://documents.test2016-3.company.com/
wget : Unable to connect to the remote server

在这两种情况下。

但我可以从主机本身和容器 ping 主机。

来自主机:

C:\>ping test2016-3.company.com    
Ping wird ausgeführt für TEST2016-3.company.com [fe80::847a:1430:8a10:b120%4] mit 32 Bytes Daten:

从容器中:

PS C:\> ping documents.test2016-3.company.com
Pinging documents.test2016-3.company.com [10.10.1.162] with 32 bytes of data:

这似乎能够很好地解析名称。

不过,起作用的是通过容器主机名(即 win-de6u4068naf)及其运行端口直接(而不是通过端口映射)调用 Apache 默认页面,两者都来自主机以及容器内部:

http://win-de6u4068naf:88/

仅通过容器主机主机名和来自主机或容器本身的映射端口的路由无法正常工作!

防火墙规则允许端口 80 上的所有内容从任何远程地址或到端口 80(=入站和出站规则都设置为“允许”“任何”)。

我知道 Microsoft/Docker 将容器/docker 支持的网络代码库从 Windows Server 2016 TP4 更改为 TP5。不确定这是否相关,或者这是一个错误,还是我配置不正确。

我做了一个测试,将 Docker/Container 排除在上图中,并在容器主机系统上的端口 80 上安装了一个普通的 Apache httpd 本身(根本没有运行 Docker),只是为了检查这样的设置是否有效,为了确保它实际上以某种方式与 Docker/Container 相关,而不是我的网络/主机配置的一般问题。这工作正常,我可以从外部以及主机本身访问 Apache,因此它一定是与 Docker/Container 相关的问题。

环境:

  • Windows Server 2016 TP5
  • Docker 版本 1.12.0-dev,构建 2b97201

最佳答案

在微软的Github上得到回复:

https://github.com/Microsoft/Virtualization-Documentation/issues/253#issuecomment-217975932

This is a known limitation in our Windows NAT implementation (WinNAT) that you cannot access the external port in a static port mapping directly from the container (NAT) host.

关于带 Docker 的 Windows 容器 : Cannot reach httpd in container from host (Win2016 TP5),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37111498/

相关文章:

windows - Netbeans 更新失败

windows - Git:在 Windows 上重命名目录(仅区分大小写)

windows - configure, make, git on windows = how to compile install on windows

docker - 使用已安装的节点软件包的配置版本构建Docker镜像

wordpress - Lando 无法从我系统上的非 Lando 应用程序访问 URL

version - gradle中NamedDomainObjectContainer的用途是什么?

c++ - 从句柄获取文件路径

node.js - 将请求从一个 Docker 容器发送到另一个

c++ - 将数组的值修改为另一个数组时输出不正确

ios - 在 swift 2 中同时将数据从collectioview转接到两个容器