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

时间:2015-09-07 18:56:42

标签: docker

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

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

如何在Docker容器中获取映射端口

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

我将/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

答案 2 :(得分:1)

  

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

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

我能想到哪些会起作用并且最接近你所描述的是使容器打开与管理器的websocket连接。这样的连接将允许您的管理器和容器之间的两种方式通信,同时仍然通过HTTP。

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

参见例如:

如果您真的想要实施服务发现系统,那么可以选择让您的经理使用docker event命令(或其中一个docker client librairies)。这将使您的经理能够获得集装箱创建/删除的通知,而无需在集装箱方面做任何事情。

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