具有Docker的Windows容器:无法从主机(Win2016 TP5)访问容器中的httpd

具有Docker的Windows容器:无法从主机(Win2016 TP5)访问容器中的httpd,windows,docker,containers,Windows,Docker,Containers,我有一台Windows Server 2016 TP5计算机,用作容器主机 我有一个运行的Windows容器,我用Docker管理它。在这个容器中,我有一个在端口88上运行的apachehttpd 启动容器时的端口映射为:0.0.0:80->88/tcp,因此我将容器主机的端口80映射到容器的端口88。 这是docker inspect的输出: 我现在可以通过DNS或IP从网络中的任何其他计算机访问Apache http起始页。 就我而言: 但是当我试图从主机系统本身或从容器内部调用相同

我有一台Windows Server 2016 TP5计算机,用作容器主机

我有一个运行的Windows容器,我用Docker管理它。在这个容器中,我有一个在端口88上运行的apachehttpd

启动容器时的端口映射为:
0.0.0:80->88/tcp
,因此我将容器主机的端口80映射到容器的端口88。 这是docker inspect的输出:

我现在可以通过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默认页面,无论是从主机还是在容器内部:

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

仅从主机或容器本身通过容器主机名和映射端口进行路由无法正常工作

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

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

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

环境:

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

    • 在微软的Github上得到了回复:

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


      作为Microsoft Github上的问题提交: