【问题标题】:How to access webserver running on localhost from a docker container on a network?如何从网络上的 docker 容器访问在 localhost 上运行的网络服务器?
【发布时间】:2016-04-19 20:39:34
【问题描述】:

我有以下系统配置:

  • Docker 容器在用户定义的网络上运行
  • docker-machine(在 OS:X 上使用 VirtualBox 转发端口 9000 到 9000)
  • http://localhost:9000 上运行的本地网络服务器

我不知道如何从我的 docker 容器向这个网络服务器发出基本的 http 请求。

为了测试我正在使用:

docker exec testcontainer curl --data "foobaz=foo" http://{hostname}:9000/

我尝试过的主机名:

  • '本地主机'
  • '127.0.0.1'
  • '192.168.99.100'(码头机器IP)

每次我收到错误或超时。当我在本地(不在 docker 和我的主机 OS:X 机器上)运行 curl 命令时,我能够成功发布 http 请求。

我无法断开 docker 容器与我的用户定义网络的连接。我也无法将我的网络服务器添加到该网络,因为它没有在容器中运行。另外,我知道以其他方式连接(卷曲到在 docker 容器中运行的网络服务器)很简单,但这不是我的用例。

如何成功地将来自作为用户定义网络一部分的 docker 容器的 http 请求路由到我的本地主机网络服务器?

【问题讨论】:

  • 如果你尝试 0.0.0.0:9000 会怎样?
  • 遗憾的是,我不知道(不过我会很好奇),抱歉,我什至不确定它是否会起作用。我很高兴它有所帮助。 :)
  • 所以它显然不起作用。也许它与您的 iptables 有关? :/(完全不确定,也只是搜索解释并给出假设)

标签: macos docker docker-machine


【解决方案1】:

您可以使用本地计算机的实际 IP 地址来执行此操作。

例如,如果你的 en0 IP 是 10.100.20.32在你的主机操作系统上,你可以运行:

docker exec testcontainer curl --data "foobaz=foo" http://10.100.20.32:9000/

这将成功地允许您发出 http 请求。

请注意,如果您是从主机 docker 网络上的容器执行此操作,这很简单,因为您可以直接访问 localhost0.0.0.0 而无需使用实际的机器 IP。

【讨论】:

    【解决方案2】:

    您可能想检查容器的 IP 地址是什么 - 您可以通过运行 docker inspect 找到它。 但是,如果您想使用 docker 机器 IP 访问在容器中运行的服务器进程,那么您应该“公开”您包含的应用程序正在侦听的端口 9000(使用 Dockerfile) - 这样,您仍然需要计算将 9000 容器端口映射到哪个端口(当您通过 $ docker ps 列出容器时显示。您还可以在启动容器时在命令行中指定端口绑定选项,如下所示:$ docker run -p 9000:9000 <your-container>

    【讨论】:

    • Also, I know it is trivial to connect the other way (curl to a webserver running in a docker container) but this is not my use case。我知道如何做你所说的。我想走相反的路……
    • 您能否确认网络服务器是否至少接受来自本地主机的连接,以及您是否可以使用其 IP 地址访问服务器(不是localhost127.0.0.1)。我怀疑您可能需要使用 0.0.0.0 绑定来启动 Web 服务器。
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2016-05-29
    • 2018-10-28
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多