🐳 Harbor 私有镜像仓库部署与权限配置指南

基于 Docker Compose 的企业级容器镜像管理解决方案

版本:Harbor v2.x | 更新时间:2026 年 3 月

1. Harbor 简介与核心特性

Harbor 是一个开源的云原生制品仓库,主要用于存储和管理容器镜像、Helm Charts 等云原生制品。 作为 CNCF(云原生计算基金会)的毕业项目,Harbor 已成为企业级容器镜像管理的标准解决方案。

🔐 基于角色的访问控制 (RBAC)

支持细粒度的权限管理,用户通过角色获得对项目资源的访问权限,包括管理员、开发者、访客等多种角色。

🔄 镜像复制

支持跨多个 Registry 实例的镜像同步复制,适用于负载均衡、高可用、混合云和多云场景。

🖥️ 图形化用户界面

提供直观的 Web 管理界面,支持镜像浏览、检索、项目管理和用户管理等操作。

🔍 漏洞扫描

集成 Clair、Trivy 等扫描器,自动检测镜像中的安全漏洞,保障镜像安全性。

📊 审计日志

所有针对镜像仓库的操作都会被记录追溯,满足企业审计合规要求。

🌐 AD/LDAP 集成

支持与企业现有的 AD/LDAP 目录服务集成,实现统一身份认证管理。

💡 提示:Harbor 是首个源自中国并成为 CNCF 毕业项目的开源软件,由 VMware 中国研发团队主导开发。

2. 系统要求与环境准备

2.1 硬件要求

组件 最低配置 推荐配置 生产环境配置
CPU 2 核 4 核 8 核+
内存 4 GB 8 GB 16 GB+
磁盘 50 GB SSD 100 GB SSD 500 GB+ SSD/SAN
网络 1 Gbps 1 Gbps 10 Gbps

2.2 软件要求

软件 版本要求 说明
Docker v20.10.0+ 容器运行时环境
Docker Compose v2.0.0+ 容器编排工具
OpenSSL v1.1.1+ 证书生成工具
操作系统 CentOS 7.6+ / Ubuntu 18.04+ Linux 发行版

2.3 环境初始化脚本

# ============================================ # Harbor 部署环境初始化脚本 # 适用于 CentOS/RHEL 系统 # ============================================ # 1. 禁用防火墙(生产环境建议配置规则而非完全关闭) systemctl stop firewalld systemctl disable firewalld # 2. 禁用 SELinux setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config # 3. 设置主机名 hostnamectl set-hostname harbor-server # 4. 安装基础依赖包 yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c++ make \ cmake libxml2-devel openssl-devel curl curl-devel unzip sudo \ ntp libaio-devel vim ncurses-devel autoconf automake zlib-devel \ python3-devel epel-release openssh-server socat ipvsadm conntrack # 5. 配置 Docker CE 国内镜像源(阿里云) yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 6. 安装 Docker yum install -y docker-ce docker-ce-cli containerd.io # 7. 启动并设置 Docker 开机自启 systemctl enable --now docker # 8. 配置 Docker 镜像加速器 mkdir -p /etc/docker cat > /etc/docker/daemon.json << EOF { "registry-mirrors": [ "https://hub.rat.dev", "https://docker.1panel.live", "https://docker.rainbond.cc" ], "insecure-registries": ["harbor.yourdomain.com"] } EOF systemctl restart docker # 9. 安装 Docker Compose curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose # 10. 验证安装 docker --version docker-compose --version
⚠️ 警告:生产环境中不建议完全关闭防火墙和 SELinux,应该配置适当的安全策略和访问规则。

3. Harbor 架构设计

Harbor 系统架构图 用户层 (Users / CI/CD Systems) 代理层 (Nginx / Load Balancer - HTTPS:443) Harbor Core (API & UI) Registry (镜像存储) ChartMuseum (Helm Charts) PostgreSQL Redis Trivy Scanner Job Service 持久化存储层 文件系统 / NFS / S3 / OSS

3.1 核心组件说明

组件名称 功能描述 端口
Proxy (Nginx) 反向代理,处理所有外部请求,提供 HTTPS 终止 443/80
Harbor Core 核心服务,提供 API 接口和 Web 界面,处理认证授权 8080
Registry Docker Registry v2,负责镜像的存储和分发 5000
ChartMuseum Helm Chart 仓库服务 6060
PostgreSQL 存储用户信息、项目元数据、镜像元数据等 5432
Redis 缓存会话、令牌、任务队列等 6379
Trivy 镜像漏洞扫描器 -
Job Service 后台任务调度,处理复制、扫描等异步任务 -

4. 自动化部署流程

  1. 下载 Harbor 安装包

    从 GitHub Releases 页面下载最新版本的 Harbor 离线安装包:

    # 下载 Harbor 离线安装包(以 v2.9.0 为例) wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-offline-installer-v2.9.0.tgz # 解压安装包 tar zxvf harbor-offline-installer-v2.9.0.tgz -C /opt/ # 进入 Harbor 目录 cd /opt/harbor
  2. 配置 harbor.yml 文件

    编辑 Harbor 主配置文件,设置 hostname、HTTPS 证书路径等关键参数:

    # 复制模板配置文件 cp harbor.yml.tmpl harbor.yml # 编辑配置文件 vim harbor.yml
    # harbor.yml 配置示例 hostname: harbor.yourdomain.com http: port: 8080 https: port: 443 certificate: /opt/harbor/certs/server.crt private_key: /opt/harbor/certs/server.key harbor_admin_password: Harbor12345 database: password: root123 max_idle_conns: 50 max_open_conns: 1000 data_volume: /data/harbor trivy: ignore_unfixed: false skip_update: false offline_scan: false skip_java_db_update: false jobservice: max_job_workers: 10 notification: webhook_job_max_retry: 10 log: level: info local: rotate_count: 50 rotate_size: 200M location: /var/log/harbor _version: 2.9.0
  3. 执行安装脚本
    # 运行安装脚本 ./install.sh # 可选参数: # --with-trivy 安装 Trivy 漏洞扫描器 # --with-chartmuseum 安装 ChartMuseum Helm 仓库 # --with-notary 安装 Notary 内容信任服务 # 完整安装示例 ./install.sh --with-trivy --with-chartmuseum
  4. 验证安装
    # 检查所有容器状态 docker-compose ps # 查看 Harbor 日志 docker-compose logs -f # 测试 Web 界面访问 curl -k https://harbor.yourdomain.com
    ✅ 成功标志:所有容器状态为 Up,Web 界面可正常访问,默认管理员账号 admin 可登录。

5. SSL/TLS 证书配置

5.1 使用 OpenSSL 生成自签名证书

# ============================================ # SSL 证书生成脚本 # ============================================ # 1. 创建证书目录 mkdir -p /opt/harbor/certs cd /opt/harbor/certs # 2. 生成 CA 私钥 openssl genrsa -out ca.key 4096 # 3. 生成 CA 证书 openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=YourCompany/OU=IT/CN=harbor.yourdomain.com" \ -key ca.key \ -out ca.crt # 4. 生成服务器私钥 openssl genrsa -out server.key 4096 # 5. 生成证书签名请求 (CSR) openssl req -sha512 -new \ -subj "/C=CN/ST=Beijing/L=Beijing/O=YourCompany/OU=IT/CN=harbor.yourdomain.com" \ -key server.key \ -out server.csr # 6. 创建扩展配置文件(添加 SAN) cat > v3.ext << EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1=harbor.yourdomain.com DNS.2=harbor IP.1=192.168.1.100 EOF # 7. 使用 CA 证书签发服务器证书 openssl x509 -req -sha512 -days 3650 \ -extfile v3.ext \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -in server.csr \ -out server.crt # 8. 将证书转换为 Docker 信任的格式 cp ca.crt /etc/pki/ca-trust/source/anchors/harbor-ca.crt update-ca-trust # 9. 配置 Docker 信任证书 mkdir -p /etc/docker/certs.d/harbor.yourdomain.com cp ca.crt /etc/docker/certs.d/harbor.yourdomain.com/ca.crt systemctl restart docker

5.2 使用 Let's Encrypt 获取免费证书

# 安装 Certbot yum install -y certbot # 获取证书( standalone 模式) certbot certonly --standalone -d harbor.yourdomain.com # 证书位置 # /etc/letsencrypt/live/harbor.yourdomain.com/fullchain.pem # /etc/letsencrypt/live/harbor.yourdomain.com/privkey.pem # 创建软链接到 Harbor 证书目录 ln -s /etc/letsencrypt/live/harbor.yourdomain.com/fullchain.pem /opt/harbor/certs/server.crt ln -s /etc/letsencrypt/live/harbor.yourdomain.com/privkey.pem /opt/harbor/certs/server.key
💡 提示:生产环境强烈建议使用受信任的 CA 颁发的证书或 Let's Encrypt 免费证书,避免使用自签名证书。

6. RBAC 权限管理体系

Harbor 实现了基于角色的访问控制(RBAC)模型,通过用户 - 角色 - 权限三层结构实现细粒度的权限管理。 权限控制主要在项目(Project)级别进行,用户可以属于多个项目,并在不同项目中拥有不同的角色。

6.1 预定义角色

角色名称 角色代码 权限描述
超级管理员 admin 系统最高权限,可管理所有项目、用户、系统配置、查看审计日志等
项目管理员 projectadmin 管理特定项目,包括成员管理、镜像管理、扫描策略配置等
开发者 developer 推送和拉取镜像、查看项目信息、触发扫描等
访客 guest 仅可拉取公开项目的镜像,查看基本信息
受限访客 limited_guest 仅可拉取镜像,无法查看其他信息

6.2 权限矩阵

权限项 Admin ProjectAdmin Developer Guest
创建项目
删除项目 ✅ (本项目)
添加成员 ✅ (本项目)
推送镜像
拉取镜像 ✅ (公开)
删除镜像
触发扫描
查看日志
配置复制

6.3 自定义角色(Harbor v2.4+)

# 通过 Harbor API 创建自定义角色 curl -X POST "https://harbor.yourdomain.com/api/v2.0/roles" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "custom_developer", "description": "自定义开发者角色", "permissions": [ {"resource": "project", "action": "read"}, {"resource": "repository", "action": "pull"}, {"resource": "repository", "action": "push"}, {"resource": "scan", "action": "create"} ] }'

7. 项目与用户管理

7.1 项目管理

项目是 Harbor 中资源组织的基本单位,分为公开项目和私有项目:

# ============================================ # 项目管理脚本示例 # ============================================ # 1. 创建公开项目 curl -X POST "https://harbor.yourdomain.com/api/v2.0/projects" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" \ -H "Content-Type: application/json" \ -d '{ "project_name": "library", "public": true, "metadata": { "auto_scan": "true" } }' # 2. 创建私有项目 curl -X POST "https://harbor.yourdomain.com/api/v2.0/projects" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" \ -H "Content-Type: application/json" \ -d '{ "project_name": "backend-services", "public": false, "storage_limit": 10737418240, "metadata": { "auto_scan": "true", "prevent_vul": "true", "severity": "high" } }' # 3. 列出所有项目 curl -X GET "https://harbor.yourdomain.com/api/v2.0/projects" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" # 4. 删除项目 curl -X DELETE "https://harbor.yourdomain.com/api/v2.0/projects/1" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)"

7.2 用户管理

# ============================================ # 用户管理脚本示例 # ============================================ # 1. 创建本地用户 curl -X POST "https://harbor.yourdomain.com/api/v2.0/users" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" \ -H "Content-Type: application/json" \ -d '{ "username": "developer1", "email": "developer1@company.com", "realname": "张开发者", "password": "DevPass123!", "comment": "后端开发工程师", "role_id": 0 }' # 2. 查询用户列表 curl -X GET "https://harbor.yourdomain.com/api/v2.0/users?username=developer1" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" # 3. 更新用户信息 curl -X PUT "https://harbor.yourdomain.com/api/v2.0/users/2" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" \ -H "Content-Type: application/json" \ -d '{ "realname": "张高级开发者", "email": "senior.developer1@company.com" }' # 4. 删除用户 curl -X DELETE "https://harbor.yourdomain.com/api/v2.0/users/2" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" # 5. 设置用户管理员权限 curl -X PUT "https://harbor.yourdomain.com/api/v2.0/users/2/sysadmin" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" \ -H "Content-Type: application/json" \ -d '{"sysadmin_flag": true}'

7.3 项目成员管理

# ============================================ # 项目成员管理脚本 # ============================================ # 1. 添加用户到项目并分配角色 curl -X POST "https://harbor.yourdomain.com/api/v2.0/projects/1/members" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" \ -H "Content-Type: application/json" \ -d '{ "role_id": 2, "member_user": { "user_id": 2, "username": "developer1" } }' # 角色 ID 映射:1=管理员,2=开发者,3=访客,4=项目管理员,5=受限访客 # 2. 查询项目成员 curl -X GET "https://harbor.yourdomain.com/api/v2.0/projects/1/members" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" # 3. 更新成员角色 curl -X PUT "https://harbor.yourdomain.com/api/v2.0/projects/1/members/2" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" \ -H "Content-Type: application/json" \ -d '{"role_id": 4}' # 4. 移除项目成员 curl -X DELETE "https://harbor.yourdomain.com/api/v2.0/projects/1/members/2" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)"

7.4 LDAP/AD 集成配置

# LDAP 配置示例(通过 API) curl -X PUT "https://harbor.yourdomain.com/api/v2.0/configurations" \ -H "Authorization: Basic $(echo -n 'admin:Harbor12345' | base64)" \ -H "Content-Type: application/json" \ -d '{ "auth_mode": "ldap_auth", "ldap_url": "ldap://ldap.company.com:389", "ldap_base_dn": "dc=company,dc=com", "ldap_uid": "uid", "ldap_scope": 2, "ldap_filter": "(objectClass=person)", "ldap_search_dn": "cn=admin,dc=company,dc=com", "ldap_search_password": "LdapAdminPass", "ldap_group_base_dn": "ou=groups,dc=company,dc=com", "ldap_group_filter": "(objectClass=groupOfNames)", "ldap_group_gid": "cn", "ldap_group_scope": 2 }'

8. 镜像推送与拉取

8.1 Docker CLI 操作

# ============================================ # 镜像推送与拉取操作 # ============================================ # 1. 登录 Harbor docker login harbor.yourdomain.com # 输入用户名和密码 # 2. 标记本地镜像 docker tag myapp:latest harbor.yourdomain.com/library/myapp:v1.0.0 # 3. 推送镜像到 Harbor docker push harbor.yourdomain.com/library/myapp:v1.0.0 # 4. 从 Harbor 拉取镜像 docker pull harbor.yourdomain.com/library/myapp:v1.0.0 # 5. 登出 docker logout harbor.yourdomain.com

8.2 CI/CD 集成示例

# Jenkins Pipeline 示例 pipeline { agent any environment { HARBOR_URL = 'harbor.yourdomain.com' HARBOR_PROJECT = 'backend-services' HARBOR_USER = credentials('harbor-user') HARBOR_PASS = credentials('harbor-pass') } stages { stage('Build Image') { steps { script { docker.build("${env.HARBOR_URL}/${env.HARBOR_PROJECT}/myapp:${env.BUILD_NUMBER}") } } } stage('Push to Harbor') { steps { script { docker.withRegistry("https://${env.HARBOR_URL}", [usernamePassword(credentialsId: 'harbor-creds', usernameVariable: 'USER', passwordVariable: 'PASS')]) { docker.image("${env.HARBOR_URL}/${env.HARBOR_PROJECT}/myapp:${env.BUILD_NUMBER}").push() } } } } stage('Scan Image') { steps { script { sh """ curl -X POST "https://${env.HARBOR_URL}/api/v2.0/projects/${env.HARBOR_PROJECT}/repositories/myapp/artifacts/latest/scan" \\ -u "${env.HARBOR_USER}:${env.HARBOR_PASS}" """ } } } } }

8.3 Kubernetes 集成

# 创建 Kubernetes ImagePullSecret kubectl create secret docker-registry harbor-secret \ --docker-server=harbor.yourdomain.com \ --docker-username=developer1 \ --docker-password=DevPass123! \ --docker-email=developer1@company.com \ -n default # 在 Pod 中使用 apiVersion: v1 kind: Pod metadata: name: myapp-pod spec: containers: - name: myapp image: harbor.yourdomain.com/backend-services/myapp:v1.0.0 imagePullSecrets: - name: harbor-secret

9. 高可用配置方案

9.1 外部数据库配置

# harbor.yml 配置外部 PostgreSQL database: type: external external: host: pg-cluster.company.com port: 5432 username: harbor password: SecureDbPass123 core_database: registry notary_server_database: notary_server notary_signer_database: notary_signer sslmode: require max_idle_conns: 100 max_open_conns: 2000

9.2 外部 Redis 配置

# harbor.yml 配置外部 Redis redis: type: external external: host: redis-cluster.company.com port: 6379 password: SecureRedisPass123 namespace: harbor idle_timeout_seconds: 30

9.3 对象存储配置(S3/OSS)

# Registry 存储驱动配置(config.yml) storage: filesystem: rootdirectory: /storage s3: accesskey: AKIAIOSFODNN7EXAMPLE secretkey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY region: us-east-1 bucket: harbor-images encrypt: true secure: true

9.4 多节点部署架构

Harbor 高可用架构 Load Balancer (HAProxy/Nginx) Harbor Node 1 192.168.1.101 Harbor Node 2 192.168.1.102 Harbor Node 3 192.168.1.103 PostgreSQL Cluster (Patroni + etcd) Redis Cluster (Sentinel Mode) Object Storage (S3/OSS/MinIO)

10. 监控与维护

10.1 健康检查

# ============================================ # Harbor 健康检查脚本 # ============================================ #!/bin/bash HARBOR_URL="harbor.yourdomain.com" ADMIN_USER="admin" ADMIN_PASS="Harbor12345" # 检查容器状态 echo "=== 检查容器状态 ===" docker-compose ps # 检查 API 健康 echo -e "\n=== 检查 API 健康 ===" curl -k -s -o /dev/null -w "%{http_code}" \ https://${HARBOR_URL}/api/v2.0/ping # 检查系统信息 echo -e "\n\n=== 系统信息 ===" curl -k -s -u ${ADMIN_USER}:${ADMIN_PASS} \ https://${HARBOR_URL}/api/v2.0/systeminfo | jq . # 检查存储使用情况 echo -e "\n=== 存储使用情况 ===" df -h /data # 检查数据库连接 echo -e "\n=== 数据库连接数 ===" docker exec harbor-db psql -U postgres -d registry \ -c "SELECT count(*) FROM pg_stat_activity;"

10.2 日志管理

# 日志文件位置 /var/log/harbor/ ├── core.log # Core 服务日志 ├── jobservice.log # Job Service 日志 ├── nginx.log # Nginx 访问日志 ├── proxy.log # 代理日志 ├── registry.log # Registry 日志 └── trivy.log # Trivy 扫描日志 # 查看实时日志 docker-compose logs -f core docker-compose logs -f registry tail -f /var/log/harbor/core.log # 日志轮转配置(harbor.yml) log: level: info local: rotate_count: 50 rotate_size: 200M location: /var/log/harbor

10.3 备份与恢复

# ============================================ # Harbor 备份脚本 # ============================================ #!/bin/bash BACKUP_DIR="/backup/harbor/$(date +%Y%m%d_%H%M%S)" mkdir -p ${BACKUP_DIR} # 备份数据库 docker exec harbor-db pg_dump -U postgres registry > ${BACKUP_DIR}/registry.sql docker exec harbor-db pg_dump -U postgres notaryserver > ${BACKUP_DIR}/notary_server.sql docker exec harbor-db pg_dump -U postgres notarysigner > ${BACKUP_DIR}/notary_signer.sql # 备份配置文件 cp /opt/harbor/harbor.yml ${BACKUP_DIR}/ cp -r /opt/harbor/certs ${BACKUP_DIR}/ # 备份镜像数据 rsync -av /data/harbor/ ${BACKUP_DIR}/harbor_data/ # 压缩备份 tar -czf ${BACKUP_DIR}.tar.gz ${BACKUP_DIR} rm -rf ${BACKUP_DIR} echo "Backup completed: ${BACKUP_DIR}.tar.gz"

10.4 Prometheus 监控配置

# Prometheus scrape 配置 scrape_configs: - job_name: 'harbor' static_configs: - targets: ['harbor.yourdomain.com'] metrics_path: '/api/v2.0/metrics' basic_auth: username: 'admin' password: 'Harbor12345' # Grafana Dashboard 关键指标 - 镜像总数 - 项目总数 - 用户总数 - 存储使用量 - 漏洞扫描统计 - API 请求延迟 - 容器健康状态