【问题标题】:How to get the mapped port on host from a docker container?如何从 docker 容器获取主机上的映射端口?
【发布时间】:2021-12-20 15:09:47
【问题描述】:

我想在不同主机上的一些 docker 容器中运行一个任务。我编写了一个管理器应用程序来管理容器(启动任务、停止任务、获取状态等...)。一旦容器启动,它会向管理器发送一个http请求,并带有它的地址和端口,这样管理器就会知道如何管理容器。

由于可能有多个容器在同一主机上运行,​​它们将被映射到不同的端口。要在我的管理器上注册一个容器,我必须知道每个容器映射到哪个端口。

如何在 docker 容器内部获取映射端口?

这里有一个解决方案 How do I know mapped port of host from docker container? 。但如果我使用 -P 运行容器,则它不适用。由于这个问题是 1 年多前提出的,我想知道 docker 中是否添加了一个新功能来解决这个问题。

【问题讨论】:

    标签: docker


    【解决方案1】:

    你也可以docker port container_id

    文档

    https://docs.docker.com/engine/reference/commandline/port/

    文档中的示例

    $ docker port test
    7890/tcp -> 0.0.0.0:4321
    9876/tcp -> 0.0.0.0:1234
    $ docker port test 7890/tcp
    0.0.0.0:4321
    $ docker port test 7890/udp
    2014/06/24 11:53:36 Error: No public port '7890/udp' published for test
    $ docker port test 7890
    0.0.0.0:4321
    

    【讨论】:

    • 谢谢,但这不能在容器内运行。是否可以在容器内获取端口?
    【解决方案2】:

    我将 /var/run/docker.sock 分享到容器并获取自我信息

    docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock alpine:latest sh
    

    在容器外壳中

    env //get HOSTNAME
    
    curl --unix-socket /var/run/docker.sock http://localhost/containers/3c6b9e44a622/json
    

    3c6b9e44a622 是您的主机名

    【讨论】:

    • 这里唯一的问题是,如果您的服务受到威胁,您将在整个 docker 系统上创建一个新的攻击向量...我想我宁愿制作一个专用的 docker 容器来为您提供信息容器......因为只有你的容器会与它通信,而不是外部世界
    【解决方案3】:

    一旦容器启动,它会向管理器发送一个http请求及其地址和端口

    这是行不通的。从容器内部,您无法确定容器端口映射到哪个 docker 主机端口。

    我能想到的最接近你描述的是让容器打开到管理器的 websocket 连接。这样的连接将允许您的管理器和容器之间通过两种方式进行通信,同时仍然通过 HTTP。


    您要实现的目标称为service discovery。已经有一些与 Docker 配合使用的服务发现工具。您应该选择其中之一,而不是尝试自己制作。

    例如:


    如果您真的想实现您的服务发现系统,一种方法是让您的经理使用docker event 命令(或docker client librairies 之一)。这将使您的经理能够收到有关容器创建/删除的通知,而无需在容器方面做任何事情。

    然后使用docker port查询docker主机以找出映射到您的容器的端口。

    【讨论】:

      猜你喜欢
      • 2020-02-29
      • 2017-08-02
      • 2014-09-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 2019-04-10
      • 2022-08-22
      • 1970-01-01
      相关资源
      最近更新 更多