企业级镜像仓库方案 Harbor
Harbor 概述
Harbor 是 CNCF(云原生计算基金会)毕业项目,是企业级容器镜像仓库的事实标准。它在 Docker Registry 的基础上大幅扩展了安全性、管理功能和 Web UI,广泛应用于生产环境。
当前 Harbor 最新稳定版本为 v2.14.x,新特性版本 v2.15.x 已发布。v2.14 引入了增强的代理缓存(Proxy-cache)、单活跃复制(Single Active Replication)、增强的制品扫描、增强的垃圾回收以及云原生 AI(CNAI)增强等功能。v2.15 新增了垃圾回收中的 Tag 删除选项、上游仓库连接限制 UI、后端存储改进等特性。
Harbor vs Docker Registry vs Nexus 对比
| 特性 | Docker Registry | Harbor | Sonatype Nexus |
|---|---|---|---|
| 图形管理界面 | 无 | 功能完善的 Web UI | 有 |
| 定位 | 纯容器镜像存储 | 容器原生镜像仓库 | 通用制品仓库(Maven/npm/Docker 等) |
| 基于角色的访问控制(RBAC) | 需额外配置 | 内置,项目级隔离 | 有,细粒度权限 |
| 镜像漏洞扫描 | 不支持 | 内置(Trivy/Clair 等) | 需 Pro 版本 |
| 镜像签名 | 不支持 | 支持(Notary/cosign) | 有限支持 |
| 镜像复制 | 不支持 | 支持跨仓库复制 | 支持 |
| Webhook 通知 | 不支持 | 支持 | 支持 |
| 机器人账户 | 不支持 | 支持 | 支持 |
| 审计日志 | 不支持 | 支持 | 支持 |
| API 接口 | 基础 | RESTful API,功能完整 | RESTful API |
| 垃圾回收 | 需手动 | UI 可操作 | 支持 |
| 开源协议 | Apache 2.0 | Apache 2.0(CNCF 毕业) | OSS 版免费,Pro/Enterprise 收费 |
| 部署复杂度 | 低(单容器) | 中等(Docker Compose 多服务) | 中等 |
| 适用场景 | 个人/小型项目 | 容器原生、K8s 环境 | 混合制品管理 |
选择建议:
- 纯容器场景:选择 Harbor,专注于容器镜像管理,安全特性完善
- 混合制品管理:选择 Nexus,需同时管理 Maven、npm、Docker 等多种制品
- 轻量级需求:Docker Registry 足够,适合个人开发或内部测试
Docker Compose 部署 Harbor
方式一:官方安装包(推荐)
1. 下载安装包
cd /opt
# 下载最新版安装包(在线版)
curl -LO https://github.com/goharbor/harbor/releases/download/v2.12.0/harbor-online-installer-v2.12.0.tgz
# 国内加速(使用代理)
# curl -LO https://gh.toimc.cn/Ea3RWims4Eqa7exnhxC3/https://github.com/goharbor/harbor/releases/download/v2.12.0/harbor-online-installer-v2.12.0.tgz
tar xzf harbor-online-installer-v2.12.0.tgz
cd harbor
bash
提示:如果访问
github.com或raw.githubusercontent.com困难,可使用 GH Proxy(gh.proxy.com)等加速服务,将文件 URL 粘贴后下载。
2. 修改配置文件
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
bash
关键配置项:
# harbor.yml
hostname: 192.168.31.77 # 修改为服务器 IP 或域名
http:
port: 10090 # HTTP 端口,避免与 Nginx 冲突
# 如果不使用 HTTPS,注释掉 https 段
# https:
# port: 443
# certificate: /your/cert/path
# private_key: /your/key/path
harbor_admin_password: Harbor12345 # 管理员初始密码
# 数据卷路径(可选调整)
data_volume: /data/harbor
yaml
配置要点:
hostname:必须修改为实际可访问的 IP 或域名,影响后续 Docker 推送/拉取地址harbor_admin_password:首次登录的管理员密码,生产环境务必修改- 端口冲突处理:如果 80 端口被占用,修改
http.port为其他端口(如 10090) - HTTPS 配置:内网测试可注释掉
https段,生产环境建议启用
3. 执行安装
sudo ./install.sh
bash
安装脚本会自动拉取所需镜像(core、registry、portal、db、redis、jobservice 等)并启动所有服务。
方式二:Bitnami Docker Compose(快速体验)
Bitnami 提供了预打包的 Docker Compose 方案,适合快速上手:
mkdir -p /opt/harbor && cd /opt/harbor
# 下载 Bitnami 提供的 docker-compose.yml
curl -LO https://raw.githubusercontent.com/bitnami/containers/main/bitnami/harbor/docker-compose.yml
# 下载配置文件
curl -LO https://raw.githubusercontent.com/bitnami/containers/main/bitnami/harbor/config/
# 启动
docker compose up -d
bash
注意修改 docker-compose.yml 中的以下配置:
- 所有标记为
CHANGE_ME的密码字段 — 这些是密钥配置,生产环境必须修改 hostname为本机 IP(默认可能是域名,需改为实际 IP)- 端口映射(如
80:80→10090:80,避免端口冲突)
两种方式对比:
| 方面 | 官方安装包 | Bitnami Docker Compose |
|---|---|---|
| 配置复杂度 | 中等(harbor.yml) | 较高(需手动编辑 compose) |
| 升级维护 | 官方支持,有迁移脚本 | 需手动处理 |
| 适用场景 | 生产/正式环境 | 快速体验/测试 |
| 密码管理 | 配置文件统一管理 | 分散在多个环境变量中 |
访问与登录
地址:http://192.168.31.77:10090
用户名:admin
密码:在 harbor.yml 中的 harbor_admin_password,或 docker-compose.yml 中的 HARBOR_ADMIN_PASSWORD
text
登录后可见 Harbor 的管理界面,主要功能模块:
- 项目(Projects):组织镜像的命名空间,支持公开/私有访问级别
- 日志审计(Logs):所有推送、拉取、删除操作的记录追踪
- 系统管理:用户管理、角色配置、仓库管理、配额管理、垃圾回收
- 仓库:查看所有镜像及其标签、大小、下载次数、漏洞扫描结果
项目与权限管理
项目类型
项目(Project)
├── 公开项目(Public):任何人可拉取,推送需认证
├── 私有项目(Private):拉取和推送均需认证
└── 访问级别可随时在项目设置中切换
text
用户角色
| 角色 | 权限 |
|---|---|
| 项目管理员(Project Admin) | 管理项目成员、配置策略、推送/拉取镜像 |
| 维护者(Maintainer) | 推送/拉取镜像、查看日志 |
| 开发者(Developer) | 推送/拉取镜像 |
| 访客(Guest) | 仅拉取镜像 |
| 受限访客(Limited Guest) | 仅拉取镜像,无查看详情权限 |
机器人账户
机器人账户用于 CI/CD 流水线自动认证,无需暴露用户密码:
- 进入项目 → 机器人账户 → 新建机器人账户
- 设置名称、描述、权限(推送/拉取)、过期时间
- 生成 Token,在 CI/CD 中使用
docker login -u robot$project+robot_name -p token
Webhook 配置
在项目设置中可配置 Webhook,支持的事件类型:
- 镜像推送完成
- 镜像拉取完成
- 镜像删除
- 镜像扫描完成
可通知到 Slack、DingTalk、企业微信或自定义 HTTP 端点。
推送与拉取镜像
1. 配置 Docker 客户端信任 HTTP 仓库
Harbor 在内网环境下未配置 SSL 证书时,Docker 默认拒绝 HTTP 连接。需要将 Harbor 地址加入信任列表。
编辑 /etc/docker/daemon.json:
{
"insecure-registries": ["192.168.31.77:10090"]
}
json
注意:只填写
IP:端口,不要加http://前缀。
重启 Docker:
sudo systemctl restart docker
# 或
sudo service docker restart
bash
2. 登录 Harbor
docker login 192.168.31.77:10090
# Username: admin
# Password: <harbor_admin_password>
bash
看到 Login Succeeded 即表示登录成功。
常见问题排查:
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
server gave HTTP response to HTTPS client | 未配置 insecure-registries | 在 daemon.json 中添加配置 |
no such host | hostname 配置错误 | 检查 harbor.yml 中的 hostname 是否为正确 IP |
unauthorized | 用户名或密码错误 | 检查密码配置,Harbor 重启后密码可能重置 |
3. 推送镜像
# 打标签(格式:Harbor地址/项目名/镜像名:标签)
docker tag nginx:latest 192.168.31.77:10090/library/nginx:latest
# 推送
docker push 192.168.31.77:10090/library/nginx:latest
bash
推送成功后,在 Harbor Web UI 中进入 library 项目即可看到该镜像,显示标签、推送时间、下载次数等信息。
4. 拉取镜像
# 公开项目无需登录即可拉取
docker pull 192.168.31.77:10090/library/nginx:latest
bash
在其他机器上拉取同样需要先配置
insecure-registries并重启 Docker。
完整推送/拉取流程图
推送流程:
本地镜像 → docker tag → docker login → docker push → Harbor 仓库
拉取流程(同一内网其他机器):
配置 insecure-registries → 重启 Docker → docker pull → 本地镜像
拉取流程(公开项目):
无需登录,直接 docker pull
text
核心功能介绍
镜像标签与版本管理
- 支持多标签管理(同一镜像可有多个 tag)
- 显示推送时间、下载次数、镜像大小、OS/Arch 信息
- 支持镜像漏洞扫描(需安装 Trivy 组件)
漏洞扫描
Harbor 内置镜像安全扫描能力,支持多种扫描器:
# 安装时启用 Trivy 漏洞扫描
sudo ./install.sh --with-trivy
bash
扫描功能:
- 自动扫描:推送镜像时自动触发扫描
- 手动扫描:在镜像详情页点击扫描
- 扫描报告:展示 CVE 编号、严重等级、修复版本
- 策略配置:可设置阻止有严重漏洞的镜像被拉取
镜像复制
支持跨 Harbor 实例的镜像同步:
- 基于规则的复制(按仓库名、标签过滤)
- 支持推送模式和拉取模式
- 可配置定时同步
- 适用于多数据中心场景
垃圾回收
Harbor 提供图形化的垃圾回收管理:
- 清理未被任何标签引用的镜像层(manifest)
- v2.15 新增:支持在 GC 中删除特定 Tag
- 可配置定时执行(Cron 表达式)
- 支持 dry-run 模式预览清理内容
# 在 Web UI 中操作:系统管理 → 垃圾回收 → 立即执行 / 设置定时任务
bash
安装时启用额外组件
# 启用 Trivy 漏洞扫描
sudo ./install.sh --with-trivy
# 启用 Notary 镜像签名
sudo ./install.sh --with-notary
# 同时启用多个组件
sudo ./install.sh --with-trivy --with-notary --with-chartmuseum
bash
Harbor 服务管理
常用命令
# 启动
docker compose up -d
# 停止(保留数据)
docker compose down
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs -f
# 查看特定服务日志
docker compose logs -f harbor-core
bash
重新配置 Harbor
修改 harbor.yml 后需要重新生成配置:
# 停止服务
docker compose down
# 修改配置
vim harbor.yml
# 重新生成 docker-compose.yml 等配置文件
sudo ./prepare
# 启动
docker compose up -d
bash
Harbor 包含的核心服务
| 服务 | 功能 |
|---|---|
| harbor-core | 核心API服务 |
| harbor-portal | Web UI 前端 |
| registry | 镜像存储(基于 Docker Registry) |
| registryctl | Registry 管理控制器 |
| harbor-db | PostgreSQL 数据库 |
| redis | 缓存和会话管理 |
| harbor-log | 日志收集器 |
| jobservice | 异步任务处理(复制、扫描等) |
| trivy | 漏洞扫描器(可选) |
| notary-server | 镜像签名服务(可选) |
多机器拉取配置
在其他机器上拉取 Harbor 中的镜像,同样需要配置 insecure-registries:
# 在拉取机器上编辑 /etc/docker/daemon.json
# 如果文件已有内容,将 insecure-registries 追加到已有 JSON 中
echo '{
"insecure-registries": ["192.168.31.77:10090"]
}' | sudo tee /etc/docker/daemon.json
sudo systemctl restart docker
# 公开项目直接拉取
docker pull 192.168.31.77:10090/library/nginx:latest
# 私有项目需先登录
docker login 192.168.31.77:10090
docker pull 192.168.31.77:10090/library/nginx:latest
bash
拉取成功后,Harbor UI 中该镜像的下载次数会更新。
生产环境建议
| 方面 | 建议 |
|---|---|
| HTTPS | 配置 SSL 证书,使用 Let's Encrypt 或企业证书 |
| 认证 | 集成 LDAP/AD/OIDC,避免使用默认密码 |
| 备份 | 定期备份 /data/harbor 目录和数据库 |
| 存储 | 生产环境建议使用 S3/OSS 等对象存储后端 |
| 高可用 | 多实例部署,使用共享存储和负载均衡 |
| 漏洞扫描 | 启用 Trivy,设置推送时自动扫描策略 |
| 垃圾回收 | 配置定时 GC,定期清理未引用的镜像层 |
| 监控 | 配合 Prometheus + Grafana 监控 Harbor 指标 |
| 日志 | 集成 ELK/Loki 等日志系统,保留审计日志 |
| 升级策略 | 关注官方 Release Notes,小版本及时更新 |
存储后端选择
Harbor 支持多种存储后端:
| 存储类型 | 适用场景 |
|---|---|
| 本地文件系统 | 开发/测试,单机部署 |
| AWS S3 | AWS 环境,高可用 |
| 阿里云 OSS | 阿里云环境 |
| Azure Blob | Azure 环境 |
| Swift | OpenStack 环境 |
| GCS | Google Cloud 环境 |
在 harbor.yml 中配置:
# 使用 S3 存储示例
storage_service:
s3:
region: us-west-1
bucket: harbor-storage
accesskey: AKIAIOSFODNN7EXAMPLE
secretkey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
yaml
小结
Harbor 是从开发到生产都适用的企业级镜像仓库方案:
- 小型团队:Docker Compose 单机部署即可满足需求,安装过程只需两条核心命令
- 中大型团队:配合 Kubernetes + Helm Chart 部署,实现高可用和弹性扩展
- 安全合规:RBAC + 漏洞扫描 + 镜像签名,满足企业安全要求
- 多数据中心:镜像复制功能实现跨区域同步
- CI/CD 集成:机器人账户 + Webhook 无缝对接流水线
相比 Docker Registry 的"裸仓库",Harbor 提供了完整的企业级管理能力;相比 Nexus 等通用制品仓库,Harbor 在容器原生场景下更为专注和轻量。
参考资源
↑