【问题标题】:How to write a docker-compose for an application that runs in a cluster如何为在集群中运行的应用程序编写 docker-compose
【发布时间】:2019-05-08 00:29:04
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: docker-compose cluster-computing docker-swarm


    【解决方案1】:

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

    dig tasks.myservice +short

    【讨论】:

    • 我知道这个功能,只是它不能给我每个服务器的单个 IP 映射到多个 --cluster.peer 命令行标记 alertmanager 服务定义命令行。值得庆幸的是,我制定了一种可行的方法,即使它迫使我为每个集群成员使用服务定义。解决方案here
    【解决方案2】:

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-12
      • 2020-05-26
      • 2016-11-13
      • 2018-03-09
      • 2019-08-05
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      相关资源
      最近更新 更多