无损备份需用临时容器只读挂载卷,选alpine等轻量镜像执行tar归档,数据库须停库或用mysqldump导出后再备份,并验证归档完整性与可恢复性。
用临时容器挂载卷做无损备份,核心是隔离运行环境、避免直接操作宿主机路径,并确保数据一致性。关键不在“快”,而在“稳”——不干扰原服务、不破坏源数据、不丢失权限和状态。
只读挂载是底线
源数据卷必须以 :ro(只读)方式挂载,这是防止备份过程中意外写入或覆盖的硬性要求。即使原容器仍在运行,只要备份容器无法修改卷内容,就能规避数据损坏风险。
- 错误写法:
-v mydata:/data—— 可读可写,存在并发写入冲突可能 - 正确写法:
-v mydata:/data:ro—— 强制只读,保障源卷安全 - 若备份失败提示“permission denied”,不是去掉
:ro,而是检查容器内执行用户是否对/data有读权限(可用alpine镜像配合ls -l /data调试)
选轻量镜像,聚焦归档动作
推荐使用 alpine 或 busybox 镜像,体积小、启动快、攻击面窄,专为这类一次性任务设计。Ubuntu 等通用镜像没必要,反而增加拉取延迟和潜在干扰。
- 基础命令示例:
docker run --rm \-v app_data:/data:ro \-v $(pwd):/backup \alpine tar czf /backup/app_data_$(date +%Y%m%d).tar.gz -C /data . - 其中
tar czf ... -C /data .表示切换到/data目录后打包全部内容,保留相对路径结构 - 加
-p参数(即tar czpf)可保留文件属主、权限、时间戳等元信息,恢复时更接近原始状态
避开常见一致性陷阱
数据库类应用(如 MySQL、PostgreSQL)在运行中持续写入,直接备份文件可能导致事务不完整。这不是临时容器的问题,而是备份时机问题。
- 简单场景(日志、静态配置、文件服务):可直接备份,影响极小
- 数据库场景:优先停库或使用应用级导出(如
mysqldump),再备份导出文件;若必须文件级备份,建议搭配FLUSH TABLES WITH READ LOCK+ 快速归档(需在容器内执行,非仅靠挂载) - 不要尝试备份
/var/lib/docker/volumes/xxx/_data宿主机目录 —— 权限错乱、进程占用、overlay2 元数据混杂,极易出错
备份后务必验证可用性
生成 .tar.gz 不等于备份成功。建议每次备份后快速抽检:
- 用
tar tzf backup.tar.gz | head -20查看归档内容是否正常列出 - 挑一个关键文件解压比对:
tar xzf backup.tar.gz -C /tmp/test-restore ./config.json && diff /tmp/test-restore/config.json /path/to/live/config.json - 定期执行一次完整恢复演练:新建空卷 → 解压到新卷 → 挂载给测试容器 → 验证服务能否正常读取











