容器镜像仓库扩容需区分镜像文件存储与元数据/缓存层:前者通过换盘、改data-root或切对象存储实现;后者需将redis单节点升级为集群;迁移前须完成全量备份、灰度验证和维护窗口通告,迁移后须逐项验证ui、拉取推送、redis集群状态及扫描功能。

容器镜像仓库(如 Harbor)的存储扩容与数据迁移,核心在于区分两类存储:一是元数据与缓存层(如 Redis、数据库),二是镜像文件本体存储(即实际的 blob 数据)。二者扩容路径不同,不能混为一谈——搞错对象,容易白忙一场。
镜像存储后端扩容:换盘、挂新卷、改 data-root
Harbor 默认将镜像文件存放在底层 Docker 的 /var/lib/docker 或自定义的存储驱动路径(如 filesystem、s3、nfs、oss 等)。若使用本地存储且空间告急,需优先处理这部分:
- 确认当前镜像存储位置:
docker info | grep "Docker Root Dir"或查看 Harbor 的harbor.yml中storage_service配置项 - 若为本地目录(如
/data/harbor/registry),可直接迁移整个 registry 存储目录到更大磁盘,并更新配置指向新路径 - 若用 Docker 默认存储,需修改
/etc/docker/daemon.json的"data-root"字段,重启 dockerd 后迁移/var/lib/docker内容(务必先停服务、备份、校验) - 推荐长期方案:切换至对象存储(如 MinIO、AWS S3、阿里云 OSS),Harbor 原生支持,具备弹性伸缩、跨机房冗余能力,彻底规避单点磁盘瓶颈
元数据与缓存层扩容:Redis 集群化是关键
Harbor 依赖 Redis 存储会话、任务队列、扫描缓存等。单节点 Redis 容易成为性能与可用性瓶颈。扩容不是“加内存”,而是转向集群:
- 关闭原单节点 Redis,启用集群模式(
cluster-enabled yes),生成多节点配置(至少 3 主 3 从) - 新节点需统一配置
cluster-node-timeout、maxmemory和持久化策略(建议 AOF + RDB 混合) - 通过
redis-cli --cluster create初始化集群,并用--cluster-replicas 1指定副本数 - Harbor 服务需更新
harbor.yml中的redis地址为集群入口(如哨兵地址或代理层 VIP),不直连单节点
数据迁移前必须做的三件事
迁移不是复制粘贴,而是可控切换。跳过准备环节,极易导致镜像不可拉、任务堆积、UI 显示异常:
-
全量备份:导出所有项目级镜像清单(
curl -u admin:xxx harbor.example.com/api/v2.0/projects)、执行docker save备份关键基础镜像、备份 PostgreSQL 数据库(pg_dump -U postgres registry) - 灰度验证:在测试环境完整走一遍迁移流程,包括新存储挂载、Harbor 重部署、推送/拉取/扫描全流程回归
- 维护窗口通告:明确停服时间,提前通知开发与 CI/CD 系统暂停镜像推送,避免迁移中写入丢失
迁移后的必检项
上线不等于完成。以下检查项缺一不可:
- Harbor UI 能正常登录,各项目显示镜像数量与迁移前一致
- 执行
docker pull和docker push测试,观察日志中 registry 组件是否报 500 或 timeout - 检查 Redis 集群状态:
redis-cli -c -h xxx cluster nodes | grep master,确认主节点数量与槽位分配正常 - 验证扫描任务是否可新建、可完成,扫描结果能否在 UI 正确展示











