【问题标题】:Windows Container port binding not working on Windows Server 2016 (using Docker)Windows 容器端口绑定在 Windows Server 2016 上不起作用(使用 Docker)
【发布时间】:2017-12-02 17:24:59
【问题描述】:

我在 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,因此两者之间没有中间 VM(没有 docker 机器),因此“主机”是我运行 docker 的实际 Windows Server开。

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

我尝试使用以下命令通过命令行添加代理

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

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 或任何关于此的建议都会有所帮助。在此先感谢

【问题讨论】:

    标签: docker-container docker-for-windows


    【解决方案1】:

    我是 Microsoft Windows 核心网络团队的 PM 负责人。这个回答是正确的(虽然我不能赞成)。我们将在 Windows 的下一个半年频道 (SAC) 版本(针对 2018 年第二季度)中添加对 localhost 通信的支持。您可以注册以获取 Insider 构建(在正式 GA 之前),此功能应该会在接下来的几周内包含在这些构建中。

    【讨论】:

    • 这是对另一个答案的评论吗?
    • 非常感谢您的信息。顺便说一句,请删除此答案并将其作为对现有答案的评论发布(Stackoverflow 规则)。
    【解决方案2】:

    这是当前 Windows 网络实现中的错误。 (https://docs.microsoft.com/en-us/virtualization/community/team-blog/2016/20160525-windows-nat-winnat-capabilities-and-limitations)

    直接从主机内部端点访问内部端点 分配给虚拟机或容器不能使用外部访问 NAT 静态端口映射中直接从 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.

    【讨论】:

    • 这对我不起作用。尝试了所有选项: :8080 :80 :8080
    【解决方案3】:

    只要确保你的 package.json 在你的“ng serve”条目中包含这个参数...

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 2019-12-10
      • 2021-06-07
      • 2021-07-23
      • 2020-02-26
      • 2021-11-04
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多