一 、Harbor 介绍
1. 介绍
Harbor 是一个开源注册表,它使用策略和基于角色的访问控制来保护工件,确保图像被扫描且没有漏洞,并将图像签名为受信任。Harbor 是 CNCF 毕业项目,可提供合规性、性能和互操作性,帮助您跨云原生计算平台(如 Kubernetes 和 Docker)一致、安全地管理工件。
2. 官方文档
harbor 文档:港 (goharbor.io)
3. 下载安装包地址
harbor 的 tags 包:https://github.com/goharbor/harbor/tags
二、Harbor 整体架构

如上图所示是 Harbor 的架构图,从上到下可分为代理层、功能层和数据层。
- 代理层:代理层实质上是一个 Nginx 反向代理,负责接收不同类型的客户端请求,包括浏览器、用户脚本、Docker 等,并根据请求类型和 URI 转发给不同的后端服务进行处理。
- 功能层:
- Portal:是一个基于 Argular 的前端应用,提供 Harbor 用户访问的界面。
- Core:是 Harbor 中的核心组件,封装了 Harbor 绝大部分的业务逻辑。
- JobService:异步任务组件,负责 Harbor 中很多比较耗时的功能,比如 Artifact 复制、扫描、垃圾回收等。
- Docker Distribution:Harbor 通过 Distribution 实现 Artifact 的读写和存取等功能。
- RegistryCtl:Docker Distribution 的控制组件。
- Notary(可选):基于 TUF 提供镜像签名管理的功能。
- 扫描工具(可选):镜像的漏洞检测工具。
- ChartMuseum(可选):提供 API 管理非 OCI 规范的 Helm Chart。
- 数据层:
- Redis: 缓存服务存储一些生命周期较短的数据,同时对于 JobService 还提供了类似队列的功能。
- PostgreSQL: 存储 Harbor 的应用数据,比如项目信息、用户与项目的关系、管理策略、配置信息、Artifact 的元数据等等。
- Artifact存储: 存储 Artifact 本身的内容,也就是每次推送镜像、Helm Chart 或其他 Artifact 时,数据最终存储的地方。
三、docker compose 部署 Harbor
3.1 前提要求
硬件要求:
资源 |
最低 |
推荐 |
CPU |
2 CPU |
4 CPU |
Mem |
4 GB |
8 GB |
Disk |
40 GB |
160 GB |
软件要求:
软件 |
版本 |
描述 |
Docker 引擎 |
版本 20.10.10-ce+ 或更高版本 |
有关安装说明,请参阅 Docker 引擎文档 |
Docker Compose |
docker-compose (v1.18.0+) 或 docker compose v2 (docker-compose-plugin) |
有关安装说明,请参阅 Docker Compose 文档 |
OpenSSL |
以最新为优先 |
用于生成 Harbor 的证书和密钥 |
网络端口:
端口 |
协议 |
描述 |
443 |
HTTPS |
Harbor 门户和核心 API 接受此端口上的 HTTPS 请求。您可以在配置文件中更改此端口。 |
4443 |
HTTPS |
连接到 Harbor 的 Docker 内容信任服务。您可以在配置文件中更改此端口。连接到 Harbor 的 Docker 内容信任服务。您可以在配置文件中更改此端口。 |
80 |
HTTP |
Harbor 门户和核心 API 在此端口上接受 HTTP 请求。您可以在配置文件中更改此端口。 |
3.2 下载安装包
| # 更新 wget 包 |
| yum -y install wget |
| |
| # 下载 harbor 包 |
| wget https://github.com/goharbor/harbor/releases/download/v2.9.4/harbor-offline-installer-v2.9.4.tgz |
| tar -zxvf harbor-offline-installer-v2.9.4.tgz |
| cd harbor |
查看解压的图片

3.3 修改配置文件
拷贝模板文件为 harbor.yml
| cp harbor.yml.tmpl harbor.yml |
编辑 harbor.yml 配置文件:
- hostname 是 harbor 对外暴露的访问地址,修改为 域名 或者 harbor的IP
- HTTP默认端口是 80;将其修改为对外暴露 8888 端口。
- 这里暂时先不配置 HTTPS,将 HTTPS 相关内容注释。

3.4 部署 Harbor
修改完配置文件后,只需要执行 install.sh 脚本即可安装 Harbor。
查看 Harbor 组件运行状况:
- 输入
docker ps
或者 docker compose ps
指令,查看部署详情

3.5 登录页面


- 创建项目(带 "*" 必填,项目配额限制( -1 :表示不做限制) )

3.6 打包文件并推送镜像
-
推送镜像
从公网拉取一个 redis:latest 版本的镜像
| docker pull redis |
| |
| docker run -p 6379:6379 --name redis-6379 \ |
| -v /mydata/redis/data:/data \ |
| -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \ |
| -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass "root" |
-
编辑 /etc/docker/daemon.json,设置允许访问的 HTTP 仓库地址。
| { |
| "insecure-registries":["192.168.159.171:8888"] |
| } |
-
修改镜像 tag:
| docker tag redis:latest 192.168.159.171:8888/develoy/redis:240421 |
-
登录 Harbor:
| docker login 192.168.159.171:8888 -u admin |


四、HTTPS 配置(可选)
4.1 创建目录
| # 首先创建目录存放生成的证书 |
| mkdir /home/cert |
| cd /home/cert/ |
注:默认情况下,Harbor 不附带证书。可以在没有安全性的情况下部署 Harbor,以便您可以通过 HTTP 连接到它。但是,只有在没有连接到外部 Internet 的气隙测试或开发环境中,才可以使用 HTTP。在非气隙环境中使用 HTTP 会使您面临中间人攻击。在生产环境中,请始终使用 HTTPS。
4.2 生成证书颁发机构证书
生成 CA 证书私钥。
| openssl genrsa -out ca.key 4096 |
生成 CA 证书。(-subj 表示证书的组织。CN 后面的值改成 harbor 的 IP 地址或者域名。)
| openssl req -x509 -new -nodes -sha512 -days 3650 \ |
| -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.159.171" \ |
| -key ca.key \ |
| -out ca.crt |
4.3 生成服务器证书
生成私钥
| openssl genrsa -out server.key 4096 |
生成证书签名请求
- (调整选项中的值以反映您的组织。如果使用 FQDN 连接 Harbor 主机,则必须将其指定为公用名 () 属性,并在密钥和 CSR 文件名中使用它。
-subj``CN
)
| openssl req -sha512 -new \ |
| -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.159.171" \ |
| -key server.key \ |
| -out server.csr |
4.4 生成 x509 v3 扩展文件
- 无论您是使用 FQDN 还是 IP 地址连接到 Harbor 主机,都必须创建此文件,以便可以为 Harbor 主机生成符合使用者备用名称 (SAN) 和 x509 v3 扩展要求的证书。替换条目以反映您的域。
IP 使用以下命令生成 x509 v3 扩展文件
| cat > v3.ext <<-EOF |
| authorityKeyIdentifier=keyid,issuer |
| basicConstraints=CA:FALSE |
| keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment |
| extendedKeyUsage = serverAuth |
| subjectAltName = IP:192.168.159.171 |
| EOF |
或者是 域名 访问通过下面方式生成 x509 v3 扩展文件
| cat > v3.ext <<-EOF |
| authorityKeyIdentifier=keyid,issuer |
| basicConstraints=CA:FALSE |
| keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment |
| extendedKeyUsage = serverAuth |
| subjectAltName = @alt_names |
| |
| [alt_names] |
| DNS.1=yourdomain.harbor.com |
| EO |
使用 CA 证书签发 Server 证书
| openssl x509 -req -sha512 -days 3650 \ |
| -extfile v3.ext \ |
| -CA ca.crt -CAkey ca.key -CAcreateserial \ |
| -in server.csr \ |
| -out server.crt |
查看当前目录生成的文件
| [root@12306 cert]# ll -ls |
| 总用量 28 |
| 4 -rw-r--r--. 1 root root 2057 4月 21 04:58 ca.crt |
| 4 -rw-------. 1 root root 3247 4月 21 04:57 ca.key |
| 4 -rw-r--r--. 1 root root 41 4月 21 04:58 ca.srl |
| 4 -rw-r--r--. 1 root root 2074 4月 21 04:58 server.crt |
| 4 -rw-r--r--. 1 root root 1708 4月 21 04:58 server.csr |
| 4 -rw-------. 1 root root 3243 4月 21 04:58 server.key |
| 4 -rw-r--r--. 1 root root 207 4月 21 04:58 v3.ext |
赋于 ca.key 与 server.key "644" 权限
| # 指令 |
| chmod 644 ca.key |
| chmod 644 server.key |
4.5 为 Harbor 和 Docker 配置证书
将 server 证书和密钥复制到 Harbor 主机上的 /data/cert 目录中
| mkdir -p /data/cert |
| cp server.crt /data/cert/ |
| cp server.key /data/cert/ |
转换 server.crt 为 server.cert
| # Docker 守护程序会认为 .crt 文件是 CA 证书,因此需要将 server 证书转换为 server.cert 文件 |
| openssl x509 -inform PEM -in server.crt -out server.cert |
将 server 证书,密钥和 CA 证书复制到 Harbor 主机上的 Docker 证书目录中
| |
| |
| mkdir -p /etc/docker/certs.d/192.168.159.171:8443 |
| cp server.cert /etc/docker/certs.d/192.168.159.171:8443 |
| cp server.key /etc/docker/certs.d/192.168.159.171:8443 |
| cp ca.crt /etc/docker/certs.d/192.168.159.171:8443 |
查看 Docker 证书目录文件
| [root@12306 cert]# ll -ls /etc/docker/certs.d/192.168.159.171\:8443/ |
| 总用量 12 |
| 4 -rw-r--r--. 1 root root 2057 4月 21 05:09 ca.crt |
| 4 -rw-r--r--. 1 root root 2074 4月 21 05:09 server.cert |
| 4 -rw-r--r--. 1 root root 3243 4月 21 05:09 server.key |
| |
重启 Docker Engine
4.6 重新部署 Harbor
- 修改 harbor.yml 配置文件,添加 HTTPS 相关配置,指定 HTTPS 的端口号和证书路径

4.7 使用 perpare 脚本生成 HTTPS 配置, 并重启 Harbor
使用 prepare 脚本为反向代理 Nginx 容器生成 HTTPS 配置。
删除原有 Harbor 容器
| # Harbor 原有的数据文件默认是挂载在宿主机的 /data 目录下,因此删除 Harbor 容器并不会丢失数据。 |
| docker compose down -v |
重新启动 Harbor
4.8 登录 HTTPS 页面

4.9 Docker 拉取和推送镜像
Docker 想要拉取或者推送 HTTPS 镜像仓库的镜像
| |
| |
| mkdir /etc/docker/certs.d/192.168.159.171:8443 |
从 Harbor 主机拷贝证书文件到 Docker 客户端上,需要 server 的证书和密钥以及 CA 证书
| scp /home/cert/server.key root@192.168.159.172:/etc/docker/certs.d/192.168.159.171:8443 |
| scp /home/cert/server.cert root@192.168.159.172:/etc/docker/certs.d/192.168.159.171:8443 |
| scp /home/cert/ca.crt root@192.168.159.172:/etc/docker/certs.d/192.168.159.171:8443 |
注:拉取镜像 与 推送镜像 在 http 中一致
五、服务器重启之后,harbor运行报错

解决方式:进入 harbor 文件夹,重新在 "./install.sh" ,此时,docker的服务就好了。
注:在 第一次安装 harbor 之后,不可以删除 harbor文件夹中的东西,同时,重新 "./install.sh" 并不会丢失数据,只是删除镜像之后重新建立
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤