Docker卷备份与恢复的核心是确保可重复、不丢数据、一致性,需区分命名卷和绑定挂载,执行停-打-验三步闭环,按场景选择覆盖或初始化恢复,并通过脚本、定时任务、多级保留及定期演练实现自动化管理。
直接用 Docker 卷做备份与恢复,核心不是“能不能”,而是“怎么确保每次操作都可重复、不丢数据、不破坏一致性”。关键在于把卷当作独立资产来管——它不属于某个容器,而属于你的业务数据体系。
先分清两类常见卷结构,它们的备份逻辑完全不同:
/var/lib/docker/volumes/ 下,比如 listmonk 的数据库卷 listmonk-data。这类卷不能直接用 ls 查看内容,必须通过容器挂载访问。./uploads:/listmonk/uploads。这类卷可直接用 tar 或 rsync 操作,无需容器介入。无论哪种卷,备份流程都要闭环,避免“以为备了,其实没成功”:
docker stop 或 docker pause 对应容器,防止写入中打包导致数据不一致;静态文件类卷(如上传目录)可跳过此步。docker run --rm -v listmonk-data:/source -v /backup:/backup alpine tar -czf /backup/db-$(date +%Y%m%d).tar.gz -C /source .
tar -tzf /backup/db-20260616.tar.gz | head -n 5,确认非空且路径合理。恢复不是简单解压,得匹配目标状态:
docker run --rm -v listmonk-data:/target -v /backup:/backup alpine sh -c "rm -rf /target/* && tar -xzf /backup/db-20260616.tar.gz -C /target"
docker volume create new-db,再挂载新卷执行同样解压命令。tar -xzf uploads-backup.tar.gz -C ./uploads,注意保留原始目录权限和属主。手动操作只能应急,真正规范靠机制:
scripts/backup.sh,包含时间戳、日志记录、失败退出判断;crontab 固定执行(如每天 2:00),日志重定向到 /var/log/backup.log;