【问题标题】:Getting a list of services from inside a Docker container in Swarm Mode在 Swarm 模式下从 Docker 容器中获取服务列表
【发布时间】:2020-07-14 03:42:41
【问题描述】:

我正在尝试查找所有正在运行且具有特定标记的 Docker Swarm Mode 服务的列表 - 但来自容器内部。

我知道将 docker.sock 挂载到容器中的技巧,但我正在寻找一种更优雅/更安全的方式来检索此信息。

基本上,我希望我的应用能够“自动发现”其他可用服务。由于 docker swarm manager 节点已经拥有这些信息,这将消除对像 Consul 这样的专用服务注册表的需要。

【问题讨论】:

  • 我不明白您为什么认为安装 docker socket 是一种黑客行为。容器的想法是隔离应用程序,如果你想打破这种隔离,我看不到其他与 docker 守护进程通信的方式,安全性也取决于开发人员,因为 docker 经常出现这种情况。
  • 嗯,我希望有一个只读的 docker REST API 或类似的东西,以确保即使客户端设法闯入容器也不会出错。但是,我希望,以只读方式安装套接字应该已经足够了。

标签: docker docker-swarm


【解决方案1】:

您可以从容器内查询 docker REST API。

例如在MacOS上,在主机to list docker images上运行:

curl --unix-socket /var/run/docker.sock http:/v1.40/images/json

要在容器中运行相同的,首先在主机上安装socat

然后使用socat在主机的unix-socket /var/run/docker.sock和主机的2375端口之间建立一个中继:

socat TCP-LISTEN:2375,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock

然后从容器中查询主机的 2375 端口:

curl http://host.docker.internal:2375/v1.40/images/json

您应该会看到相同的结果。

注意事项:

  • 我没有初始化 docker swarm,所以示例使用 docker 镜像 清单。有关列出服务 api 的信息,请参阅 Docker 文档。

  • 你可以从docker info的输出中找到API版本

  • 如果您不使用 MacOS,请参阅What is linux equivalent of “host.docker.internal”。最新的 Linux docker 版本应该支持host.docker.internal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多