【问题标题】:Expose container port to Host using Docker for Windows in Windows 10在 Windows 10 中使用 Docker for Windows 将容器端口公开给主机
【发布时间】:2017-03-13 23:47:42
【问题描述】:

我正在阅读 docker API 并尝试创建一个简单的容器并公开 1 个端口。

在我的示例中,我有一个应用程序在容器内的 TCP 端口 9595 上进行侦听,我想从端口 @987654323 上的外部世界(即容器的主机)访问它@。

创建容器时,我有"ExposedPorts": { "9595/tcp: {}" }"PortBindings": { "9595/tcp": [{ "HostPort": "9090" }] }

所以,如果我从主机http://container_internal_ip:9595 访问它就可以了!但是,当我访问http://localhost:9090(这是我期望使用此端口映射功能时),它不起作用...

在运行docker port containerID 时,我有9595/tcp -> 0.0.0.0:9090,这应该意味着when connecting to any IP on the host, at port 9090, forward to the container in port 9595

那么,这里有什么问题?为什么我无法连接到 9090?

感谢任何澄清。

【问题讨论】:

  • 该问题没有足够的信息。我们至少需要 docker 命令、正在使用的镜像或 Dockerfile。 Windows 容器还是 Linux 容器?
  • Docker Remote API 针对什么 docker 引擎? Windows 容器? Linux 容器?没有基础镜像就无法运行容器。什么形象?你是怎么调用Docker Remote API的?这是一个很好的权利吗?你用了什么命令?如果您不提供足够信息,我无法知道您要问什么。
  • 抱歉,我无意对 Carlos 无礼,但您的 cmets 都与问题无关。图像是什么问题并不重要。重要的是,根据 API 文档,我将端口 9090 暴露在容器外部并映射到容器内部的端口 9595,但这是行不通的。 Netsh 不会对容器行为或配置产生任何影响。

标签: docker docker-for-windows


【解决方案1】:

请发布您正在使用的 docker 命令。

如果您使用 Docker Toolbox 或 Docker for Windows,则需要特殊处理。您应该可以毫无问题地看到 localhost(如果您的容器是 Linux)。如果您希望您的容器从外部可见,请尝试使用 Elevated Power Shell:

netsh interface portproxy add v4tov4 listenaddress=yourip listenport=9090 connectaddress=10.0.75.1 connectport=9090

如果你的容器是 Windows 但是你不会看到 localhost 并且你需要使用容器内部地址:

docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" <cointainerid>

参考:https://blog.docker.com/2016/09/build-your-first-docker-windows-server-container/

问候

【讨论】:

  • 你好 Carlos,是的,我在 win10 上使用最新的 docker for windows beta 和 docker info return "ServerVersion":"1.12.2-cs2-ws-beta" 并且根据 Docker API v1.24 (docs.docker.com/engine/reference/api/docker_remote_api_v1.24/…) PortBindings 确实存在。
  • 您需要为 Windows 的 docker 进行额外的端口重定向。我会更新答案
  • 其实我用的是docker inspect,它解释了命名法的区别。
  • 我认为这不是办法。您是否有任何官方文档来支持该答案?如果另一个端口当前正在工作,为什么我需要一个 Windows 端口转发?另外你在哪里看到致命错误? docker inspect 也返回相同的命名法,没有区别。
  • 好吧,我的回答基于:blog.docker.com/2016/09/… 特别是这部分:从运行容器的主机访问正在运行的应用程序(例如在 Windows 10 上运行或在 Windows Server 2016 系统上打开浏览器时)运行 Docker 引擎)使用容器 IP 和端口 5000。localhost 将不起作用。我假设您使用的是 Windows 容器。它们是我们唯一能做的事情假设,因为你没有发布你的docker命令,dockerfile,即使我要求
【解决方案2】:

该端口确实像预期的那样暴露于“外部世界”,由于当前的 Windows 网络限制,它恰好无法从环回接口(localhost 或 127.0.0.1)上的容器主机本身访问。与其尝试通过容器主机上的环回接口访问它,不如尝试使用容器主机 ip 和容器公开的端口号从网络上的另一台机器访问它。

https://blog.sixeyed.com/published-ports-on-windows-containers-dont-do-loopback/ 对此有一篇很好的文章

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    相关资源
    最近更新 更多