第四阶段:Harbor 企业级私有镜像仓库部署
4.1 阶段目标
本阶段主要完成企业级私有镜像仓库 Harbor 的部署,为后续:
Gitea
↓
Jenkins
↓
Docker Build
↓
Harbor Push
↓
Kubernetes Pull
↓
Pod运行
完整 CI/CD 流程提供镜像存储能力。
4.2 部署环境规划
本阶段主要操作:
| 主机 | IP | 作用 |
|---|---|---|
| harbor | 192.168.10.20 | Harbor 私有镜像仓库 |
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