Harbor企业级镜像仓库:从零搭建到配置实战指南
一、前言:为什么需要私有镜像仓库?
在容器化时代,Docker镜像成为应用交付的核心载体。但直接使用公共仓库(如Docker Hub)面临安全风险(敏感信息泄露)、速率限制和版本管理混乱等问题。Harbor作为CNCF毕业的镜像仓库解决方案,提供:
🔒 企业级安全(RBAC、漏洞扫描、镜像签名)
🚀 高性能分发(P2P分发、异地复制)
📦 全生态兼容(支持Helm Chart、OCI标准)
本文将带你在Docker容器上一步步完成Harbor的安装、配置与生产级优化
二、环境准备
一、资源需求
下表概述了部署 Harbor 的最低和建议资源需求。
二、软件堆栈要求 Compose
下表列出了目标主机上必须安装的软件版本。
三、外置服务准备(可选)
1. 外置数据库(PostgreSQL)
Harbor 默认使用内置 PostgreSQL,但在生产环境中,建议使用 独立数据库服务,以提高稳定性和管理灵活性。
数据库初始化
CREATE DATABASE harbor;
CREATE USER harbor WITH ENCRYPTED PASSWORD 'YourStrongPassword';
GRANT ALL PRIVILEGES ON DATABASE harbor TO harbor;
Harbor 配置示例
external_database:
harbor:
host: 192.168.11.1
port: 5432
db_name: harbor
username: harbor
password: YourStrongPassword
ssl_mode: prefer # 生产环境建议启用 verify-full
2. 外置 Redis(缓存与会话管理)
Redis 用于提升 Harbor 的 并发性能,尤其在频繁拉取镜像时作用显著。
Harbor 配置示例
external_redis:
host: redis-server:6379
password: YourRedisPassword
registry_db_index: 1 # Registry 专用 DB
jobservice_db_index: 2 # 任务服务专用 DB
tlsOptions:
enable: true # 启用 TLS 加密
3. 对象存储(S3/MinIO)
本地存储受限于磁盘容量和扩展性,推荐使用 S3 兼容存储(如 AWS S3、MinIO、Ceph)。
Harbor 配置示例(MinIO)
storage_service:
s3:
accesskey: minioadmin
secretkey: minioadmin
region: us-east-1
bucket: harbor
endpoint: http://minio:9000
secure: false # 若启用 HTTPS 改为 true
4. 负载均衡与高可用(可选)
若需 多节点部署,需额外准备:
负载均衡器(如 Nginx、Helm)
示例 Nginx 片段:
upstream harbor {
server harbor-node1:80;
server harbor-node2:80;
}
server {
listen 443 ssl;
server_name harbor.example.com;
location / {
proxy_pass http://harbor;
}
}
共享存储(如 NFS、CephFS)
确保所有节点能访问同一存储卷
外置服务优势总结
三、Harbor 安装
一、下载安装脚本
首先需要从 Harbor Github 仓库下载安装脚本,然后解压。
# 进入Docker应用文件夹
cd /mnt/sata1-4/DockerData/
# 下载harbor安装包
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
# 进入解压的文件夹
cd harbor
# 复制模板文件
cp harbor.yml.tmpl harbor.yml
# 自定义安装配置
vi harbor.yml
二、自定义安装配置
修改harbor.yml,各个参数的作用可以参考官方文档。
简单安装注意以下几点即可:
1. hostname
作用:指定访问 Harbor UI 和 Registry 服务的主机名或 IP 地址。
示例:
hostname: 192.168.11.1
注意:
不能使用
localhost
或127.0.0.1
,因为 Harbor 需要被外部客户端访问。
2. HTTP
作用:配置 HTTP 访问端口(默认 80)。
示例:
http:
port: 8888 # 自定义 HTTP 端口
注意:
如果启用了 HTTPS,HTTP 请求会自动重定向到 HTTPS。
3. HTTPS(没有证书可以将这段注释掉)
作用:启用 HTTPS 并配置 SSL 证书。
示例:
https:
port: 443
certificate: /path/to/cert.pem # SSL 证书路径
private_key: /path/to/key.pem # 私钥路径
注意:
生产环境强烈建议启用 HTTPS。
证书可以通过 Let's Encrypt 或企业 CA 签发。
4. 默认密码
Harbor armin
的默认密码是Harbor12345
,推荐进行修改:
示例:
harbor_admin_password: yourPassword
5. 数据库配置
内置数据库(默认)
Harbor 默认使用内置的 PostgreSQL 数据库,但可以配置连接池优化:
示例:
database:
password: root123 # 数据库密码
max_idle_conns: 100 # 空闲连接池大小
max_open_conns: 900 # 最大数据库连接数
conn_max_lifetime: 5m # 连接最大存活时间
外置数据库(推荐生产使用)
作用:连接外部 PostgreSQL 数据库,提高可靠性和性能。
示例:
external_database:
harbor:
host: 192.168.11.1 # 数据库服务器 IP
port: 5432 # 数据库端口
db_name: harbor # 数据库名
username: postgres # 用户名
password: YourStrongPassword # 密码
ssl_mode: disable # 是否启用 SSL
6. 存储配置
默认本地存储
作用:数据存储在本地文件系统。
示例:
yaml
data_volume: /data/harbor # 存储路径
S3 对象存储(推荐生产使用)
作用:使用 AWS S3 或兼容 S3 的存储(如 MinIO)。
示例:
storage_service:
s3:
accesskey: AKIAXXXXX # S3 Access Key
secretkey: SECRETXXXXX # S3 Secret Key
region: us-east-1 # 存储区域
bucket: harbor-bucket # 存储桶名称
endpoint: http://minio:9000 # S3 兼容服务地址
7. Redis 配置
外置 Redis(推荐生产使用)
作用:提高缓存性能和会话管理。
示例:
external_redis:
host: 192.168.11.1:6379 # Redis 服务器地址
password: yourPassword # Redis 密码
registry_db_index: 1 # Registry 使用的 DB 索引
jobservice_db_index: 2 # JobService 使用的 DB 索引
三、执行脚本安装
修改完配置文件后,执行./install.sh
命令,系统脚本会按照你的yml配置进行自动安装。
看到 syccessfully 的时候,恭喜你,Harbor 已经安装成功了!
我们可以执行 docker-compose ps
查看当前目录下 docker-compose
管理的所有容器状态:
可以看到 Harbor 已经正常启动了,并且容器的8080
端口映射到了宿主机的8888
,接下来可以访问宿主机的8888
端口来进入到 Harbor 的管理页面。
四、Harbor 的基本操作
一、访问
访问 http://192.168.11.1:8888/
即可到达 Harbor 的登录页面,
默认账号密码为:
用户名:admin
密码:密码是你
harbor.yml
配置的密码,默认是Harbor12345
(首次登录请及时修改)
二、创建项目(Project)
Harbor 中镜像必须归属某个项目(Project),类似于命名空间的概念。
步骤如下:
登录 Harbor 控制台。
点击左侧导航栏的 “项目” > “新建项目”。
填写项目名称(如
test-project
)。选择项目是否公开(默认私有,仅登录用户可访问)。
点击 “确定”。
项目名建议使用小写字母和短横线,避免特殊字符。
三、Docker 登录 Harbor
在使用 Docker CLI 上传/下载镜像前,需要登录 Harbor。
docker login <harbor-domain>
# 例如: docker login 192.168.11.1:8080
输入用户名和密码,即可认证。
如果你的 Harbor 没用启用 Https,由于 Docker 客户端默认 强制使用 HTTPS,你就会出现:
root@iStoreOS:/mnt/sata1-4/DockerData/harbor# docker login 192.168.11.1:8888
Username: admin
Password:
Error response from daemon: Get "https://192.168.11.1:8888/v2/": http: server gave HTTP response to HTTPS client
所以你需要让 Docker 客户端显式允许使用 HTTP 协议连接 Harbor 私有仓库地址。步骤如下:
编辑 Docker 配置文件
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
加入如下内容(或在已有内容中添加该字段):
{
"insecure-registries": ["192.168.11.1:8080"]
}
如果你已有其他配置项,比如
"registry-mirrors"
,记得保持 JSON 格式正确,不能重复逗号或丢括号。
重启 Docker 服务
sudo systemctl daemon-reexec
sudo systemctl restart docker
再次登录 Harbor
docker login http://192.168.11.1:8080
输入用户名和密码后,可以登录成功。
补充建议
生产环境不推荐使用 HTTP Harbor,尤其是公网暴露服务时,务必配置 HTTPS 证书。
Harbor 安装时可通过
prepare
阶段开启 HTTPS,或使用 Nginx/Traefik 作为 HTTPS 反代。
四、上传镜像到 Harbor
假设你已有一个本地镜像 test:v1.0.0
,需要推送到 Harbor 的 repo
项目下。
1. 重命名镜像
镜像地址的组成结构如下:<Harbor地址>/<项目名>/<镜像名>:<标签>
Harbor地址:域名或 IP,带端口(如
192.168.11.1:8888
)项目名:Harbor 中创建的项目(类似于命名空间),必须是 Harbor 中存在的项目,否则 push 会失败
镜像名:你自定义的镜像名称(支持多级目录结构),建议使用小写字母、数字、
-
或/
(多级结构),不能有大写或特殊符号标签:用于标识镜像版本,任意合法字符串,建议语义化版本控制(例如
v1.0
、latest
等)
# 语法规范如下:
# docker tag <本地镜像名>:<标签> <harbor域名或IP>:<端口>/<项目名>/<镜像名>:<标签>
docker tag test:v1.0.0 192.168.11.1:8888/repo/test:1.0.0
使用docker images
命令查看所有镜像。
2. 推送镜像
docker push 192.168.11.1:8888/repo/test:1.0.0
上传完成后,登录 Harbor 控制台,在对应项目中可以看到镜像信息。
五、从 Harbor 拉取镜像
其他开发者或 CI/CD 系统可以通过以下命令拉取:
docker pull 192.168.11.1:8888/repo/test:1.0.0
若项目是私有的,请先登录 Harbor 再执行 pull 命令。