Windows容器端口绑定在Windows Server 2016上不起作用(使用Docker)

时间:2017-06-29 06:31:01

标签: docker-container docker-windows

我在Windows主机(Windows Server 2016)上使用Docker运行Windows容器。我想将其绑定到主机端口8000.并运行这样的容器:

docker run -d -p 8000:8000 474614/my_repo:javaprogram

Docker版本:

PS C:\Users\Administrator> docker version
Client:
 Version:      17.03.1-ee-3
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   3fcee33
 Built:        Thu Mar 30 19:31:22 2017
 OS/Arch:      windows/amd64

Server:
 Version:      17.03.1-ee-3
 API version:  1.27 (minimum version 1.24)
 Go version:   go1.7.5
 Git commit:   3fcee33
 Built:        Thu Mar 30 19:31:22 2017
 OS/Arch:      windows/amd64
 Experimental: false

根据我的理解,因为我经常使用码头工具"本地"从具有Windows容器的Windows服务器,中间没有中间虚拟机(没有泊坞机),所以"主机"是我运行docker的实际Windows服务器。

所以我的问题是,为什么主机端口绑定不起作用?为什么我不能联系主持人?

我尝试使用以下命令

通过命令行添加代理
netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=8000 connectaddress="MY_HOST_IP" connectport=8000

我也感到困惑的是,当我在主机和容器上运行netstat时,我得到以下结果

主机上的netstat

PS C:\Users\Administrator> netstat -ab | findstr ":80"
  TCP    0.0.0.0:80             MYCOMPUTER:0      LISTENING
  TCP    127.0.0.1:8000         MYCOMPUTER:0     LISTENING
  TCP    [::]:80                MYCOMPUTER:0      LISTENING
PS C:\Users\Administrator>

netstat on container

PS C:\Users\Administrator> netstat -ab | findstr ":80"
  TCP    0.0.0.0:80             MYCOMPUTER:0      LISTENING
  TCP    127.0.0.1:8000         MYCOMPUTER:0     LISTENING
  TCP    [::]:80                MYCOMPUTER:0      LISTENING
PS C:\Users\Administrator>

但是当我尝试从我的主机访问localhost:8000或127.0.0.1:8000时,我会看到以下错误

This site can’t be reached

PS C:\Users\Administrator> docker run 474614/my_repo:javaprogram
Hello Java

当我运行图像时,我将得到上述结果。我试图通过浏览器查看结果,我该怎么做?是否可以在构建docker镜像时在dockerfile上分配ip?如果这样请帮助我使用示例dockerfile或任何有关这方面的建议会有所帮助。谢谢提前

3 个答案:

答案 0 :(得分:1)

这是Windows当前网络实施中的错误。 (https://blogs.technet.microsoft.com/virtualization/2016/05/25/windows-nat-winnat-capabilities-and-limitations/

  

直接从主机内部端点访问内部端点   无法使用外部访问分配给VM或容器   NAT静态端口映射中引用的IP /端口直接来自   NAT主机。从NAT主机,这些内部端点必须是   由他们的内部IP和端口直接解决。例如,   假设容器端点具有IP 172.16.1.100并且正在运行Web   正在侦听端口80的服务器。此外,假设端口映射   已通过docker创建,以转发来自主机IP的流量   TCP端口8080收到的地址(10.10.50.20)到容器   端点。在这种情况下,容器主机上的用户不能直接使用   使用外部映射的端口访问Web服务器。例如一个用户   在容器主机上操作无法访问容器Web服务器   间接地http://10.10.50.20:8080。相反,用户必须直接   访问http://172.16.1.100:80上的容器Web服务器。

     

这个限制的一个警告是内部端点可以   使用来自单独的VM /容器的外部IP /端口访问   在同一NAT主机上运行的端点:这称为hair-pinning。   例如。在容器A上运行的用户可以访问运行的Web服务器   在容器B中使用内部IP和端口   http://10.10.50.20:8080

答案 1 :(得分:1)

我是Microsoft Windows核心网络团队的PM主管。这种反应是正确的(虽然我不能投票)。我们将在Windows的下一个半年度频道(SAC)版本中添加对localhost通信的支持(针对Q2 CY2018)。您可以注册以获取Insider版本(在官方GA之前),并且这些功能应该在未来几周内包含在这些版本中。

答案 2 :(得分:0)

只需确保您的package.json在“ ng serve”条目中包含此参数即可...

ng serve