【问题标题】:Windows Container with Docker: Cannot reach httpd in container from host (Win2016 TP5)带有 Docker 的 Windows 容器:无法从主机访问容器中的 httpd (Win2016 TP5)
【发布时间】:2016-09-03 20:04:08
【问题描述】:

我有一台 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

【问题讨论】:

标签: windows docker containers


【解决方案1】:

在微软的 Github 上得到回复:

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

这是我们的 Windows NAT 实施 (WinNAT) 中的一个已知限制 您无法访问静态端口映射中的外部端口 直接来自容器 (NAT) 主机。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多