我有一台用作容器主机的Windows Server 2016 TP5机器。
我有一个运行Docker的Windows容器 。 在这个容器里面,我有一个在端口88上运行的Apache httpd。
启动容器时的端口映射是: 0.0.0.0:80->88/tcp
:80->88/ 0.0.0.0:80->88/tcp
,所以我将容器主机的端口80映射到容器的端口88。 这是docker inspect
的输出: http : //pastebin.com/AVem1eGV
我现在可以通过DNS或IP从networking中的任何其他计算机访问Apache http启动页面。
在我的情况下:
但是, 当我尝试从主机系统本身或者从容器内部调用相同的function时,这也是行不通的 。 所以,在主机系统上,我尝试通过浏览器或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:
这似乎能够解决这个名字就好了。
尽pipe如此,通过容器主机名(即win-de6u4068naf)及其运行端口(不通过端口映射)直接从主机以及容器内调用Apache默认页面:
HTTP://共赢de6u4068naf:88 /
只要通过容器主机主机名和映射的端口从主机或容器本身的路线不能正常工作!
防火墙规则允许端口80上的所有内容从任何远程地址或端口80(=入站和出站规则都设置为“允许”“任何”)。
我知道Microsoft / Docker将容器/ docker支持的networking代码从Windows Server 2016 TP4更改为TP5。 不知道这是相关的,或者这是一个错误,或者我有一些configuration不正确。
我做了一个testing,把Docker / Container放在了上面的图片上,并在容器主机系统的端口80上安装了一个普通的Apache httpd(并且根本没有运行Docker)来检查这个设置是否工作,以便请确定它实际上是以某种方式与Docker / Container相关的,而不是一般的networking/主机configuration的问题。 这工作正常,我可以从外部以及从主机本身到达Apache,因此它必须是Docker / Container相关的问题。
环境:
在微软的Github上得到了回复:
https://github.com/Microsoft/Virtualization-Documentation/issues/253#issuecomment-217975932
在我们的Windows NAT实现(WinNAT)中,这是一个已知的限制,您不能直接从容器(NAT)主机的静态端口映射中访问外部端口。