跳转至

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/       → 安装目录

同类对比

特性HarborDocker RegistryNexusGitLab Registry
漏洞扫描Trivy 内置
RBAC完整基本完整GitLab 集成
镜像复制内置有限
Web UI优秀一般GitLab 内置
Helm Chart支持不支持支持支持
镜像签名Cosign/Notary
CNCF毕业项目

选型建议:企业私有镜像仓库首选 Harbor(功能最全、安全特性最强、CNCF 毕业);简单场景用 Docker Registry(轻量);已有 Nexus 则直接用 Nexus 的 Docker 仓库功能。