Docker–搭建私有镜像中心Harbor

引言:为什么需要私有镜像中心?在容器化开发流程中,Docker 镜像的存储和分发是核心环节。虽然 Docker Hub 提供了公共镜像仓库,但企业级应用面临诸多挑战:网络延迟、安全合规、镜像版本管理以及私有化部署需求。Harbor 作为 CNCF 毕业项目,提供了一个企业级的私有镜像中心解决方案,支持 RBAC 权限控制、镜像复制、漏洞扫描、审计日志等高级特性。本文将深入剖析 Harbor 的架构原理,并通过完整的代码示例,指导你从零搭建一个可用的私有镜像中心。## Harbor 核心架构原理Harbor 并非简单的 Docker Registry 封装,而是由多个微服务组件构成的分布式系统。其核心架构包括:- nginx 反向代理:统一入口,处理 TLS 终止和流量分发。- Harbor Core:提供 API 管理、用户认证、RBAC 权限校验。- Registry:基于 Docker Distribution 的镜像存储层,支持多种后端(如 S3、Azure Blob)。- Database (PostgreSQL):存储用户、项目、策略等元数据。- Redis:缓存会话和临时数据,提升性能。- Job Service:异步任务执行器,处理镜像复制、GC 垃圾回收等任务。- Clair/Trivy:可选的镜像漏洞扫描器。当用户执行 docker push 时,请求流程如下:1. 客户端向 nginx 发送 HTTPS 请求(携带认证 Token)。2. nginx 将请求转发给 Harbor Core 进行权限校验。3. 通过后,Core 返回一个临时 Token,客户端用此 Token 向 Registry 上传镜像层数据。4. Registry 将 Blob 存储到文件系统或对象存储中,并将元数据记录到数据库。## 环境准备与安装### 前提条件- 一台 Linux 主机(推荐 Ubuntu 22.04 LTS 或 CentOS 7+)- Docker Engine 20.10+ 和 Docker Compose 2.0± 至少 2GB 可用内存,10GB 磁盘空间### 步骤1:安装 Docker 和 Docker Composebash# 在 Ubuntu 上安装 Dockersudo apt updatesudo apt install -y docker.iosudo systemctl enable dockersudo systemctl start docker# 安装 Docker Compose(二进制方式)sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-compose### 步骤2:下载并配置 HarborHarbor 提供两种安装方式:在线安装(自动下载镜像)和离线安装(包体积大但适合无网络环境)。这里使用离线安装包。bash# 下载 Harbor 离线安装包(版本 v2.10.1)wget https://github.com/goharbor/harbor/releases/download/v2.10.1/harbor-offline-installer-v2.10.1.tgztar xzf harbor-offline-installer-v2.10.1.tgzcd harbor### 步骤3:配置 Harbor YAML 文件Harbor 的核心配置在 harbor.yml 中。关键配置项包括:yaml# harbor.yml 核心配置示例(部分内容)hostname: harbor.example.com # 替换为你的域名或IP地址http: port: 80https: port: 443 certificate: /your/cert.pem # 生产环境请使用有效的SSL证书 private_key: /your/key.pemharbor_admin_password: Admin123 # 管理员初始密码database: password: root123 # 数据库密码data_volume: /data/harbor # 镜像数据持久化目录重要说明:生产环境务必配置 HTTPS,否则 Docker 客户端无法通过 TLS 连接。如果仅测试,可以注释掉 https 部分,使用 HTTP(但需要修改 Docker daemon 配置 insecure-registries)。### 步骤4:执行安装脚本bashsudo ./install.sh安装过程会:1. 加载所有 Harbor 镜像到本地 Docker。2. 生成 docker-compose.yml 并启动所有容器。3. 初始化数据库和默认项目(library)。安装完成后,访问 http://<你的IP>,使用 admin / Admin123 登录。## 实战:推送和拉取镜像### 场景1:使用 HTTP 协议(测试环境)如果使用 HTTP,需要配置 Docker daemon 信任该仓库:bash# 编辑 /etc/docker/daemon.jsonsudo tee /etc/docker/daemon.json <<-'EOF'{ "insecure-registries": ["192.168.1.100:80"] # 替换为你的 Harbor 地址}EOFsudo systemctl restart docker### 场景2:完整的登录、推送、拉取流程bash# 1. 登录到 Harbor(需要先创建项目)docker login harbor.example.com -u admin -p Admin123# 2. 拉取一个公共镜像作为测试docker pull nginx:1.25-alpine# 3. 将镜像标记为 Harbor 仓库格式# 格式:<Harbor地址>/<项目名>/<镜像名>:<标签>docker tag nginx:1.25-alpine harbor.example.com/library/mynginx:v1# 4. 推送镜像到 Harbordocker push harbor.example.com/library/mynginx:v1# 输出示例:# The push refers to repository [harbor.example.com/library/mynginx]# 7b5e5a8f1c2d: Pushed# v1: digest: sha256:abc123... size: 1365# 5. 在其他机器上拉取镜像docker pull harbor.example.com/library/mynginx:v1## 深入解析:配置镜像复制策略Harbor 的镜像复制功能允许在多个 Harbor 实例之间同步镜像,实现异地灾备或加速分发。### 原理剖析复制策略基于 拉取模式(Pull-based)或 推送模式(Push-based)。当源仓库有新的镜像推送时,Job Service 会触发复制任务:1. 从源 Registry 的 OCI 分发 API 获取镜像清单(Manifest)。2. 逐层下载 Blob 并上传到目标 Registry。3. 更新元数据到目标数据库。### 代码示例:通过 API 创建复制规则下面是一个 Python 脚本示例,演示如何使用 Harbor REST API 创建一条复制规则:pythonimport requestsimport json# 配置参数HARBOR_URL = "https://harbor.example.com/api/v2.0"USERNAME = "admin"PASSWORD = "Admin123"SOURCE_REGISTRY = "source-harbor.example.com" # 源 Harbor 地址TARGET_PROJECT = "replica-project" # 目标项目名称# 1. 获取认证 Tokendef get_token(): url = f"{HARBOR_URL}/users/login" headers = {"Content-Type": "application/json"} data = {"username": USERNAME, "password": PASSWORD} response = requests.post(url, headers=headers, json=data, verify=False) response.raise_for_status() # Harbor 返回一个 session cookie return response.cookies.get("sid")# 2. 创建复制规则def create_replication_rule(token): url = f"{HARBOR_URL}/replication/policies" headers = { "Content-Type": "application/json", "Cookie": f"sid={token}" } rule_config = { "name": "auto-sync-from-source", # 规则名称 "description": "从源仓库自动同步镜像", # 描述 "src_registry": { # 源仓库配置 "id": None, # 需要先添加源 registry "name": SOURCE_REGISTRY }, "dest_namespace": TARGET_PROJECT, # 目标项目 "trigger": { # 触发方式 "type": "event_based", # 基于事件触发(镜像推送时) "settings": { "cron": "" # 如果 type 为 scheduled,则填 cron 表达式 } }, "filters": [ # 过滤条件 { "type": "name", "value": "**" # 匹配所有镜像 } ], "enabled": True, "override": True # 覆盖目标仓库中的同名镜像 } response = requests.post(url, headers=headers, json=rule_config, verify=False) if response.status_code == 201: print(f"复制规则创建成功,ID: {response.headers.get('location')}") else: print(f"创建失败: {response.status_code} - {response.text}")if __name__ == "__main__": token = get_token() create_replication_rule(token)注意:使用 API 前需要在 Harbor 界面中先添加源 Registry(管理 -> 仓库管理)。实际生产环境中,建议使用 Harbor 的 Web UI 配置复制规则,因其提供了更直观的界面。## 高级特性:配置 HTTPS 和漏洞扫描### 配置 HTTPS为了安全,生产环境必须使用 HTTPS。你可以使用 Let’s Encrypt 免费证书或自签名证书:bash# 生成自签名证书(仅供测试)openssl req -newkey rsa:4096 -nodes -sha256 -keyout /data/cert/harbor.key \ -x509 -days 365 -out /data/cert/harbor.crt \ -subj "/C=CN/ST=Beijing/L=Beijing/O=Example/CN=harbor.example.com"# 在 harbor.yml 中引用证书路径# 然后重新生成配置并启动sudo ./preparesudo docker-compose downsudo docker-compose up -d### 启用漏洞扫描Harbor 集成了 Trivy 扫描器,可自动检测镜像漏洞。在 Web UI 中启用方法:1. 进入「管理」->「配置管理」2. 开启「Clair」或「Trivy」扫描器3. 在项目设置中,勾选「自动扫描推送的镜像」扫描结果会显示每个镜像的 CVE 漏洞数量及严重性等级。## 总结通过本文的深入剖析和实战代码示例,我们完整地走通了从 Harbor 原理理解到安装部署、镜像推送/拉取、高级配置的全流程。Harbor 作为企业级镜像中心,其价值不仅在于镜像存储,更在于:1. 安全合规:RBAC 权限控制 + 镜像签名 + 漏洞扫描,确保供应链安全。2. 高效分发:分布式复制策略 + Harbor Proxy Cache,加速多地域镜像获取。3. 运维友好:审计日志、垃圾回收、Webhook 通知等特性,降低运维成本。建议在生产环境中:- 始终使用 HTTPS 并配置有效的 SSL 证书。- 定期执行垃圾回收(GC)以释放存储空间。- 结合 CI/CD 流水线,在镜像推送时自动触发扫描和复制。通过 Harbor,你可以在自己的基础设施中构建一个可靠、安全、高效的容器镜像管理体系。

更多推荐