【问题标题】:How can I inverse EXPOSE a port to a container?如何将端口反向暴露给容器?
【发布时间】:2018-04-25 14:26:34
【问题描述】:

我是 Docker 新手,我可能没有在文档中找到正确的位置,因为我找不到一种方法来执行我所谓的“反向 EXPOSE”。

例如,我有一个EXPOSE 80 的网络应用程序。同一个应用程序正在使用 postgresql 数据库。当我在本地开发时,它工作正常,因为我连接到localhost:5432,但是当我将应用程序容器化时,它会说“连接被拒绝”。我认为 Docker 的理念是尽可能地容器化,并使这些容器通过 docker 网络相互通信。但我很好奇是否真的可以说我的容器中的localhost:5432 实际上是指托管我的容器的实际机器上的端口 5432。

【问题讨论】:

  • downvoter 解释自己

标签: docker networking port


【解决方案1】:

容器内的本地主机不是您的 docker 主机,它是容器内的命名空间网络。因此,如果您尝试与容器内的 localhost 或 127.0.0.1 通信,它只会与在该容器内运行的其他应用程序通信。

相反,您应该使用主机的可路由 IP,以便请求可以从容器出来并返回到 docker 主机接口,以到达在容器外运行的应用程序。

【讨论】:

  • 是的,我知道这一点,但是如果 docker 主机没有公共 ip 怎么办?
  • 您不需要 docker 主机的公共 ip。只需使用 docker 主机的 ip (docker-machine ip)
  • docker 是否设置了环境变量,以便我可以动态获取容器内主机 ip 的值。如果我在我的代码中写入 ip 并将我的容器移动到另一台机器上,它可能会指向一个死位置。
  • Docker 不会注入这样的环境变量(可能用作信息泄漏和潜在的安全漏洞利用向量)。您需要自己指定环境变量。
  • @BMitch 谢谢这是非常有用的信息,我设法将这些信息保存在我的容器中并成功连接到我的 docker 主机的 postgresql 进程。
【解决方案2】:

当应用在容器中运行时,您应该使用IP:5432,例如主机的192.168.99.100:5432 而不是localhost

在容器中使用localhost 时,它指的是容器的localhost (127.0.0.1),而不是主机的localhost (127.0.0.1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 2017-10-12
    • 2021-08-05
    相关资源
    最近更新 更多