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

我想在不同的主机上的一些docker容器中运行任务。 我写了一个pipe理器应用程序来pipe理容器(启动任务,停止任务,获取状态等)。 一旦一个容器启动,它会发送一个http请求给pipe理器,其地址和端口,所以经理将知道如何pipe理容器。

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

如何获得docker集装箱的映射端口?

有一个解决scheme在这里如何知道docker集装箱主机的映射端口? 。 但是,如果我用-P运行容器,则不适用。 由于这个问题是在一年多以前问过的,所以我想知道是否有一个新的function添加到docker解决这个问题。

一旦容器启动,它将发送一个http请求到pipe理器的地址和端口

这不会工作。 从一个容器中你不能找出一个容器端口映射到哪个docker主机端口。

我能想到哪些方法可行,而且与您所描述的最接近的地方是让容器与经理打开一个websocket连接 。 这样的连接将允许经理和容器之间通过HTTP进行通信的两种方式。


你试图实现的是所谓的服务发现 。 目前已经有Docker的服务发现工具。 你应该select其中的一个,而不是试图制造自己的。

例如见:

  • ETCD
  • 领事
  • 动物园pipe理员

如果你真的想要实现你的服务发现系统,一个方法就是让你的经理使用docker docker event命令(或者docker客户端库中的一个 )。 这将使您的经理能够得到容器创build/删除的通知,而无需在容器方面做任何事情。

然后查询docker主机,找出映射到您的容器与docker port

你也可以使用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 

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

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

在容器shell

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

3c6b9e44a622是您的HOSTNAME