如何从docker容器获取主机上的映射端口?

iur*_*adz 12 docker

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

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

如何 docker容器中获取映射端口?

这里有一个解决方案如何从docker容器中知道主机的映射端口?.但是如果我使用-P运行容器则不适用.由于这个问题是在1年多前提出的,我想知道也许有一个新的功能添加到docker来解决这个问题.

use*_*097 11

你也可以 docker port container_id

文件

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

来自doc的例子

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但这不能在容器内运行.是否可以将端口放入容器内? (2认同)

Tho*_*eil 4

一旦容器启动,它将向管理器发送一个带有其地址和端口的http请求

这不会起作用。从容器内部,您无法确定容器端口映射到哪个 docker 主机端口。

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


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

例如参见:


如果您确实想实现服务发现系统,一种方法是让您的经理使用该命令(或docker 客户端库docker event之一)。这将使您的经理能够收到有关容器创建/删除的通知,而无需在容器端执行任何操作。

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