如何为在集群中运行的应用程序编写 docker-compose

How to write a docker-compose for an application that runs in a cluster

我正在 docker swarm 中设置监控堆栈,需要同时配置 prometheus alertmanager 和 hashicorp consul。

这两个工具都需要在启动时知道其他集群成员的主机名或 IP 地址。这些设置可以通过环境传递。

有没有办法在我可以传递给 docker 堆栈部署的 docker-compose 文件中执行此操作?

到目前为止我检查了什么
我看过其他人的解决方案,其中大多数似乎在创建 swarm 时依赖于使用云平台模板来生成必要的配置,或者强制节点具有已知的静态 IP。

我想要一个能够以声明方式描述服务配置的解决方案。 swarm 上的主机亲和力是可以接受的,我打算 运行 在 3-swarm-manager 配置中,每个 swarm 管理器主机在 1 个容器上提供这两项服务。

如果您已经为您的服务创建了自定义覆盖网络(您应该),您可以使用以下方法检索 'myservice' 服务中所有容器的 IP 地址:

dig tasks.myservice +short

经过更多研究,我找到了一种生成清晰简单的组合文件的方法,但缺点是您需要为每个集群服务实例定义一个服务定义运行.

services:
  alertmanager_1: # First cluster instance
    image: prom/alertmanager:latest
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
      - '--storage.path=/alertmanager'
      - '--cluster.peer=tasks.alertmanager_2:9094'  # links to second cluster instance via overlay DNS
    deploy:
      mode: global
      placement:
        constraints:
          - node.hostname == swarm-manager000000
    networks:
      prometheus_stack:
        aliases:
          - alertmanager
    ports:
        - '19093:9093'
    volumes:
      - alertmanager-data:/alertmanager
      - alertmanager-config:/etc/alertmanager
  alertmanager_2: # Second cluster instance
    image: prom/alertmanager:latest
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
      - '--storage.path=/alertmanager'
      - '--cluster.peer=tasks.alertmanager_1:9094' # refers to the first

...

networks:
  prometheus_stack:
    driver: overlay
    attachable: true 

编号的服务实例允许您在事先不知道主机名的情况下提供正确的对等配置命令行,覆盖网络别名允许您在需要该 DNS 配置的其他配置中将集群作为一个整体引用。 将其扩展到更大的集群将涉及添加更多服务定义并为每个额外实例添加一个 --cluster.peer 条目。 我已经完整描述了过程 here