596_Harbor容器镜像仓库
一句话概述:Harbor 是 VMware 开源的企业级容器镜像仓库,在 Docker Registry 基础上增加了安全扫描、镜像签名、RBAC 权限、镜像复制、垃圾回收等功能,是 CNCF 毕业项目和私有镜像仓库的首选方案。
核心知识点表
| 概念 | 白话解释 |
|---|
| Project | 项目,隔离和管理镜像的逻辑分组(类似命名空间) |
| Repository | 仓库,一个镜像的所有版本(如 nginx 的所有 tag) |
| Artifact | 制品,具体的镜像或 Helm Chart |
| Tag | 标签,镜像的版本号(如 v1.0、latest) |
| Vulnerability Scanning | 漏洞扫描,自动检测镜像中的安全漏洞 |
| Replication | 复制,在多个 Harbor 实例间同步镜像 |
| Robot Account | 机器人账户,用于 CI/CD 自动化的专用账户 |
安装配置
在线安装(推荐)
# 1. 下载安装包
wget https://github.com/goharbor/harbor/releases/download/v2.15.0/harbor-online-installer-v2.15.0.tgz
tar xzf harbor-online-installer-v2.15.0.tgz
cd harbor
# 2. 复制并修改配置文件
cp harbor.yml.tmpl harbor.yml # 复制配置模板
# harbor.yml — 核心配置
hostname: harbor.example.com # 访问域名
# HTTPS 配置(生产环境必须)
https:
port: 443 # HTTPS 端口
certificate: /data/cert/server.crt # TLS 证书
private_key: /data/cert/server.key # TLS 私钥
# 如果是测试环境,注释掉 https 部分,使用 HTTP:
# http:
# port: 80
harbor_admin_password: Harbor12345 # 管理员初始密码
database:
password: root123 # 内置 PostgreSQL 密码
max_idle_conns: 100 # 最大空闲连接数
max_open_conns: 900 # 最大连接数
data_volume: /data # 数据存储路径
trivy: # 漏洞扫描器配置
ignore_unfixed: false # 是否忽略未修复的漏洞
skip_update: false # 是否跳过漏洞库更新
security_check: vuln # 检查类型
# 3. 安装
sudo ./install.sh --with-trivy # 安装并启用 Trivy 扫描
# --with-trivy → 启用漏洞扫描
# --with-notary → 启用镜像签名(可选)
# 4. 验证安装
docker compose ps # 查看所有组件状态
# 访问 https://harbor.example.com
# 用户名:admin 密码:Harbor12345
Docker Compose 快速部署
# 如果只想快速测试(HTTP 方式):
# 修改 harbor.yml 后运行:
sudo ./install.sh # 不带额外组件
# === 常用管理命令 ===
cd /opt/harbor # 进入安装目录
docker compose stop # 停止
docker compose start # 启动
docker compose down # 停止并删除容器
sudo ./install.sh # 重新安装/更新配置
基本使用
推送和拉取镜像
# 1. 配置 Docker 信任 Harbor
# 如果用自签名证书或 HTTP:
# /etc/docker/daemon.json
{
"insecure-registries": ["harbor.example.com"] # 添加 Harbor 地址
}
sudo systemctl restart docker # 重启 Docker
# 2. 登录 Harbor
docker login harbor.example.com # 输入用户名和密码
# 或
docker login harbor.example.com -u admin -p Harbor12345
# 3. 推送镜像
docker tag nginx:latest harbor.example.com/library/nginx:v1 # 打标签
# 格式:harbor地址/项目名/镜像名:标签
docker push harbor.example.com/library/nginx:v1 # 推送
# 4. 拉取镜像
docker pull harbor.example.com/library/nginx:v1 # 拉取
# 5. 在 K8s 中使用 Harbor 镜像
kubectl create secret docker-registry harbor-secret \
--docker-server=harbor.example.com \ # Harbor 地址
--docker-username=admin \ # 用户名
--docker-password=Harbor12345 # 密码
# K8s Pod 使用 Harbor 镜像
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: app
image: harbor.example.com/myproject/myapp:v1 # Harbor 镜像
imagePullSecrets:
- name: harbor-secret # 引用上面创建的 Secret
项目管理
# Harbor 项目类型:
# - Public(公开):任何人都可以拉取镜像
# - Private(私有):需要认证才能拉取
# === Web UI 操作 ===
# 1. 创建项目:项目 → 新建项目 → 填写名称和可见性
# 2. 配置项目:
# - 成员管理:添加用户和角色(管理员/开发者/访客/维护者)
# - 漏洞扫描:启用自动扫描 → 推送时自动扫描镜像
# - 保留策略:设置镜像保留规则(保留最近 N 个版本)
# - 不可变标签:设置不可修改的 Tag(如 release-*)
# - Robot 账户:创建自动化专用账户(CI/CD 使用)
漏洞扫描
# Harbor 内置 Trivy 扫描器
# 手动扫描:
# Web UI → 项目 → 仓库 → 选择镜像 → 扫描
# 自动扫描配置:
# 项目设置 → 配置 → 勾选"自动扫描推送的镜像"
# 漏洞严重级别:
# Critical(严重)| High(高危)| Medium(中危)| Low(低危)
# 阻止拉取有漏洞的镜像:
# 项目设置 → 配置 → 设置"阻止严重级别以上漏洞的镜像拉取"
高级用法
镜像复制(多站点同步)
# 场景:多个数据中心间同步镜像
# Harbor A(北京) ↔ Harbor B(上海)
# 配置步骤:
# 1. 系统管理 → 仓库管理 → 新建目标 → 填写远程 Harbor 信息
# 2. 项目 → 复制 → 新建规则
# - 复制模式:Push-based(推送)或 Pull-based(拉取)
# - 触发方式:事件触发、手动、定时
# - 过滤器:按镜像名、Tag、标签过滤
Robot 账户(CI/CD 集成)
# 创建 Robot 账户用于自动化:
# 项目 → Robot 账户 → 新建
# 权限:push / pull / 扫描
# 有效期:设置过期时间
# 在 CI/CD 中使用:
# .drone.yml / .woodpecker.yml / GitLab CI
# docker login harbor.example.com -u 'robot$ci-bot' -p TOKEN
垃圾回收
# 清理未引用的镜像层,释放存储空间:
# 系统管理 → 垃圾回收 → 立即回收
# 或设置定时任务(如每周日凌晨 2 点)
# 注意:垃圾回收期间 Harbor 会进入只读模式
Cosign 镜像签名
# 安装 cosign
brew install cosign # macOS
# 或 go install github.com/sigstore/cosign/v2/cmd/cosign@latest
# 生成密钥对
cosign generate-key-pair # 生成 cosign.key 和 cosign.pub
# 签名镜像
cosign sign --key cosign.key harbor.example.com/myproject/myapp:v1
# 验证签名
cosign verify --key cosign.pub harbor.example.com/myproject/myapp:v1
# Harbor v2.15+ 支持在 UI 中查看签名状态
常见报错
| 报错信息 | 原因 | 解决方案 |
|---|
unauthorized | 认证失败 | docker login 重新登录 |
x509: certificate signed by unknown authority | 自签证书不受信任 | 添加到 insecure-registries 或安装 CA 证书 |
denied: requested access is denied | 权限不足 | 检查项目权限和用户角色 |
manifest unknown | 镜像不存在 | 检查镜像名和 Tag |
insufficient storage | 磁盘空间不足 | 执行垃圾回收或扩容 |
速查表
# === Docker 操作 ===
docker login harbor.example.com # 登录
docker tag IMG harbor.example.com/PROJECT/NAME:TAG # 打标签
docker push harbor.example.com/PROJECT/NAME:TAG # 推送
docker pull harbor.example.com/PROJECT/NAME:TAG # 拉取
# === Harbor 管理 ===
cd /opt/harbor # 安装目录
docker compose stop # 停止
docker compose start # 启动
./install.sh # 重装/更新
# === 关键端口 ===
# 80/443 → Web UI 和 API
# 4443 → Notary(镜像签名)
# === API 示例 ===
# 列出项目
curl -u admin:Harbor12345 https://harbor.example.com/api/v2.0/projects
# 列出仓库
curl -u admin:Harbor12345 https://harbor.example.com/api/v2.0/projects/library/repositories
# === 关键路径 ===
# /data/registry/ → 镜像存储
# /data/database/ → PostgreSQL 数据
# /data/redis/ → Redis 数据
# /opt/harbor/ → 安装目录
同类对比
| 特性 | Harbor | Docker Registry | Nexus | GitLab Registry |
|---|
| 漏洞扫描 | Trivy 内置 | 无 | 有 | 有 |
| RBAC | 完整 | 基本 | 完整 | GitLab 集成 |
| 镜像复制 | 内置 | 无 | 有 | 有限 |
| Web UI | 优秀 | 无 | 一般 | GitLab 内置 |
| Helm Chart | 支持 | 不支持 | 支持 | 支持 |
| 镜像签名 | Cosign/Notary | 无 | 无 | 无 |
| CNCF | 毕业项目 | 非 | 非 | 非 |
选型建议:企业私有镜像仓库首选 Harbor(功能最全、安全特性最强、CNCF 毕业);简单场景用 Docker Registry(轻量);已有 Nexus 则直接用 Nexus 的 Docker 仓库功能。