我有一台 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默认页面(而不是通过端口映射),这两者都来自主机以及容器内部:
从主机或容器本身通过容器主机主机名和映射端口的路径无法正常工作!
防火墙规则允许端口80上的所有远程地址或端口80(=入站和出站规则都设置为“允许”为“任何”)。
我知道Microsoft / Docker将容器/ docker支持的网络代码库从Windows Server 2016 TP4更改为TP5。不确定这是否相关,或者这是一个错误还是我还没有正确配置。
我做了一个测试并将Docker / Container从上图中取出并在端口80上的容器主机系统上安装了一个普通的Apache httpd(并且根本没有运行Docker),只是为了检查这样的设置是否有效,为了确保它实际上与Docker / Container有关,而不是我的网络/主机配置问题。这很好用,我可以从外部和主机本身到达Apache,因此它必须是与Docker / Container相关的问题。
环境:
答案 0 :(得分:1)
得到了微软的Github回复:
https://github.com/Microsoft/Virtualization-Documentation/issues/253#issuecomment-217975932
这是我们的Windows NAT实现(WinNAT)中的已知限制 您无法在静态端口映射中访问外部端口 直接来自容器(NAT)主机。