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

时间:2019-04-30 14:50:17

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

我要在docker群中设置监视堆栈,并且需要同时配置prometheus alertmanager和hashicorp领事。

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

是否可以在可以传递给docker stack deploy的docker-compose文件中执行此操作?

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

我想要一个可以声明性地描述服务配置的解决方案。群集上的主机相似性是可以接受的,我打算在3个群集管理器配置中,每个群集管理器主机在1个容器上运行两种服务。

2 个答案:

答案 0 :(得分:0)

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

dig tasks.myservice +short

答案 1 :(得分:0)

在进行了更多研究之后,我想出了一种方法,该方法可生成清晰且简单的撰写文件,但缺点是您需要为要运行的每个集群服务实例定义服务定义。

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