
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 节点加盘变成了给桶加容量。