Docker 数据卷备份与恢复:别让容器重建带走数据
容器可以随时重建,数据不可以。数据库、上传文件和应用状态必须放在持久化存储中,并且能够独立备份和恢复。本教程用 Docker 命名卷演示一套最小可执行流程。
一、先确认数据在哪里
sudo docker volume ls
sudo docker compose config
sudo docker inspect 容器名 --format '{{json .Mounts}}'
命名卷的生命周期独立于容器。删除或重建容器通常不会删除卷,但执行 docker compose down -v 会删除 compose 管理的卷,务必谨慎。
二、备份命名卷
以下假设卷名为 knowhub_db_data:
mkdir -p ~/docker-backups
sudo docker run --rm \
-v knowhub_db_data:/source:ro \
-v "$HOME/docker-backups":/backup \
alpine sh -c 'cd /source && tar czf /backup/knowhub_db_data-$(date +%F-%H%M).tar.gz .'
ls -lh ~/docker-backups
数据库类服务更稳妥的做法,是同时保留应用层逻辑备份,例如 MySQL 的 mysqldump 或 PostgreSQL 的 pg_dump。卷归档用于整卷恢复,逻辑备份用于跨版本迁移和单库恢复。
三、恢复到一个新卷
sudo docker volume create knowhub_db_data_restore
sudo docker run --rm \
-v knowhub_db_data_restore:/target \
-v "$HOME/docker-backups":/backup:ro \
alpine sh -c 'cd /target && tar xzf /backup/你的备份文件.tar.gz'
sudo docker run --rm -v knowhub_db_data_restore:/data alpine ls -la /data
不要直接覆盖正在使用的生产卷。优先恢复到新卷,临时启动一套服务验证数据,再切换 compose 中的卷名。
四、备份是否真正有效
- 压缩包能正常列出内容:
tar tzf 备份文件.tar.gz | head。 - 备份文件复制到另一台主机或对象存储,避免与服务器同时损坏。
- 记录镜像版本、compose 文件、环境变量模板和恢复步骤。
- 至少每月做一次恢复演练,验证登录、查询和数据写入。
- 备份文件包含敏感数据时必须加密,并限制读取权限。
五、建议的保留策略
小型项目可采用“7 个日备份 + 4 个周备份 + 6 个月备份”。数据库变化频繁时缩短备份间隔,并把备份成功、文件大小异常和磁盘空间纳入监控。
Responses