Docker——3.Harbor 核心架构与原理详解

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 pushnginx 接收请求 → core 进行鉴权校验 → 转发给 registryregistry 将镜像文件写入存储 → 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 界面中操作:

  1. 点击"新建项目"。

  2. 创建名为 base-images 的项目,用于存放基础镜像(如 CentOS, Ubuntu)。

  3. 再次点击"新建项目"。

  4. 创建名为 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-imagesapp-images 项目,你应该能看到刚才上传的镜像列表。
3. 设置 SSL 证书,使用 HTTPS 连接

前提准备: 需要准备好 SSL 证书文件(.crt)和私钥文件(.key)。假设它们位于 /data/cert/ 目录下,文件名为 server.crtserver.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 私有镜像仓库的从零到一部署与进阶配置。

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

整个过程涵盖了从理论到实践,再到安全加固的完整流程,成功搭建了一个功能完备、安全可靠的私有镜像仓库。

相关推荐
Ai拆代码的曹操1 小时前
K8s 调度器 predicate 阶段揭秘:为什么你的 Pod 总是堆在同一台机器
后端·容器
Ai拆代码的曹操1 小时前
手摸手排查:Pod CrashLoopBackOff 日志丢失问题,3 层兜底方案
后端·容器
张忠琳2 小时前
【NVIDIA】k8s-device-plugin v0.19.3 — CDI / MIG / vGPU 模块超深度代码分析之五
云原生·容器·架构·kubernetes·nvidia
StarkCoder2 小时前
AI 会做多、看少、不收尾:七种失效和拦住它们的办法
人工智能·架构
beibeix20153 小时前
3D Slicer 架构分析
架构·slicer
snow@li3 小时前
命名规范:企业级微服务模块前缀命名规范全景梳理
微服务·云原生·架构
roman_日积跬步-终至千里4 小时前
【从零开始学架构】系统设计的价值:从业务目标到可演进系统
架构
Allen_LVyingbo5 小时前
基于结构化电子病历的临床风险预测模型构建与大模型协同优化
python·安全·机器学习·docker·vim·健康医疗
煎饼学大模型13 小时前
Agent 的“大脑-手“解耦架构:当推理层和工具执行层各自独立演进
数据库·人工智能·oracle·架构·agent