Harbor 核心架构与原理详解
Harbor 是一个企业级的私有容器镜像仓库,采用微服务架构。所有组件均以容器方式运行,并由 docker-compose 进行统一编排。
核心组件分层
Harbor 的架构主要分为四层,各司其职:
1.接入层
- harbor-nginx:系统的反向代理入口。它统一处理所有 HTTP/HTTPS 请求,转发给后端服务,并负责静态资源管理和上传限制。
2.业务层
- harbor-portal:Web 前端界面,提供可视化的运维和管理功能。
- harbor-core:核心业务逻辑处理中心,负责用户/项目管理、权限控制、元数据维护等。
- harbor-jobservice:任务调度服务,处理镜像同步、漏洞扫描、垃圾回收等异步任务。
3.存储层
- harbor-registry:原生 Docker Registry,负责镜像文件的实际存储和推拉交互。
- harbor-registryctl:Registry 的控制器,管理镜像生命周期操作(如删除、垃圾回收)。
- harbor-postgresql:PostgreSQL 数据库,持久化存储用户、项目、权限、镜像标签等所有元数据。
- harbor-redis:Redis 缓存,用于缓存会话和热点数据,提升系统响应速度。
4.安全扩展层
- harbor-trivy:集成的漏洞扫描器,用于检测镜像中的操作系统包和应用依赖漏洞。
核心交互流程(以镜像推送为例)
当用户执行 docker push 命令时,请求的完整链路如下: docker push → nginx 接收请求 → core 进行鉴权校验 → 转发给 registry → registry 将镜像文件写入存储 → core 更新数据库中的元数据 → 记录操作审计日志。
Harbor 部署全流程
准备依赖包
docker-compose-linux-x86_64
harbor-offline-installer-v2.11.0.tgz
存放在/root目录即可
下载地址:
https://download.csdn.net/download/qq_44769717/93194209

1. 安装 Docker Compose
bash
# 移动二进制文件到系统路径
mv -v /root/docker-compose-linux-x86_64 /usr/local/bin/docker-compose
# 赋予执行权限
chmod +700 /usr/local/bin/docker-compose
# 验证安装版本
docker-compose --version

2. 安装 Harbor
bash
# 解压离线安装包
tar -xvzf harbor-offline-installer-v2.11.0.tgz
# 进入 Harbor 目录
cd harbor
# 复制配置文件模板
cp -av harbor.yml.tmpl harbor.yml




3. 配置 Harbor (使用 sed)
使用 sed 命令来自动化修改 harbor.yml 配置文件,以符合你的要求。
bash
# 编辑harbor.yml
vim /root/harbor/harbor.yml
# 1. 修改主机名 (hostname) 为自己的 IP
# 修改第5行hostname
hostname: 192.168.2.123
# 2. 注释掉 HTTPS 相关配置 (从 https: 行开始,到 strong_ssl_ciphers: false 行结束)
# 修改注释第13行、15行、17行、18行
修改如下:
13 # https:
14 # https port for harbor, default is 443
15 # port: 443
16 # The path of cert and key files for nginx
17 # certificate: /your/certificate/path
18 # private_key: /your/private/key/path
19 # enable strong ssl ciphers (default: false)
20 # strong_ssl_ciphers: false
# 3. 修改管理员密码
# 修改第47行的管理员密码,用户登录harbor
harbor_admin_password: lengmoxi
# 4. 修改数据卷路径
3 修改第66行的data_volum指定数据卷的路径
data_volume: /data/harbor
# 5.查看是否修改成功
grep -n -E "hostname:|harbor_admin_password:|data_volume:" harbor.yml | grep -v "endpoint" && sed -n '13p;15p;17p;18p' harbor.yml

4. 初始化与安装
bash
# 文件初始化,生成 docker-compose.yml 等文件
./prepare
# 出现Successfully called func: create_root_cert 则成功
# 一键安装
./install.sh
# 出现✔ ----Harbor has been installed and started successfully.---- 则成功
# 查看组件状态,确认所有服务都已启动
docker-compose ps



5. 配置 Docker 客户端
为了让 Docker 客户端能够与你的 Harbor 仓库通信,需要进行以下配置。
bash
# 添加 Harbor 地址到 Docker 的不安全仓库列表
cat > /etc/docker/daemon.json <<'EOF'
{
"registry-mirrors": [
"https://672tq9h17eavbw.xuanyuan.run",
"https://672tq9h17eavbw.xuanyuan.dev"
],
"insecure-registries": ["http://192.168.2.123"]
}
EOF
cat /etc/docker/daemon.json
# 重新加载配置并重启 Docker 服务
systemctl daemon-reload
systemctl restart docker

image.png&pos_id=img-yjcpREyJ-1785229964188)
6. 部署后测试
bash
# 先重启docker-compose
docker-compose restart
# 1. 登录 Harbor (先登录才能推送)
docker login http://192.168.2.123
# 用户名: admin
# 密码: lengmoxi(在harbor.yml中修改密码)
# 出现Login Succeeded 则成功
# 2. 拉取一个测试镜像
docker pull centos:7
# 3. 上传前需要为镜像打标签
docker tag centos:7 192.168.2.123/library/centos:v1.0
# 4. 上传镜像到 Harbor
docker push 192.168.2.123/library/centos:v1.0
# 不报错有上传的进度条则成功
# 5. 删除本地镜像从harbor上进行拉取
# 先删除本地镜像
docker rmi 192.168.2.123/library/centos:v1.0
# 再重新拉取
docker pull 192.168.2.123/library/centos:v1.0




7. 在网页中查看
# 浏览器访问
http://192.168.2.123
# 用户名: admin
# 密码: lengmoxi(在harbor.yml中修改密码)

高级配置与实操
1. 打开 Harbor 的扫描功能
此功能由 harbor-trivy 组件提供,在标准安装后默认启用。可以在 Harbor 的 Web 界面中,进入一个项目,点击"扫描"按钮来对镜像进行漏洞扫描。
# 停止当前 Harbor
docker-compose down
#重新安装并启用 Trivy
./install.sh --with-trivy
# 进入页面进行扫描
http://192.168.2.123
# 用户名: admin
# 密码: lengmoxi(在harbor.yml中修改密码)

扫描




2. 新建仓库
在 Harbor 的 Web 界面中操作:
-
点击"新建项目"。
-
创建名为
base-images的项目,用于存放基础镜像(如 CentOS, Ubuntu)。

-
再次点击"新建项目"。
-
创建名为
app-images的项目,用于存放应用镜像。


创建完成

测试
登录 Harbor
在执行推送前,必须使用管理员账号登录到本地 Docker 客户端。
bash
docker login http://192.168.2.123
# 用户名: admin
# 密码: lengmoxi (根据你之前的配置)
注意 :如果提示
Error response from daemon,请确保/etc/docker/daemon.json中已正确添加了"insecure-registries": ["http://192.168.2.123"]并重启了 Docker (systemctl restart docker)。

准备测试镜像
我们需要拉取一个基础镜像,并将其标签修改为符合 Harbor 项目规范的格式。Harbor 的镜像命名规则通常为:IP地址/项目名称/镜像名:版本。
测试基础镜像 (base-images)
我们将 centos:7 推送到刚才创建的 base-images 项目中。
bash
# 1. 打标签 (Tagging)
# 格式: <Harbor IP>/<项目名>/<镜像名>:<版本号>
docker tag centos:7 192.168.2.123/base-images/centos:v1.0
# 2. 推送镜像
docker push 192.168.2.123/base-images/centos:v1.0


测试应用镜像 (app-images)
为了区分测试,找一个简单的应用镜像(如 Nginx)推送到 app-images 项目。
bash
# 1. 拉取 Nginx 镜像
docker pull nginx:latest
# 2. 打标签
docker tag nginx:latest 192.168.2.123/app-images/nginx:v1.0
# 3. 推送镜像
docker push 192.168.2.123/app-images/nginx:v1.0


验证结果
- 命令行反馈 :如果看到类似
v1.0: digest: sha256:xxx size: xxx的输出,说明推送成功。 - Web 界面验证 :刷新浏览器中的 Harbor 页面,点击左侧的
base-images和app-images项目,你应该能看到刚才上传的镜像列表。
3. 设置 SSL 证书,使用 HTTPS 连接
前提准备: 需要准备好 SSL 证书文件(.crt)和私钥文件(.key)。假设它们位于 /data/cert/ 目录下,文件名为 server.crt 和 server.key。
要准备 SSL 证书文件(.crt)和私钥文件(.key),你需要使用 OpenSSL 工具生成自签名证书。以下是完整的操作步骤,适用于你的 Harbor 服务器 IP 192.168.2.123:
第一步:创建证书存放目录
bash
mkdir -pv /data/cert
cd /data/cert
第二步:生成 CA 私钥
bash
openssl genrsa -out ca.key 4096
第三步:生成 CA 证书
bash
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Shanxi/L=Datong/O=MyCompany/OU=IT/CN=192.168.2.123" \
-key ca.key \
-out ca.crt
第四步:生成服务器私钥
bash
openssl genrsa -out server.key 4096
第五步:生成服务器证书签名请求(CSR)
bash
openssl req -sha512 -new \
-subj "/C=CN/ST=Shanxi/L=Datong/O=MyCompany/OU=IT/CN=192.168.2.123" \
-key server.key \
-out server.csr
第六步:生成服务器证书(.crt)
bash
openssl x509 -req -sha512 -days 3650 \
-extfile <(printf "subjectAltName=DNS:192.168.2.123,IP:192.168.2.123") \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in server.csr \
-out server.crt
第七步:验证生成的文件
bash
ls -l /data/cert/
# 应该看到以下文件:
# ca.crt ca.key server.crt server.key server.csr
第八步:验证生成的文件
修改 harbor.yml 配置文件
bash
# 编辑文件harbor.yml
vim harbor.yml
# 1. 启用 HTTPS 模块
# 需要把 harbor.yml 里关于 HTTPS 的注释符号 # 去掉。
# 第14行启用 https:
# 第15行启用 port: 443
# 第17行启用 certificate 路径
# 第18行启用 private_key 路径
整体如下:
13 https:
14 # https port for harbor, default is 443
15 port: 443
16 # The path of cert and key files for nginx
17 certificate: /data/cert/server.crt
18 private_key: /data/cert/server.key
19 # enable strong ssl ciphers (default: false)
20 # strong_ssl_ciphers: false
# 2.修改证书路径
# 修改 certificate 路径 修改为自己的
/data/cert/server.crt
# 修改 private_key 路径 修改为自己的
/data/cert/server.key
# 3.添加 ssl_cert 配置
# 在第19行,就是 private_key 行之后,插入 ssl_cert 配置
ssl_cert: /data/cert/server.crt
整体配置如下:
13 https:
14 # https port for harbor, default is 443
15 port: 443
16 # The path of cert and key files for nginx
17 certificate: /data/cert/server.crt
18 private_key: /data/cert/server.key
19 ssl_cert: /data/cert/server.crt
20 # enable strong ssl ciphers (default: false)
21 # strong_ssl_ciphers: false
# 4.注释80端口
# 注释第8行和第10行
整体配置如下:
8 # http:
9 # port for http, default is 80. If https enabled, this port will redirect to https port
10 # port: 80
# 5. 验证并启动
grep -n -E "^[0-9]*https:|^[0-9]* port:|^[0-9]* certificate:|^[0-9]* private_key:|^[0-9]* ssl_cert:|^[0-9]*# http:|^[0-9]* # port: 80" harbor.yml
注意: 第 19 行 ssl_cert 必须存在,并且它前面的空格数要和 certificate、private_key 保持一致。

重新部署 Harbor
bash
# 停止并移除现有容器
docker-compose down -v
# 重新准备配置文件
./prepare
# 重新启动服务
docker-compose up -d

配置 Docker 客户端信任证书 为了让 Docker 客户端信任你的自签名或私有 CA 签发的证书,需要将 .crt 文件复制到 Docker 的证书目录。
bash
# 创建证书目录
mkdir -p /etc/docker/certs.d/192.168.2.123
# 复制证书文件 (假设证书在 /data/cert/server.crt)
cp -av /data/cert/server.crt /etc/docker/certs.d/192.168.2.123/ca.crt
# 重启 Docker 服务
systemctl restart docker

4. 测试
完成 HTTPS 配置后,使用新的地址进行测试。
bash
# 重启docker-compose
docker-compose start
# 1. 登出
docker logout http://192.168.2.123
# 2. 使用 HTTPS 地址登录
docker login https://192.168.2.123
# 3. 为新项目打标签并推送
docker tag centos:7 192.168.2.123/base-images/centos:v1.0
docker push 192.168.2.123/base-images/centos:v1.0

总结
本次操作完成了 Harbor 私有镜像仓库的从零到一部署与进阶配置。
- 原理掌握:深入理解了 Harbor 基于微服务的四层架构(接入、业务、存储、安全)及其核心组件(Nginx, Core, Registry, PostgreSQL 等)的协同工作原理。
- 部署实践 :成功安装了 Docker Compose 和 Harbor,并通过
sed命令高效地完成了harbor.yml的自动化配置,包括主机名、密码、数据卷等。 - 功能验证 :通过推送
centos:7镜像,验证了 Harbor 的基本推拉功能正常。 - 完成:
- 确认了漏洞扫描功能已集成。
- 创建了
base-images和app-images两个项目以实现镜像分类管理。 - 完成了从 HTTP 到 HTTPS 的升级,通过配置 SSL 证书增强了通信安全性,并让 Docker 客户端信任了该证书。
- 规划了用于梳理架构的思维导图。
整个过程涵盖了从理论到实践,再到安全加固的完整流程,成功搭建了一个功能完备、安全可靠的私有镜像仓库。