Harbor私有镜像仓库实战:从0到1搭建企业级容器仓库
Harbor私有镜像仓库实战:从0到1搭建企业级容器仓库

文章目录
- Harbor私有镜像仓库实战:从0到1搭建企业级容器仓库
- 一、痛点场景:没有私有镜像仓库的团队到底有多惨?
- 二、痛点的解决方案:Harbor企业级镜像仓库架构
- 三、Harbor是什么?
- 四、为什么要用Harbor?
- 五、Harbor是怎么演进过来的?
- 六、Harbor架构详解
- 七、怎么用Harbor?从部署到上手
- 八、企业项目中如何使用Harbor?
- 九、主流镜像仓库方案竞品对比
- 十、常用场景总结
- 十一、面试官高频面试题
- 11.1 问:Harbor和Docker Registry有什么区别?为什么不直接用Docker Registry?
- 11.2 问:Harbor的镜像存在哪里?删除镜像后磁盘空间为什么不释放?
- 11.3 问:Harbor的RBAC权限模型是怎样的?
- 11.4 问:Harbor怎么做高可用?
- 11.5 问:Harbor的镜像复制(Replication)是做什么的?支持哪些模式?
- 11.6 问:Harbor用什么做漏洞扫描?扫描原理是什么?
- 11.7 问:docker push镜像到Harbor的时候,底层流程是怎样的?
- 11.8 问:Harbor支持哪些存储后端?怎么选择?
- 11.9 问:Harbor的机器人账户(Robot Account)和普通用户有什么区别?
- 11.10 问:Harbor是CNCF毕业项目意味着什么?
- 十二、总结
一、痛点场景:没有私有镜像仓库的团队到底有多惨?
想象一下这个场景:你的团队刚完成容器化改造,二十多台服务器上跑着上百个容器。问题来了——镜像放哪里?
最开始大家图省事,直接推到Docker Hub的公开仓库。结果第二天安全团队就找上门了:你们的应用镜像里硬编码了数据库密码,任何人都能拉下来看到,这是重大安全事故。
赶紧改成私有仓库吧。于是有人用Docker Registry搭了一个,能用,但很快新的问题又来了:
- 没有权限控制:谁都能push和pull,开发同学不小心删了生产镜像
- 没有界面:全靠命令行操作,找一个三个月前的镜像版本像大海捞针
- 没有安全扫描:镜像里有Heartbleed漏洞都不知道,直到线上被扫出来
- 没有同步机制:北京和上海两个机房各搭一个,镜像要手动导出导入U盘拷贝
- 没有审计日志:谁在什么时候删了哪个镜像,完全查不到
- CI/CD没法集成:流水线每次部署都要重新build镜像,效率极低

我见过最离谱的一个团队,因为没有私有仓库,开发到测试到生产环境传镜像用的是scp命令,一百多个G的镜像文件,每次传完都要半小时,还经常因为网络中断失败。后来上了Harbor,同样的流程从半小时缩短到三分钟,因为镜像分层复用,只传变动的层。
这些痛点,本质上都是一个问题:Docker Registry只是一个最基础的存储,它不是企业级的解决方案。 企业需要的是一个带权限、带安全、带审计、带高可用的镜像管理平台。
二、痛点的解决方案:Harbor企业级镜像仓库架构
Harbor就是为了解决这些问题而生的。它不是从零开始造轮子,而是在Docker官方的Distribution(也就是Registry v2)基础上,加了一层企业级的外壳。

整个架构从上到下分为四层:
接入层:
- 开发者、CI/CD流水线、K8s集群都通过HTTPS访问Harbor
- 前面可以加负载均衡器(Nginx/HAProxy)实现高可用
核心服务层:
- Core Service:处理所有API请求,做权限校验、路由转发
- Registry:真正存储镜像的地方,Docker官方的Distribution组件
- Job Service:异步任务调度,比如镜像复制、垃圾回收、漏洞扫描
- Webhook:事件通知,镜像push后可以触发CI/CD流水线
安全层:
- Trivy:漏洞扫描引擎,扫描镜像里的CVE漏洞
- Notary:镜像签名,确保拉取的镜像没有被篡改
- RBAC:基于角色的访问控制,细到每个项目每个镜像
存储层:
- PostgreSQL:存元数据(项目、用户、权限、扫描结果)
- Redis:缓存和会话
- 对象存储:真正存镜像层数据,支持本地文件系统、S3、Ceph、NAS等
这套架构解决了前面提到的所有痛点:有权限控制、有Web界面、有安全扫描、有跨机房复制、有完整审计日志,还能直接和K8s集成。
三、Harbor是什么?
3.1 专业解释
Harbor是一个开源的企业级容器镜像仓库(Container Registry),由VMware中国团队在2014年发起,2016年开源,2018年进入CNCF(云原生计算基金会)沙箱,2020年6月正式从CNCF毕业,成为第11个毕业项目,也是第一个源自中国的CNCF毕业项目。
它在Docker Distribution之上,提供了RBAC权限管理、镜像漏洞扫描、镜像签名、跨数据中心复制、图形化UI、审计日志等企业级功能。
3.2 大白话解释
你可以把Harbor理解成企业内部的"Docker镜像网盘"。
Docker Hub就像百度网盘——人人都能用,但你存公司代码进去不放心,速度也慢,而且别人能随便下载。
Docker Registry就像你自己电脑上建了个文件夹——确实是自己的,但没有密码、没有界面、谁都能进、找东西全靠命令行。
Harbor就是在这个文件夹外面,加了门禁系统、监控摄像头、分类货架、安全检查——谁能进、能拿什么、拿了什么都有记录,还能自动检查货物有没有问题。
3.3 生活案例
就像一个公司的档案室。最开始大家把文件随便堆在一个公共房间里(Docker Registry),谁都能进,谁都能拿,经常丢东西,还不知道谁拿的。
后来公司升级了档案室:装了门禁(RBAC权限)、配了管理员(Project Admin)、装了监控摄像头(审计日志)、请了安全员定期检查文件有没有过期或泄密(漏洞扫描)、北京上海两个档案室之间自动同步文件(镜像复制)。这个升级版档案室,就是Harbor。
四、为什么要用Harbor?
4.1 安全合规层面
- 镜像安全扫描:内置Trivy,每次push镜像自动扫描CVE漏洞,高危漏洞的镜像直接不让部署
- 镜像签名验证:通过Notary对镜像签名,K8s只允许拉取签名过的镜像,防止被篡改
- 权限隔离:不同项目组之间镜像完全隔离,A组看不到B组的镜像
- 传输加密:全链路HTTPS,镜像传输不被窃听
- 审计日志:谁在什么时候push/pull/delete了哪个镜像,全部记录在案,满足等保要求
4.2 效率提升层面
- CI/CD流水线集成:镜像push到Harbor后自动触发部署,Webhook通知
- 镜像分层复用:只拉取变动的层,节省带宽和时间
- 多机房同步:北京上海广州三个机房,镜像自动同步,不用手动拷贝
- 图形化管理:浏览器点点鼠标就能管理镜像,不用记命令
4.3 成本对比
算一笔账:用Docker Registry自己搭,开发维护成本每月至少一个人天,还不包括出问题后的排查时间。用Harbor,一次部署好,后续基本不用管。而且镜像复用带来的带宽节省,对于跨机房部署的团队,一年省的带宽费可能就够买好几个服务器了。
更重要的是安全成本——如果因为镜像泄露导致代码泄露,或者因为漏洞镜像被入侵,那个损失可不是几千块钱的事。
五、Harbor是怎么演进过来的?
容器镜像仓库的发展,和整个云原生生态的发展是同步的。

5.1 第一阶段:Docker Hub时代(2013年)
2013年Docker正式发布,同时推出了Docker Hub作为官方公共镜像仓库。那时候大家刚接触容器,都是直接用Docker Hub,pull官方镜像,push自己的镜像。
但很快企业就发现了问题:Docker Hub是公网的,速度慢;公开仓库任何人都能下载,不安全;没有权限控制,团队协作不方便。
5.2 第二阶段:自建Registry时代(2014-2015年)
于是大家开始用docker run registry在自己服务器上搭私有仓库。这个方案确实解决了"自己存"的问题,但也就仅此而已——没有界面、没有权限、没有安全、没有高可用,就是一个简单的文件存储。
5.3 第三阶段:Harbor诞生(2014-2016年)
2014年,VMware中国的团队在内部做一个企业级PaaS平台的时候,发现裸Registry根本满足不了企业需求。于是他们在Registry基础上加了UI、权限、审计、复制这些功能,起了个名字叫"Harbor"(港口),寓意是容器镜像的中转站。
2016年,Harbor正式开源。一开源就火了,因为它正好打中了企业用户的痛点——谁都不想在生产环境用一个没有权限控制的Registry。
5.4 第四阶段:CNCF毕业(2018-2020年)
2018年,Harbor进入CNCF沙箱。这意味着它不再只是VMware的项目,而是变成了整个云原生社区的项目。全球的开发者都在贡献代码,功能越来越完善。
2020年6月,Harbor正式从CNCF毕业。毕业的标准很高:要证明项目是生产级的、有健康的社区、有清晰的治理流程、有很多公司在生产环境使用。Harbor通过了所有这些考验,成为第11个CNCF毕业项目,也是第一个中国原创的毕业项目。
5.5 第五阶段:云原生制品管理(2020年至今)
Harbor 2.0之后,项目不再局限于容器镜像,开始支持OCI标准的各种云原生制品:Helm Chart、OCI Artifact、CNAB、甚至机器学习模型。它从一个"Docker镜像仓库"进化成了一个"云原生制品管理平台"。
现在Harbor最新版本已经到2.15.x,支持多架构镜像(Manifest List)、垃圾回收、镜像保留策略、机器人账户、Webhook、Prometheus监控等丰富功能。
六、Harbor架构详解
要真正用好Harbor,必须理解它的内部架构。Harbor由多个组件组成,每个组件各司其职。

6.1 Proxy(Nginx反向代理)
所有请求的入口。不管是浏览器访问Web UI,还是docker push/pull,还是调API,都先经过Nginx。它负责HTTPS终止、请求路由、负载均衡。
你可以理解成公司的前台——所有人进来都先到前台,前台告诉你去哪个房间。
6.2 Core Service(核心服务)
Harbor的大脑,用Go语言写的。处理所有业务逻辑:用户认证、权限校验、项目管理、API接口。docker login、docker push这些操作,最终都是Core Service在处理。
6.3 Registry(镜像存储)
这是Docker官方的Distribution组件,真正存镜像层数据的地方。Core Service收到push请求后,会转发给Registry处理。Registry把镜像层存到后端存储(本地磁盘或S3),把元数据存到数据库。
6.4 Job Service(任务服务)
负责所有异步任务。比如你配置了镜像从北京复制到上海,这个复制不是实时的,是Job Service在后台慢慢做。还有垃圾回收、漏洞扫描这些耗时操作,都是Job Service在跑。
6.5 Trivy(漏洞扫描器)
Harbor 2.0之后默认用Trivy替代了原来的Clair。Trivy是Aqua Security开源的漏洞扫描工具,扫描速度快,准确率高,支持操作系统包、应用依赖(npm/pip/maven)、IaC配置等多种扫描对象。
6.6 Database(PostgreSQL)
存所有元数据:用户、项目、权限、镜像仓库信息、扫描结果、复制策略等。注意:镜像的二进制数据不存数据库,数据库只存索引和元信息。
6.7 Redis
做缓存和会话存储。加速API响应速度,减轻数据库压力。
七、怎么用Harbor?从部署到上手
理论讲完了,我们来动手实操。这一节带你从零部署一个生产可用的Harbor,并且完成push/pull镜像的全流程。
7.1 环境准备
首先准备一台服务器,最低配置要求:
- 2核CPU,4GB内存(生产建议4核8GB以上)
- 100GB磁盘空间(根据镜像量调整)
- 安装Docker和Docker Compose
# 安装Docker(CentOS/RHEL)
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
# 验证Docker版本
docker --version
# 安装Docker Compose(v2版本)
curl -SL https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
7.2 下载Harbor离线安装包
Harbor官方提供在线和离线两种安装包。生产环境强烈建议用离线安装包,因为它把所有依赖镜像都打包了,不依赖外网。
# 下载Harbor v2.15.2离线安装包(以最新稳定版为例)
wget https://github.com/goharbor/harbor/releases/download/v2.15.2/harbor-offline-installer-v2.15.2.tgz
# 解压
tar xvf harbor-offline-installer-v2.15.2.tgz
cd harbor
7.3 配置HTTPS证书
生产环境必须用HTTPS。如果你有域名和正规CA证书,直接用。如果是内网测试,可以用自签名证书。
# 创建证书目录
mkdir -p /data/cert
# 1. 生成CA私钥
openssl genrsa -out /data/cert/ca.key 4096
# 2. 生成CA证书
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=DevOps/CN=harbor.mycompany.com" \
-key /data/cert/ca.key \
-out /data/cert/ca.crt
# 3. 生成Harbor服务器私钥和证书签名请求
openssl genrsa -out /data/cert/harbor.mycompany.com.key 4096
openssl req -new -sha512 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=DevOps/CN=harbor.mycompany.com" \
-key /data/cert/harbor.mycompany.com.key \
-out /data/cert/harbor.mycompany.com.csr
# 4. 用CA签发Harbor服务器证书
openssl x509 -req -days 3650 \
-in /data/cert/harbor.mycompany.com.csr \
-CA /data/cert/ca.crt \
-CAkey /data/cert/ca.key \
-CAcreateserial \
-extfile <(echo "subjectAltName=DNS:harbor.mycompany.com,IP:192.168.1.100") \
-out /data/cert/harbor.mycompany.com.crt
7.4 修改Harbor配置文件
# 复制配置模板
cp harbor.yml.tmpl harbor.yml
# 编辑配置文件
vim harbor.yml
关键配置项如下:
# 访问地址,改成你的域名或IP
hostname: harbor.mycompany.com
# HTTP配置(生产建议注释掉,只用HTTPS)
http:
port: 80
# HTTPS配置(生产必须开启)
https:
port: 443
certificate: /data/cert/harbor.mycompany.com.crt
private_key: /data/cert/harbor.mycompany.com.key
# 管理员初始密码
harbor_admin_password: Harbor12345
# 数据库配置
database:
password: root123456
max_idle_conns: 50
max_open_conns: 1000
# 数据存储位置
data_volume: /data/harbor
# 漏洞扫描器配置
trivy:
ignore_unfixed: false
skip_update: false
offline_scan: false
security_check: vuln
# 日志配置
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor
# 取消注释以下行启用内部TLS加密(组件间通信加密)
# internal_tls:
# enabled: true
# dir: /data/cert/
7.5 安装并启动Harbor
# 运行安装脚本,启用Trivy漏洞扫描
./install.sh --with-trivy
# 如果要同时启用ChartMuseum(Helm Chart仓库),用:
# ./install.sh --with-trivy --with-chartmuseum
# 安装完成后,Harbor会自动启动
docker-compose ps
你应该能看到这些容器都在运行:
harbor-core
harbor-jobservice
harbor-registry
harbor-db
harbor-redis
harbor-portal
nginx
trivy-adapter
现在打开浏览器访问 https://harbor.mycompany.com,用用户名admin和你配置的密码登录,就能看到Harbor的Web界面了。
7.6 客户端配置信任证书
在每台要push/pull镜像的机器上,需要把自签名证书配置给Docker信任:
# 创建Docker证书目录
mkdir -p /etc/docker/certs.d/harbor.mycompany.com/
# 复制CA证书到该目录
cp /data/cert/ca.crt /etc/docker/certs.d/harbor.mycompany.com/
# 重启Docker
systemctl restart docker
如果是正式CA签发的证书,这一步可以跳过。
7.7 第一次push/pull镜像
# 1. 登录Harbor
docker login harbor.mycompany.com
# 输入用户名admin和密码
# 2. 给镜像打标签(注意标签格式:Harbor地址/项目名/镜像名:版本)
docker tag nginx:latest harbor.mycompany.com/demo/nginx:v1.0
# 3. 推送镜像
docker push harbor.mycompany.com/demo/nginx:v1.0
# 4. 拉取镜像(在另一台机器上)
docker login harbor.mycompany.com
docker pull harbor.mycompany.com/demo/nginx:v1.0
这里有个关键概念:项目名。Harbor里的镜像路径格式是:
<harbor地址>/<项目名>/<镜像名>:<标签>
比如 harbor.mycompany.com/demo/nginx:v1.0 表示:demo项目下的nginx镜像的v1.0版本。不同项目之间完全隔离,权限也是按项目分配的。
7.8 配置漏洞扫描策略
在Harbor Web界面里,进入"配置管理"->“扫描器”,确保Trivy扫描器是健康的。然后进入"项目"->“demo”->“策略”,开启"自动扫描":每次push新镜像自动扫描漏洞。
扫描完成后,你会看到镜像的漏洞列表,按严重程度分级:严重(Critical)、高危(High)、中危(Medium)、低危(Low)。可以配置策略:存在严重漏洞的镜像禁止拉取。
八、企业项目中如何使用Harbor?
上面是基础用法。在真实企业项目中,Harbor的使用远不止push/pull这么简单。下面讲几个生产环境必须掌握的实践。
8.1 RBAC权限管理:多团队协作
Harbor的权限模型是按项目隔离的。假设公司有前端组、后端组、运维组三个团队,可以这样设计:
| 角色 | 权限 | 适用人员 |
|---|---|---|
| 项目管理员(ProjectAdmin) | 管理项目成员、配置策略、删除镜像 | 技术负责人 |
| 开发者(Developer) | push/pull镜像,不能删除 | 开发工程师 |
| 访客(Guest) | 只能pull镜像 | 测试、运维 |
| 维护者(Maintainer) | pull/push/delete镜像 | 资深开发 |
在Web界面里进入项目->“成员”,就可以添加用户并分配角色。
对于CI/CD流水线这种非人类用户,不要用个人账号,而是用机器人账户(Robot Account):
# 通过API创建机器人账户(也可以在Web界面点按钮创建)
curl -u admin:Harbor12345 -X POST "https://harbor.mycompany.com/api/v2.0/projects/demo/robots" \
-H "Content-Type: application/json" \
-d '{
"name": "jenkins-robot",
"duration": 0,
"access": [
{
"resource": "repository",
"action": "push"
},
{
"resource": "repository",
"action": "pull"
}
]
}'
机器人账户的token会返回给你,把它配到Jenkins或GitLab CI的凭据里,流水线就可以自动push镜像了。
8.2 镜像跨数据中心复制
如果公司有北京、上海、广州三个机房,不可能每个机房各搭一套Harbor然后手动同步。Harbor的镜像复制功能就是干这个的。
配置流程:
- 在上海的Harbor上创建一个"复制目标":指向北京Harbor的地址和管理员账号
- 创建复制规则:当demo项目有新镜像push时,自动同步到上海Harbor
- 支持多种复制模式:推模式、拉模式、定时同步、全量同步
复制策略的YAML示例(通过API配置):
# 复制策略配置示例
name: beijing-to-shanghai
description: 北京到上海镜像同步
source_registry:
id: 1
name: beighbor-harbor
url: https://harbor-bj.mycompany.com
destination_registry:
id: 2
name: shanghai-harbor
url: https://harbor-sh.mycompany.com
trigger:
type: EVENT_BASED # 事件触发,push即同步
trigger_settings:
resource_type: artifact
filters:
- type: NAME
value: demo/*
deletion: false
override: true
enabled: true
这样开发在北京push镜像后,上海的K8s集群自动就能pull到,完全不用人工干预。
8.3 垃圾回收:释放磁盘空间
镜像push得多了,磁盘空间会越来越紧张。很多镜像删了之后,磁盘空间并没有真正释放——因为镜像层可能被多个镜像共享。
Harbor的垃圾回收(Garbage Collection)就是解决这个问题的:
# 进入Harbor安装目录,执行垃圾回收
cd /opt/harbor
docker-compose stop harbor-core
docker-compose run --rm registry garbage-collect /etc/registry/config.yml
# 回收完成后重启
docker-compose start harbor-core
注意:垃圾回收期间Harbor的写操作会暂停,建议在业务低峰期执行。生产环境建议配置定期任务,每周或每月执行一次。
另外,Harbor还支持镜像保留策略(Tag Retention),自动清理旧版本镜像:比如保留最近10个版本,或者保留30天内的版本,超过的自动删除。这个在项目->“策略”->"保留策略"里配置。
8.4 和Kubernetes集成
K8s节点要从私有Harbor拉取镜像,需要配置imagePullSecrets:
# 1. 先创建docker-registry类型的Secret
kubectl create secret docker-registry harbor-secret \
--docker-server=harbor.mycompany.com \
--docker-username=admin \
--docker-password=Harbor12345 \
--namespace=production
# 2. 在Deployment中引用这个Secret
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
namespace: production
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: harbor.mycompany.com/demo/nginx:v1.0
ports:
- containerPort: 80
imagePullSecrets:
- name: harbor-secret
EOF
8.5 高可用部署
单节点Harbor如果挂了,整个CI/CD流水线就停了。生产环境必须做高可用。
Harbor高可用架构的核心思路:应用层无状态,存储层共享。
- 部署多个Harbor实例(2-3台),前面挂负载均衡
- PostgreSQL用主从复制或RDS
- Redis用哨兵集群
- 镜像存储用共享存储(NFS、Ceph、S3),不要用本地磁盘
Helm方式在K8s上部署高可用Harbor的values.yaml示例:
# values.yaml 关键配置
expose:
type: loadBalancer
loadBalancer:
IP: 10.0.0.10
tls:
enabled: true
secretName: harbor-tls
externalDatabase:
host: pg-ha.mycompany.com
port: 5432
username: harbor
password: "your-password"
database: harbor
externalRedis:
host: redis-sentinel.mycompany.com
port: 26379
password: "your-redis-password"
persistence:
imageChartStorage:
disableredirect: false
# 使用S3兼容存储
s3:
region: us-east-1
bucket: harbor-images
accesskey: "AKIAXXXX"
secretkey: "secret"
regionendpoint: s3.mycompany.com
# 副本数设为3
harbor:
replicaCount: 3
# 用Helm部署高可用Harbor
helm repo add harbor https://helm.goharbor.io
helm repo update
helm install harbor harbor/harbor \
--namespace harbor \
--create-namespace \
-f values.yaml
九、主流镜像仓库方案竞品对比
除了Harbor,市面上还有其他镜像仓库方案。我们来做一个全面对比。

| 对比维度 | Docker Registry | Harbor | Sonatype Nexus | JFrog Artifactory | 阿里云ACR |
|---|---|---|---|---|---|
| UI界面 | 无 | 完整Web UI | 完整Web UI | 完整Web UI | 云控制台 |
| RBAC权限 | 无,只有admin密码 | 项目级RBAC,5种角色 | 支持,按仓库分配 | 最细粒度,支持LDAP/OIDC | 云账号RAM权限 |
| 漏洞扫描 | 无 | 内置Trivy | 集成Claire/Quay | 集成Xray(付费) | 内置安全扫描 |
| 镜像签名 | 无 | 内置Notary | 支持 | 支持 | 支持加签验证 |
| 多制品支持 | 仅Docker镜像 | 镜像+Helm Chart+OCI | 30+种制品(Maven/npm/Docker等) | 40+种制品 | 镜像+Helm Chart |
| 跨仓库复制 | 无 | 双向复制,支持主流仓库 | 支持 | 最强大,Active-Active | 多地域同步 |
| 高可用 | 需自己实现 | 支持Helm高可用 | 支持 | 企业级高可用 | 云厂商托管 |
| 部署复杂度 | 极低,一行命令 | 中等,docker-compose | 中等 | 较高 | 零部署,开箱即用 |
| 成本 | 完全免费开源 | 完全免费开源(Apache 2.0) | 开源版免费,企业版付费 | 商业软件,按容量收费 | 按规格付费,有免费额度 |
| 开源协议 | Apache 2.0 | Apache 2.0 | EPL/GPL,企业版付费 | 专有协议 | 云服务 |
| 适用规模 | 个人学习 | 中大型企业生产 | 中大型企业,多制品 | 超大型企业 | 云上企业,免运维 |
9.1 各方案适用场景
Docker Registry适合:
- 个人学习、本地测试
- 临时小项目,不需要权限和UI
- 作为Harbor的底层组件(Harbor本身就是基于它的)
Harbor适合:
- 中大型企业内网私有化部署
- 对数据安全有要求,不能用公网仓库
- 团队协作需要权限管理和审计
- 多机房需要镜像同步
Sonatype Nexus适合:
- 公司已经在用Nexus管理Maven/npm包,想顺便管Docker镜像
- 多种制品格式混合管理的场景
- Java技术栈为主的团队
JFrog Artifactory适合:
- 超大型企业,全球分布式团队
- 对高可用和性能要求极高
- 预算充足,愿意为企业级支持付费
- 需要最细粒度的权限和审计
阿里云ACR适合:
- 业务跑在阿里云上,想免运维
- 不想自己维护镜像仓库
- 需要全球加速、P2P分发
- 中小团队快速上手
9.2 选型建议
- 刚起步的小团队:先用Harbor,免费、功能全、社区活跃
- Java技术栈为主,已经在用Nexus:继续用Nexus管Docker镜像,不用引入新系统
- 超大型企业,全球部署:评估JFrog Artifactory的企业版
- 云上业务,不想运维:直接用阿里云ACR或腾讯云TCR,花钱买省心
- 对数据主权要求极高:Harbor私有化部署,数据不出内网
十、常用场景总结

10.1 企业内网镜像管理
这是最核心的场景。开发团队把构建好的镜像push到内网Harbor,测试和生产环境从Harbor pull镜像。所有镜像都在内网流转,不经过公网,安全且速度快。
10.2 CI/CD流水线集成
Jenkins/GitLab CI/构建流水线完成镜像构建后,自动push到Harbor。然后通过Harbor的Webhook通知部署系统,自动部署到K8s集群。形成完整的"代码提交->构建->镜像->部署"自动化流水线。
10.3 多数据中心镜像同步
总部在北京,分公司在上海、广州、深圳。各分公司本地的K8s集群从本地Harbor pull镜像,通过Harbor的复制功能,总部push的镜像自动同步到各分公司,不用每个分公司都从北京拉,节省跨域带宽。
10.4 镜像安全扫描与合规
等保、ISO27001、金融监管都要求软件供应链安全。Harbor的漏洞扫描功能可以自动扫描镜像里的CVE漏洞,生成合规报告。存在高危漏洞的镜像禁止部署,从源头上堵住安全风险。
10.5 Helm Chart管理
K8s的应用打包用Helm Chart。Harbor从1.6版本开始内置ChartMuseum,可以同时管容器镜像和Helm Chart,一套权限体系,一个界面管理所有云原生制品。
10.6 开发测试环境镜像分发
开发同学本地build的镜像,push到Harbor的dev项目,测试同学直接从Harbor拉,不用通过QQ/微信传镜像文件。版本管理清晰,谁build的、什么时候build的、build了什么,全部有记录。
十一、面试官高频面试题
11.1 问:Harbor和Docker Registry有什么区别?为什么不直接用Docker Registry?
答: Docker Registry是Docker官方提供的最基础的镜像存储服务,只负责存储和分发镜像,没有用户管理、没有权限控制、没有Web界面、没有安全扫描。Harbor在Docker Distribution(Registry v2的新一代实现)之上,加了RBAC权限管理、图形化UI、漏洞扫描、镜像签名、跨仓库复制、审计日志、LDAP集成等企业级功能。简单说,Docker Registry是个仓库,Harbor是带门禁和保安的仓库管理系统。
11.2 问:Harbor的镜像存在哪里?删除镜像后磁盘空间为什么不释放?
答: Harbor的镜像层数据存在后端存储(本地文件系统、S3、Ceph等),元数据(项目、标签、扫描结果)存在PostgreSQL。删除镜像只是删了元数据,镜像层数据还在磁盘上,因为多个镜像可能共享同一层。需要执行垃圾回收(Garbage Collection)才会真正释放磁盘空间。GC期间要停掉harbor-core,建议低峰期执行。
11.3 问:Harbor的RBAC权限模型是怎样的?
答: Harbor是按项目(Project)做权限隔离的,每个项目下有四种角色:访客(Guest)只能pull;开发者(Developer)可以push和pull;维护者(Maintainer)可以push/pull/delete;项目管理员(ProjectAdmin)可以管理项目成员和配置策略。除此之外还有全局管理员(Admin),可以管理所有项目。对于CI/CD这种机器用户,推荐用机器人账户(Robot Account),权限可以细到具体动作,且可以设置过期时间。
11.4 问:Harbor怎么做高可用?
答: Harbor的应用层组件(Core、Jobservice、Portal等)都是无状态的,可以部署多副本,前面挂负载均衡。有状态的是PostgreSQL、Redis和镜像存储。高可用的关键是:数据库用主从复制或云RDS,Redis用哨兵集群,镜像存储用共享存储(S3/NFS/Ceph),不要用单节点本地磁盘。生产环境推荐用Helm在K8s上部署,副本数设为3,自动管理高可用。
11.5 问:Harbor的镜像复制(Replication)是做什么的?支持哪些模式?
答: 镜复制用于在多个Harbor实例之间同步镜像,比如多数据中心灾备、近地分发。支持两种方向:推(Push)模式,本地有新镜像自动推到远程;拉(Pull)模式,从远程拉取镜像到本地。触发方式有:事件触发(push即同步)、定时同步、全量复制。还支持过滤规则,只同步特定项目或特定仓库的镜像。支持和Docker Hub、Quay、AWS ECR等其他仓库互相同步。
11.6 问:Harbor用什么做漏洞扫描?扫描原理是什么?
答: Harbor 2.0之后默认用Trivy(之前是Clair)。Trivy会分析镜像的文件系统,识别操作系统包(Debian/RHEL/Alpine)和应用依赖(npm/pip/maven/gem),然后和CVE漏洞数据库比对,找出已知漏洞。扫描结果按严重程度分级:Critical、High、Medium、Low。可以配置策略,比如存在Critical漏洞的镜像禁止拉取,push时自动触发扫描。
11.7 问:docker push镜像到Harbor的时候,底层流程是怎样的?
答: 流程是:1) docker client先向Harbor的/v2/端点发请求做认证;2) Nginx代理转发给Core Service做鉴权;3) 鉴权通过后,客户端开始上传镜像层数据;4) 层数据直接传给Registry组件存储到后端;5) 所有层上传完成后,上传Manifest文件;6) Registry把元数据更新到PostgreSQL;7) 如果配置了Webhook和自动扫描,触发通知和扫描任务。
11.8 问:Harbor支持哪些存储后端?怎么选择?
答: Harbor支持多种存储后端:本地文件系统(最简单,单节点用)、S3兼容对象存储(AWS S3、MinIO、Ceph RGW、阿里OSS)、Azure Blob、GCS、Swift、NAS。选择建议:单节点测试用本地文件系统;生产环境必须用共享存储,推荐S3兼容对象存储,因为它天然支持多节点共享和水平扩展;如果是K8s上部署,推荐用MinIO或云厂商的对象存储服务。
11.9 问:Harbor的机器人账户(Robot Account)和普通用户有什么区别?
答: 普通用户是自然人,有用户名密码,走LDAP或本地数据库认证。机器人账户是给机器用的(CI/CD流水线、K8s拉取镜像),它的凭证是一个自动生成的token,格式是"robot$项目名+token"。机器人账户可以细粒度授权(比如只允许push不允许delete),可以设置过期时间,可以随时吊销而不影响其他用户。生产环境强烈建议用机器人账户给流水线用,不要用个人账号。
11.10 问:Harbor是CNCF毕业项目意味着什么?
答: CNCF毕业项目是云原生生态里的最高认证。意味着:1) 项目是生产级的,很多大公司在用;2) 有开放的治理模型,不是某一家公司说了算;3) 有健康的社区,持续有人贡献代码;4) 遵循CNCF的原则和规范,和其他云原生项目兼容性好。Harbor是第11个CNCF毕业项目,也是第一个中国原创的毕业项目,说明它在全球云原生生态里有重要地位。
十二、总结
回顾一下本文的核心内容:
- Harbor是企业级容器镜像仓库,在Docker Distribution之上加了权限、安全、审计、复制等企业功能
- 它是VMware中国团队2014年启动的项目,2020年成为首个中国原创的CNCF毕业项目
- 部署Harbor用离线安装包最快,生产环境必须配HTTPS
- 企业使用时要做好RBAC权限、机器人账户、镜像复制、垃圾回收、高可用这几件事
- 选型上,中小团队用Harbor免费版,超大型企业评估JFrog,云上业务用云厂商ACR
镜像仓库看起来只是一个存镜像的地方,但它是整个软件供应链的枢纽——从代码提交到镜像构建,从安全扫描到部署上线,所有环节都绕不开它。把Harbor用好,你的CI/CD流水线才能跑起来,你的容器化改造才算真正落地。
希望这篇文章能帮你从0到1掌握Harbor。跟着文中的命令动手部署一遍,你会发现其实并没有想象中那么复杂。
转载声明:本文为原创文章,如需转载,请联系作者获得授权,并注明出处。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)