第四阶段:Harbor 企业级私有镜像仓库部署

4.1 阶段目标

本阶段主要完成企业级私有镜像仓库 Harbor 的部署,为后续:

Gitea
  ↓
Jenkins
  ↓
Docker Build
  ↓
Harbor Push
  ↓
Kubernetes Pull
  ↓
Pod运行

完整 CI/CD 流程提供镜像存储能力。


4.2 部署环境规划

本阶段主要操作:

主机IP作用
harbor192.168.10.20Harbor 私有镜像仓库

Harbor 主机职责:

存储 Docker 镜像
提供 Kubernetes 镜像拉取服务
提供 Jenkins 镜像推送服务

4.3 Harbor服务器环境准备

4.3.1 检查 Docker 环境

在 Harbor 主机执行:

docker version

确认 Docker 已安装。

查看 Docker 运行信息:

docker info

重点确认:

Docker Root Dir: /data/docker

保持与前期 Docker 数据目录规划一致。


4.3.2 检查 Docker Compose

执行:

docker compose version

确认 Docker Compose 可用。

本项目使用:

Docker Compose v2

用于管理 Harbor 多容器服务。


4.3.3 检查系统资源

执行:

hostname
free -h
df -h
nproc

确认资源满足 Harbor 运行需求。

建议:

资源要求
CPU≥2核
内存≥4GB
磁盘≥20GB剩余空间

本项目 Harbor 虚拟机配置:

2C / 4G / 60G

满足部署要求。


4.3.4 检查目录规划

项目统一目录:

/data
├── docker
├── compose
├── apps
├── logs
└── backup

检查:

ls -l /data

如果不存在:

mkdir -p /data/{compose,apps,logs,backup}

4.3.5 检查网络环境

4.4 Harbor 安装部署

4.4.1 上传 Harbor 安装包

在这里我们需要先从Harbor官方github上下载harbor-v2.10.3离线安装包

https://github.com/goharbor/harbor/releases/download/v2.10.3/harbor-offline-installer-v2.10.3.tgz

(截止该文档完成时,该链接是可用的)

如果安装包已经在 Harbor 服务器,直接确认:

ls -lh harbor-offline-installer-v2.10.3.tgz

如果不在,可以上传到:

/data/apps

4.4.2 解压安装包

进入目录:

cd /data/apps

执行:

tar -zxvf harbor-offline-installer-v2.10.3.tgz

解压完成:

ls

得到:

harbor

harbor-offline-installer-v2.10.3.tgz

进入 Harbor 目录:

cd harbor

查看:

ls

主要文件:

install.sh
prepare
harbor.yml.tmpl
common.sh

4.5 Harbor 配置修改

4.5.1 创建数据目录

根据项目规划:

mkdir -p /data/harbor

用于保存:

镜像数据
数据库
日志
配置文件

4.5.2 创建配置文件

复制模板:

cp harbor.yml.tmpl harbor.yml

编辑:

vim harbor.yml

4.5.3 修改 hostname

默认:

hostname: reg.mydomain.com

修改:

hostname: 192.168.10.20

原因:

当前阶段属于内网部署。

公网域名和 HTTPS 在后续备案完成后处理。


4.5.4 关闭 HTTPS

当前阶段没有配置证书。

注释:

https:
  port: 443
  certificate:
  private_key:

保持 HTTP:

http:
  port: 80

4.5.5 修改管理员密码

默认:

harbor_admin_password: Harbor12345

修改:

例如:

harbor_admin_password: Harbor@123

4.5.6 修改数据目录

默认:

data_volume: /data

修改:

data_volume: /data/harbor

保证 Harbor 数据统一存储。


4.6 Harbor安装

4.6.1 预检查

进入目录:

cd /data/apps/harbor

执行:

./prepare

作用:

  • 生成 Harbor 配置
  • 检查依赖
  • 创建运行环境

无报错继续。


4.6.2 执行安装

执行:

./install.sh

安装过程自动完成:

  • 导入 Harbor 镜像
  • 创建 Docker 网络
  • 部署 PostgreSQL
  • 部署 Redis
  • 部署 Registry
  • 部署 Core
  • 部署 Portal
  • 部署 JobService
  • 部署 Nginx

成功提示:

Harbor has been installed and started successfully.

4.7 Harbor服务验证

4.7.1 查看容器状态

执行:

docker ps

正常应该包含:

harbor-core
harbor-db
harbor-jobservice
harbor-log
harbor-nginx
harbor-portal
harbor-redis
registry
registryctl

4.7.2 Web访问验证

浏览器访问:

http://192.168.10.20

登录:

用户名:
admin

密码:
你在 harbor.yml 设置的 harbor_admin_password

进入 Harbor 页面说明部署成功。


4.8 Docker客户端接入 Harbor

由于 Harbor 当前使用 HTTP,因此 Docker 需要配置:

insecure-registries

需要配置:

devops
ansible
k8s-node1
k8s-node2
ecs-prod

4.8.1 修改 Docker 配置

编辑:

vim /etc/docker/daemon.json

增加:

{
 "registry-mirrors":[
    "https://docker.1ms.run"
 ],
 "insecure-registries":[
    "192.168.10.20"
 ]
}

4.8.2 重启 Docker

执行:

systemctl daemon-reload
systemctl restart docker

检查:

docker info | grep -A3 "Insecure Registries"

应该显示:

192.168.10.20

4.9 创建 Harbor 项目

浏览器进入:

Projects

创建:

hybridblog

类型:

Private

用于存储博客项目镜像。


4.10 上传测试镜像

4.10.1 拉取 nginx

执行:

docker pull nginx:latest

4.10.2 创建 Harbor Tag

docker tag nginx:latest \
192.168.10.20/hybridblog/nginx:1.0

4.10.3 推送镜像

docker push \
192.168.10.20/hybridblog/nginx:1.0

成功后:

Harbor页面:

Projects
↓
hybridblog
↓
Repositories
↓
nginx
↓
Tag 1.0

可以看到镜像。


4.11 跨节点拉取测试

分别在:

devops
ansible
k8s-node1
k8s-node2

执行:

docker pull \
192.168.10.20/hybridblog/nginx:1.0

验证:

OpenVPN网络
↓
Docker访问
↓
Harbor镜像仓库
↓
节点拉取镜像

完整链路正常。


4.12 Harbor开机自启动优化

问题现象

测试发现:

系统重启后:

Docker启动
↓
Harbor容器恢复
↓
部分依赖服务未准备完成
↓
Harbor启动失败

解决方案

使用 systemd 管理 Harbor。

创建:

vim /etc/systemd/system/harbor.service

写入:

[Unit]
Description=Harbor Container Stack
After=docker.service network-online.target
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/data/harbor/harbor
ExecStart=/bin/bash -c "sleep 10 && /usr/bin/docker compose up -d"
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

重新加载:

systemctl daemon-reload

设置开机启动:

systemctl enable harbor