【发布时间】:2021-06-10 15:53:06
【问题描述】:
背景:我有一个设置,其中许多不同的可扩展服务通过连接池(每个实例)连接到它们的数据库。这些服务在 Docker Swarm 中运行。
在我当前的数据库设置中,结果如下(在本例中使用 PostgreSQL):
PID | Database | User | Application | Client | ...
... | db1 | app | --standard JDBC driver string-- | x | ...
... | db1 | app | --standard JDBC driver string-- | y | ...
... | db1 | app | --standard JDBC driver string-- | y | ...
... | ... | app | ... | x | ...
... | ... | app | ... | x | ...
... | db2 | app | --standard JDBC driver string-- | y | ...
... | db2 | app | --standard JDBC driver string-- | y | ...
... | ... | app | ... | x | ...
... | ... | app | ... | x | ...
我想要做的实际上是向 DBMS 提供 当前 Docker Swarm 容器名称,包括缩放标识符,以便能够更好地监控数据库连接,即:
PID | Database | User | Application | Client | ...
... | db1 | app | books-service.1 | x | ...
... | db1 | app | books-service.2 | y | ...
... | db1 | app | books-service.3 | y | ...
... | ... | app | ... | x | ...
... | ... | app | ... | x | ...
... | db2 | app | checkout-service.2 | y | ...
... | db2 | app | checkout-service.2 | y | ...
... | ... | app | ... | x | ...
... | ... | app | ... | x | ...
(显然,设置连接字符串是微不足道的 - 它正在获取要设置的信息)
由于我的应用程序由 Docker Swarm 管理(将来某个时候,可能是 Kubernetes),我无法通过环境手动设置此值(因为我不执行 docker run)。
在给定的 Swarm 节点上运行 docker ps 时,我看到以下输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59cdbf724091 my-docker-registry.net/books-service:latest "/bin/sh -c '/usr/bi…" 7 minutes ago Up 7 minutes books-service.1.zabvo1jal0h2xya9qfftnrnej
0eeeee15e92a my-docker-registry.net/checkout-service:latest "/bin/sh -c 'exec /u…" 8 minutes ago Up 8 minutes checkout-service.2.189s7d09m0q86y7fdf3wpy0vc
值得注意的是NAMES 列,其中包含给定容器(或图像,但您更愿意查看它)的实际实例 的标识符。请注意,此名称不是容器的主机名,默认情况下是容器 ID。
我知道有一些方法可以确定应用程序是否在 Docker 中运行(例如 using /proc/1/cgroup),但这对我也没有帮助,因为这些方法也只列出了容器 ID。
有没有办法从集群中运行的 Docker 容器中获取这个值?
【问题讨论】:
-
如果我弄错了,请纠正我,您想从容器内获取
books-service.1.zabvo1jal0h2xya9qfftnrnej,对吗?还是只是名称的一部分? -
是的,没错。更具体地说,我想获得该值,以便我可以提取
books-service.1部分。如果有办法直接获得books-service.1,那也很好。如果有办法自己获取1,那个也可以。
标签: docker docker-swarm