docker镜像仓库备份核心是保护镜像数据、元数据和配置三部分,需针对registry或harbor等类型定位存储路径,用rsync增量备份文件系统或对象存储,并同步备份配置文件与tls证书;恢复时须按场景替换目录、还原数据库并验证拉取功能。

Docker 镜像仓库(如官方 registry、Harbor 或自建 registry)的备份与恢复,核心是保护镜像数据 + 元数据 + 配置三部分。它和单个镜像的 docker save/load 不同——仓库是服务级存储,备份对象是整个存储后端(通常是文件系统或对象存储),不是一个个镜像文件。
一、确认仓库类型和存储路径
先弄清你用的是哪种仓库,因为备份方式差异很大:
-
自建 Docker Registry(默认本地文件存储)
查看配置文件(通常是/etc/docker/registry/config.yml),找到storage段:storage: filesystem: rootdirectory: /var/lib/registry # 这就是你要备份的目录运行
docker volume inspect registry-data也能定位实际挂载点。 -
Harbor(推荐生产环境)
数据分散在多个组件中:- 镜像层:默认存于
/data/harbor/registry(或挂载的 NFS/S3) - 数据库(PostgreSQL):存储项目、权限、日志等元数据
- Redis:缓存信息(可丢,重启重建)
- 配置文件:
/harbor/harbor.yml及证书目录
- 镜像层:默认存于
-
云托管仓库(如 AWS ECR、阿里云 ACR)
本身具备高可用和跨区域复制能力,无需手动备份镜像数据,但需备份:- IAM 权限策略
- 镜像扫描规则、漏洞策略
- Repository 策略(如自动清理规则)
二、备份关键内容(以自建 registry 为例)
✅ 必备三项
-
镜像数据目录(如
/var/lib/registry)
包含所有镜像层、manifest、digest 校验信息。用rsync增量备份最稳:rsync -a --delete /var/lib/registry/ /backup/registry-full/
加
-z(压缩传输)、--exclude="tmp/"(跳过临时文件)更稳妥。 Registry 配置文件(如
/etc/docker/registry/config.yml)
记录认证方式、存储路径、HTTP 设置等,丢失则无法正确启动服务。TLS 证书与密钥(如
/certs/domain.crt和/certs/domain.key)
没有它们,HTTPS 就失效,客户端拉取会报x509 certificate signed by unknown authority。
⚠️ 可选但强烈建议
-
数据库备份(Harbor 必做)
pg_dump -U postgres -h localhost registry > /backup/harbor-db-$(date +%Y%m%d).sql
-
定期校验备份完整性
sha256sum /backup/registry-full/_data/v2/repositories/nginx/_manifests/revisions/sha256/* | head -n 3
三、恢复流程(按故障场景区分)
▪ 场景1:单节点 registry 完全宕机(磁盘损坏)
- 重装 registry 容器或服务
- 替换新
config.yml(确保rootdirectory路径一致) - 把备份的
/var/lib/registry/整体还原到原路径 - 启动 registry,用
curl -X GET https://your-registry/v2/_catalog测试是否返回镜像列表 - 任选一个镜像验证拉取:
docker pull your-registry/nginx:latest
▪ 场景2:Harbor 整体崩溃
- 恢复 PostgreSQL 数据库(先清空旧库,再
psql -U postgres ) - 还原
/data/harbor/registry/目录(保持属主为10000:10000) - 复制回
harbor.yml和证书,运行./install.sh --with-notary --with-clair(按原选项重装) - 登录 Harbor Web 页面,检查项目、镜像数量、扫描状态是否一致
▪ 场景3:误删某个仓库或镜像(非全库故障)
- 如果启用了 垃圾回收(garbage collection),立即停服务,从备份中拷贝对应 repo 子目录回来(路径形如
/var/lib/registry/v2/repositories/myapp/),再执行 GC 清理残留引用。 - 更安全的做法:不依赖 GC,日常启用 registry 的
deleteAPI 并配鉴权,配合脚本记录每次删除操作,便于快速回滚。
四、自动化与避坑提醒
不要只备份容器,要备份卷或宿主机路径
docker commit或docker export对 registry 容器无效——它只是运行时进程,数据不在容器内。-
避免在 registry 运行时直接
tar打包
可能导致 manifest 和 layer 文件状态不一致。建议:- 临时停服务
docker stop registry - 或用
rsync(它支持增量且对正在写入的文件更友好)
- 临时停服务
测试恢复必须做
每次备份后,在隔离环境跑一次完整恢复流程,验证能否成功pull镜像并run容器。-
备份保留周期建议
- 全量备份:每周一次
- 增量备份:每 4 小时一次(尤其高频推送场景)
- 至少保留 3 份历史备份(防止某次备份损坏)
不复杂但容易忽略。











