You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Docker Compose配置Docker Swarm集群同节点运行数据库与备份容器

如何在Docker Swarm中通过Compose让MongoDB和备份容器运行在同一节点?

嘿,这个问题我熟!要让MongoDB和备份容器牢牢绑定在Docker Swarm的同一节点上,核心就是利用Swarm的调度约束配置。我直接给你改好的Compose文件,再一步步讲清楚怎么操作:

修改后的完整Docker Compose配置

version: "3.8"  # 推荐用更高版本,对Swarm特性支持更完善
services:
  my_mongodb:
    image: mongo
    environment:
      - MONGO_DATA_DIR=${DATA_DIR}
    networks:
      - webnet
    deploy:
      placement:
        constraints:
          - node.labels.mongo-node==true  # 指定容器跑在带有该标签的节点上
      replicas: 1  # MongoDB单实例场景设为1,避免多实例数据冲突
    volumes:
      - mongodb-data:${DATA_DIR}  # 添加持久化卷,防止数据丢失

  my_backup:
    image: mybackup
    environment:
      - MONGO_DATA_DIR=${DATA_DIR}
    networks:
      - webnet
    deploy:
      placement:
        constraints:
          - node.labels.mongo-node==true  # 和MongoDB用完全相同的节点标签,确保同节点部署
      depends_on:
        - my_mongodb  # 确保备份容器在MongoDB启动后再运行,避免数据库未就绪
    volumes:
      - mongodb-data:${DATA_DIR}:ro  # 只读挂载MongoDB的数据卷,安全访问备份数据

# Swarm集群需要用overlay网络
networks:
  webnet:
    driver: overlay

# 定义持久化数据卷
volumes:
  mongodb-data:

关键操作步骤说明

1. 给目标节点打标签

首先在你的Swarm集群里选一台你想要运行这两个容器的节点,执行以下命令给它打上专属标签:

docker node update --label-add mongo-node=true <你的节点ID或主机名>

这个标签是Swarm调度器的“导航标记”,所有带有node.labels.mongo-node==true约束的容器都会被安排到这台节点上。

2. 配置核心要点解析

  • deploy.placement.constraints:这是实现同节点部署的核心,两个容器用完全相同的节点标签约束,Swarm就会把它们调度到同一台机器。
  • 持久化卷:给MongoDB添加了命名卷,备份容器以只读方式挂载,既保证备份能访问数据,又避免误修改数据库文件。
  • depends_on:确保备份容器在MongoDB启动完成后再启动,避免备份时数据库还没就绪的问题。
  • Overlay网络:Swarm集群内服务通信必须用overlay网络,能跨节点实现服务发现。

额外注意事项

  • 如果不想用节点标签,也可以直接指定节点主机名作为约束:node.hostname==<你的节点主机名>,但标签更灵活,后续换节点只需要修改节点标签,不用改Compose文件。
  • 部署时必须用Swarm模式的命令:docker stack deploy -c docker-compose.yml <你的栈名称>,不要用普通的docker-compose up
  • 确保你的Swarm集群已经完成初始化(执行过docker swarm init),且目标节点已加入集群。

内容的提问来源于stack exchange,提问作者zella

火山引擎 最新活动