我在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或任何有关这方面的建议会有所帮助。谢谢提前
答案 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)