Docker 卷备份或恢复概述
使用捆绑脚本执行两个互斥工作流之一:
--backup [IMAGE]:备份当前机器上的所有本地 Docker 卷到一个加密的镜像中,然后将该镜像推送到已登录的注册表。
--backup-image IMAGE:显式备份镜像形式,用于需要明确专用标志的调用者。
--exclude-stop CONTAINER[,CONTAINER...]:备份时保留指定运行容器的选项,以保持网络出口或代理访问。
--restore IMAGE:拉取之前创建的备份镜像,解密其有效负载,创建缺失的卷,并恢复所有包含的卷。
此技能假设:
Docker 已安装。
Docker 守护进程可达。
当前 Docker 客户端已登录到目标注册表。
BACKUP_PASS 在执行前已在 shell 中导出。
在决定是否使用此基于注册表的工作流时,请阅读 references/limitations.md。
工作流 1. 验证先决条件
在运行脚本之前:
确认 Docker 工作:docker info
如果使用备份模式,确认 Docker 注册表登录存在。
脚本使用 docker info | grep -i "Username" 检查此项,并在未检测到登录时退出并提示。
导出加密密码:export BACKUP_PASS='your-strong-password'
使用兼容形式或显式形式。
兼容形式,匹配原始简单设计:bash scripts/docker_volume_backup_or_restore.sh --backup
bash scripts/docker_volume_backup_or_restore.sh --backup --exclude-stop v2raya
兼容形式,带有内联镜像值:bash scripts/docker_volume_backup_or_restore.sh --backup docker.io/yourname/volume-backup:old-host
显式公共分发友好形式:bash scripts/docker_volume_backup_or_restore.sh --backup-image docker.io/yourname/volume-backup:old-host
备份模式的作用:
验证 Docker 注册表登录,检查 docker info | grep -i "Username";如果未检测到登录,打印清晰的提示并在备份开始前退出
收集当前运行的容器名称并将其保存到 ./container_running_list
收集所有 Docker 卷名称并将其保存到 ./volume_list
停止运行的容器(除非通过 --exclude-stop 显式排除),以减少写入时不一致性
启动一个临时的 Alpine 容器,使用每个发现的卷以只读方式挂载在 /docker_volume/VOLUME_NAME 下
将所有挂载的卷内容复制到 /backup
创建 /backup 的 tar.gz 流
使用 BACKUP_PASS 加密该流,使用 openssl enc -aes-256-cbc -pbkdf2 -salt
将加密的存档存储为 /backup/volumes.tar.gz.enc 在临时容器中
docker commit 容器到所选备份镜像引用
docker push 该镜像到当前登录的注册表上下文
重新启动实际停止的容器以进行备份;排除的容器在备份过程中保持运行
镜像命名行为:
如果备份模式运行时没有镜像参数,脚本从当前主机名派生镜像名称。
如果备份模式接收到镜像参数,则使用该显式镜像引用。
对于公共/共享使用,请更喜欢 --backup-image IMAGE 或 --backup IMAGE,带有完整的注册表路径。
输出:
container_running_list
volume_list
在显式存储库引用或自动派生的主机名基于镜像引用处推送的镜像
运行:bash scripts/docker_volume_backup_or_restore.sh --restore docker.io/yourname/volume-backup:old-host
恢复模式的作用:
docker pull 提供的镜像
从该镜像运行临时容器
使用 BACKUP_PASS 解密 /backup/volumes.tar.gz.enc
检查存档内容以推断顶级卷名称
将这些名称保存到 ./volume_list
创建缺失的 Docker 卷,使用这些名称
运行另一个临时容器,使用所有目标卷挂载在 /docker_volume/VOLUME_NAME 下
解密和提取存档
将每个提取的目录复制回其匹配的 Docker 卷
文件 scripts/docker_volume_backup_or_restore.sh
两个模式的主要实现。
行为保证:
拒绝无效的参数组合
需要一个备份或恢复模式
支持兼容备份语法和显式公共友好备份语法
需要 BACKUP_PASS
尝试在备份后重新启动以前运行的容器,即使在失败时
在退出时删除临时备份/恢复容器
适应说明
对于公共分发,请更喜欢显式镜像引用,例如:docker.io/namespace/repo:tag
不带显式镜像的兼容形式对于个人使用方便,但它取决于主机名派生的镜像名称是否适合调用者的注册表工作流。
权衡
请阅读 references/limitations.md 以获取完整的警告列表。
主要问题是:
大型备份可能通过注册表推送/拉取缓慢且脆弱。
私有存储库限制可能使 Docker Hub 不合适。