镜像仓库的层别只堆本地盘:用 RustFS 给 Harbor 当 S3 后端

Harbor 里一个镜像仓库要是堆了几百个版本,镜像层直接吃满宿主机的本地盘是迟早的事。Harbor 把镜像的 blob(层数据)、清单和仓库链接都交给内嵌的 registry 组件,而这个组件原生支持 S3 存储驱动。只要把这个驱动指向 RustFS,镜像层就不再落在某台机器的磁盘上,而是进了可以横向扩的对象桶,多实例的 Harbor 也能共享同一份存储。本文用 Docker Compose 把 registry 组件接上 RustFS,推一个镜像、拉回来,再进桶里确认对象确实落下了。

镜像层为什么适合丢进对象存储

容器镜像本质是一堆只读层加一份清单(manifest),层与层之间靠内容寻址串起来。这种"写一次、不可变"的形态和对象存储的模型天然合拍:每一层是一个 blob 对象,仓库目录树是一组 link 文件。本地盘只负责 Harbor 自己的元数据,真正的容量压力被转移到了对象存储,给对象存储加容量比给每台 Harbor 节点换盘简单得多。

Harbor 通过 distribution 项目的 S3 驱动对接存储,对外只暴露一份 YAML 配置,所以接 RustFS 不需要改任何代码,填对端点、桶名和密钥就行。

把 registry 的 S3 驱动指到 RustFS

registry 的配置文件关键段这样写,替换掉占位符即可:

复制代码
storage:
  s3:
    accesskey: <your-access-key>
    secretkey: <your-secret-key>
    region: us-east-1
    regionendpoint: http://rustfs:9000
    bucket: my-bucket
    secure: false
    skipverify: true
  delete:
    enabled: true
  redirect:
    disable: true

regionendpoint 把驱动从 AWS 指到 RustFS;secure: false 表示在 Compose 网络内走纯 HTTP;redirect.disable: true 让 registry 自己吐 blob 数据,而不是让客户端去重定向到存储端点。RustFS 用路径风格(path-style)寻址,这套配置恰好对得上,不需要额外拼主机名。

起组件、推镜像、回拉

Compose 里先起 RustFS(控制台 9001、S3 端口 9000),再用一个初始化容器 rc mb 建好 my-bucket,最后起 goharbor/registry-photon:v2.12.2。registry 的 API 在 5000 端口,健康检查走 curl http://localhost:5000/v2/_catalog,返回空仓库列表就说明通了。

推一个镜像验证:

复制代码
docker pull busybox:latest
docker tag busybox:latest localhost:5000/demo/app:v1
docker push localhost:5000/demo/app:v1

删掉本地标签再从仓库拉回,层数据这次来自 RustFS:

复制代码
docker rmi localhost:5000/demo/app:v1
docker pull localhost:5000/demo/app:v1

桶里到底落了什么

等推送完成,进 RustFS 桶里列 docker/registry/v2/repositories/demo 这个前缀,会看到仓库目录树下的 link 文件,每个 71 字节:

复制代码
rc ls rustfs/my-bucket/docker/registry/v2/repositories/demo --recursive

真正的 blob 数据在 docker/registry/v2/blobs/ 之下。也就是说,即便 Harbor 节点没了,镜像层还在 RustFS 桶里,换一个 registry 指同一个桶就能读回来。

上线前要确认的边界

这套部署官方标注为本地集成测试,不是生产配置。落到生产至少有两点要注意:一是 secure: false 是纯 HTTP,公网或跨信任域的链路要换成 secure: true 加 skipverify: true,并通过 Harbor 的 ca_bundle 把自签 CA 喂给驱动;二是给 registry 单独建一组访问密钥,并通过 IAM 把权限收窄到这一个桶,别把管理密钥塞进 config.yml。

完整 Harbor 部署在 Helm 的 persistence.imageChartStorage 下填同样的 S3 选项,并设 disableredirect: true,基于 harbor.yml 的安装器则放到 storage_service.s3 之下。当前 RustFS 稳定版是 1.0.4(2026-10-25),对接命令以官方集成指南为准(docs.rustfs.com/zh/developer/integration/registry/harbor)。把镜像层迁进 RustFS 桶,容量焦虑就从给 Harbor 节点加盘变成了给桶加容量。

相关推荐
雪落漂泊2 小时前
Liunux进程(七):程序控制篇(中)
linux·运维·windows
IT古董2 小时前
AI 资讯日报 | 2026年10月25日:Kimi K3.1 Pro开源逼近前沿,OpenAI改离线训练,Claude合并Cowork,神经网络黑箱获新解,具身智能竞技场落幕
人工智能·神经网络·开源
分布式存储与RustFS3 小时前
工作流脚本和依赖 JAR 散在各节点本地盘:用 DolphinScheduler 资源中心接到 RustFS
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
Eyfcom3 小时前
〖物流云原生实战 01〗K8s Operator 在物流定时任务中的实践:从“裸 CronJob”到“声明式任务编排”
云原生·物流管理系统·物流云原生实战
冬奇Lab12 小时前
一天一个开源项目(第259篇):Modern Web Guidance —— Chrome 团队给 AI 编码 Agent 的「现代 Web 最佳实践」外挂
人工智能·开源
阿里云云原生16 小时前
阿里云智能体白皮书开源进展
云原生
阿里云云原生17 小时前
万联智策基于 AgentCore 构建数字员工团队,800+智能体规模化落地
云原生
孟健18 小时前
我用 REA 逆向自己的 Electron 桌面端,扒出 178 个 IPC 通道后我反而放心了
架构·开源·ai编程
分布式存储与RustFS19 小时前
群晖 NAS 被 C3RB3R 锁了:本地备份一起被加密,RustFS 对象锁为什么删不掉
运维·云原生·开源·对象存储·分布式存储·s3·性能基准