如何从主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