离线部署 Harbor 企业级镜像仓库指南

📝 前言

最近几期都在介绍 DevOps 专题,在 DevOps 自动化流程中最终都是要生成一个制品以供部署,现在通常这个制品一般都是 Docker 镜像。

如何使得镜像在其他环境任意部署,这个就需要使用到镜像仓库来进行存储和分发了。

总的来说镜像仓库是 DevOps 流程中不可或缺的一部分,这也是本篇需要介绍 Harbor 的原因。

❓ 什么是 Harbor

Harbor 是一个由 CNCF(Cloud Native Computing Foundation)孵化并托管的企业级云原生镜像仓库,用于存储、管理和分发容器镜像与 Helm Chart。

它在 Docker Registry 的基础上进行了增强,增加了身份认证、访问控制、安全扫描、镜像签名、复制策略等功能。

Harbor 支持多种身份集成方式(如 LDAP、OIDC),并且可以通过镜像复制在多地同步镜像,非常适合部署在私有云、本地数据中心或边缘计算环境中。

PS:虽然 Gitea 本身也有自带镜像仓库,但毕竟不如 Harbor 专业,功能也少很多。

🔍 使用场景

Harbor 不仅是一个容器镜像仓库,更是 DevOps 流水线中不可或缺的基础设施组件。

以下是 Harbor 在 DevOps 各阶段中的常见使用场景:

  • 持续集成(CI)阶段

Gitea Actions / Jenkins 等工具在完成镜像构建后,自动将镜像推送至 Harbor。

  • 结合镜像签名进行合规验证

使用 Notary 为镜像签名,防止被篡改。

  • 持续部署(CD)阶段

Kubernetes 集群直接从 Harbor 拉取镜像,用作部署或滚动升级。

  • 多地部署与镜像复制

主数据中心部署一个 Harbor 主仓库,边缘节点或 DR 站点通过镜像复制进行同步。

这也是一个很实用的功能。

  • 镜像自动清理

支持配置保留策略,设置保留最新 N 个版本或最近使用的镜像,避免仓库存储空间无限膨胀,提高资源利用率。

📋 前提条件

部署前请确保你已具备以下环境:

🚀 详细步骤

1️⃣ 下载 Harbor 离线安装包

使用离线安装要更快,执行以下命令进行下载并解压:

1
2
3
4
5
6
# 下载安装包
wget https://github.com/goharbor/harbor/releases/download/v2.13.1/harbor-offline-installer-v2.13.1.tgz

# 解压安装包
tar -zxvf harbor-offline-installer-v2.13.1.tgz -C /opt
cd /opt/harbor

2️⃣ 配置 Harbor

进入到解压目录后,执行以下命令复制一份配置文件:

1
cp harbor.yml.tmpl harbor.yml

编辑配置文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vim harbor.yml

# 修改内容,将 hostname 改为服务器IP或内网域名都可以
hostname: harbor.luhome.com

# 注释掉 https 相关配置,内网不需要使用 https
#https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
# enable strong ssl ciphers (default: false)
# strong_ssl_ciphers: false

# 配置管理员密码,可选
harbor_admin_password: Harbor12345

其他保持默认就可以了,当然您也可以根据自己需要进行调整。

3️⃣ 安装 Harbor

Harbor 的安装很简单,直接执行 install.sh 即可,如下:

1
./install.sh

需要注意的是这里会占用80端口,请检查本机是否已安装并启动过 nginx,若有则需关闭或修改harbor http port 端口号配置。

安装成功后,你可以通过浏览器访问 hostname 中配置的地址进入管理后台。

默认账号密码为 admin / Harbor12345

4️⃣ 配置 Docker 使用 Harbor 仓库

由于 Docker 默认是以 https 协议访问镜像仓库,而我们的仓库用的是 http,因此需要修改 Docker 的配置以支持 http 协议。

编辑 /etc/docker/daemon.json,若不存在则新建:

1
2
3
4
5
6
vim /etc/docker/daemon.json

# 添加以下内容,请替换上一步配置的 hostname 地址
{
"insecure-registries": ["<hostname>"]
}

PS:如果是直接使用Gitea的镜像仓库也是需要添加这一步,只需要添加Gitea实例的地址即可。

最后重启 Docker 生效:

1
systemctl restart docker

5️⃣ 使用 Harbor

使用 docker 命令登录 Harbor:

1
docker login <hostname>

推送镜像:

1
2
docker tag nginx:latest <hostname>/library/nginx:latest
docker push <hostname>/library/nginx:latest

PS:使用 Gitea 镜像仓库也是同理,将hostname改为Gitea实例地址,将library替换为用户名即可。

6️⃣ 配置镜像清理策略

一般在开发、测试环境中建议一定要配置镜像清理,否则由于构建频繁很快磁盘就会被撑爆。

通过 Web 登录进入Habor,选择需要清理的项目 → 策略 → 添加规则:

我一般是选择保留最近推送的5个,你也可以根据自己的喜好配置保留规则:

配置完该规则后还没完,还需要配置垃圾回收(GC),否则磁盘空间不会释放

进入系统管理 → 清理服务 → 垃圾清理,配置定时任务执行时间,如我这里配置的是每周,如果构建更为频繁也可以配置为每天:

✅ 总结

通过本文的讲解,我们成功完成了 Harbor 的离线部署、基础配置以及镜像清理策略,构建起一个功能完善、可在局域网或私有环境中稳定运行的企业级镜像仓库。

Harbor 不仅支持镜像存储与管理,还提供了访问控制、镜像签名、复制策略、垃圾回收等高级功能,是 DevOps 流水线中不可或缺的重要一环。

希望本文对你在本地搭建镜像仓库的实践有所帮助,如有问题欢迎留言交流。