docker - 在 Docker Swarm 中运行的容器中获取完整容器名称的可靠方法

标签 docker docker-swarm

背景:我有一个设置,其中许多不同的可扩展服务通过连接池(每个实例)连接到它们的数据库。这些服务在 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)。

运行时docker ps在给定的 Swarm 节点上,我看到以下输出:

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) 是群服务名称和任务槽的组合。这两个都可以作为环境变量以及完整的任务名称(books-service.1.zabvo1jal0h2xya9qfftnrnej)传递给容器:

version: "3.0"
services:
  test:
    image: debian:buster
    command: cat /dev/stdout
    environment:
      SERVICE_NAME: '{{ .Service.Name }}'
      TASK_SLOT: '{{ .Task.Slot }}'
      TASK_NAME: "{{ .Task.Name }}"

通过这些后,您可以剥离 TASK_NAME 以获得您需要的内容,或者将 SERVICE_NAMETASK_SLOT 结合起来。想想看,您可以直接在模板中组合它们:

version: "3.0"
services:
  test:
    image: debian:buster
    command: cat /dev/stdout
    environment:
      MY_NAME: '{{ .Service.Name }}.{{.Task.Slot}}'

可以找到其他可能的占位符 here .

关于docker - 在 Docker Swarm 中运行的容器中获取完整容器名称的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66603133/

相关文章:

php - 使用 PHP 创建和删除文件后 Docker 不释放内存

docker - Logrotate - nginx 日志不在 docker 容器内旋转

Docker 在 compose/swarm 模式下的使用

docker - Docker Swarm 中任务的可发现性

shell - 如何使用端口号删除Docker容器

docker-machine - 来自守护程序 : rpc error: code = 2 desc = The swarm does not have a leader 的错误响应

Docker-Swarm:加入来自另一个子网的 docker-swarm

docker - 无法在 Google Cloud Run 上部署 Ubuntu 20.04 Docker 容器

nginx - Elastic Beanstalk 上的 WebSockets 与 Docker

Docker-compose:将主机名设置为等于容器运行所在的主机名