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

如何让Docker Swarm复用Docker Compose创建的现有数据卷?

解决Docker Swarm使用现有Compose数据卷的问题

从单机docker-compose迁移到Swarm集群时,数据卷不兼容确实是个容易踩的坑——Compose创建的是本地管理的卷,而Swarm默认会新建自己管理的卷,导致原有数据无法访问。下面是一步步的解决方法:


步骤1:停止现有Compose服务

首先停止正在运行的Compose服务,避免数据读写冲突:

docker-compose down

步骤2:确认现有数据卷

先列出所有本地卷,找到你之前创建的postgres_datamongo_data

docker volume ls

你会看到类似这样的输出(卷名就是你Compose里定义的):

DRIVER    VOLUME NAME
local     postgres_data
local     mongo_data
local     mongo_config

步骤3:将本地卷纳入Swarm管理

Swarm只能使用自身管理的卷或者标记为external的外部卷。这里推荐直接将现有本地卷标记为外部卷,无需迁移数据:
对每个需要保留的卷执行:

# 处理PostgreSQL卷
docker volume create --name postgres_data --driver local
# 处理MongoDB卷
docker volume create --name mongo_data --driver local

注意:如果卷已经存在,这个命令不会覆盖任何数据,只是把它注册为Swarm可识别的外部卷。

(可选)备份数据以确保安全

如果你担心操作风险,可以先备份卷数据:

# 备份postgres_data到当前目录的压缩包
docker run --rm -v postgres_data:/data -v $(pwd):/backup alpine tar czf /backup/postgres_backup.tar.gz -C /data .
# 备份mongo_data
docker run --rm -v mongo_data:/data -v $(pwd):/backup alpine tar czf /backup/mongo_backup.tar.gz -C /data .

后续如果出现问题,可以通过备份恢复数据。

步骤4:修改docker-compose.yml配置

volumes部分添加external: true,告诉Swarm这些卷是已存在的外部卷,不要新建:

version: '3'
services:
  # PostgreSQL
  db:
    image: postgres:12
    volumes:
      - postgres_data:/var/lib/postgresql/data/
  # MongoDB Server
  mongo:
    image: mongo:4.2
    volumes:
      - mongo_data:/data/db
      - mongo_data:/data/configdb
volumes:
  mongo_data:
    external: true  # 标记为外部卷
  postgres_data:
    external: true  # 标记为外部卷
  # 注意:原配置中的mongo_config未被服务使用,可直接移除

步骤5:用Swarm部署服务

现在执行部署命令,Swarm会直接使用你原来的数据卷:

docker stack deploy --compose-file docker-compose.yml mystack

步骤6:验证数据可用性

部署完成后,进入容器确认数据是否正常:

# 检查PostgreSQL数据
docker exec -it $(docker ps -q -f name=mystack_db) psql -U postgres -d your_database_name
# 检查MongoDB数据
docker exec -it $(docker ps -q -f name=mystack_mongo) mongo

重要注意事项

  • 如果你的Swarm是多节点集群,使用local驱动的卷只能在创建它的节点上访问。如果服务被调度到其他节点,会无法读取数据。这种情况下,你需要使用分布式存储卷驱动(比如NFS、GlusterFS等)来实现跨节点数据共享。
  • 迁移前务必备份数据,避免意外导致数据丢失。
  • 如果原卷中存在未使用的卷(比如你的mongo_config),建议直接从配置中移除,避免混淆。

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

火山引擎 最新活动