Harbor 是一个开源镜像仓库,通过策略和基于角色的访问控制来保护镜像,确保镜像经过扫描且没有漏洞,并将镜像签名为可信镜像。Harbor 是一个 CNCF(云原生计算基金会:Cloud Native Computing Foundation)毕业项目,提供合规性、性能和互操作性,帮助您在 Kubernetes 和 Docker 等云原生计算平台上一致且安全地管理镜像。
一、Harbor 安装先决条件
1、硬件 官网给出的部署 Harbor 的最小和推荐硬件配置
资源 | 最低 | 推荐 |
---|---|---|
CPU | 2 个 CPU | 4 个 CPU |
内存 | 4 GB | 8 GB |
硬盘 | 40 GB | 160 GB |
2、软件 下表列出了目标主机上必须安装的软件版本
软件 | 版本 | 描述 |
---|---|---|
Docker 引擎 | 版本 > 20.10 | Docker 引擎安装 |
Docker Compose | Docker Compose > 2.3 | Docker Compose 是 Docker 引擎的一部分 |
OpenSSL | 建议使用最新版本 | 用于生成 Harbor 的证书和密钥 |
3、网络端口 Harbor 需要在目标主机上打开以下端口。
端口 | 协议 | 描述 |
---|---|---|
443 | HTTPS | Harbor 门户和核心 API 接受此端口上的 HTTPS 请求。您可以在配置文件中更改此端口。 |
80 | HTTP | Harbor 门户和核心 API 接受此端口上的 HTTP 请求。您可以在配置文件中更改此端口。 |
二、下载 Harbor 安装程序
1、Harbor 的官方发布版本托管在 GitHub
2、在对应的版本中,你可以找到以下文件:
harbor-offline-installer-<version>.tgz(离线安装包)
: 如果您要部署 Harbor 的主机无法连接到互联网,请使用离线安装包。离线安装包包含预构建的镜像,因此它比在线安装包更大。harbor-online-installer-<version>.tgz(在线安装包)
:在线安装包从 Docker Hub 下载 Harbor 镜像。因此,安装包体积非常小。
3、在线和离线安装包的安装过程几乎相同。如果无法访问 github,这里有离线安装包:harbor-offline-installer-v2.12.4.tgz,链接: https://pan.baidu.com/s/1Nha4oNY1GvyH0Pcy4q4Qpw?pwd=wxdw 提取码: wxdw
4、Harbor 中文参考地址
三、安装 Docker
1、安装 docker
# 添加阿里云docker-ce仓库
dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 列出当前系统中所有可安装的 docker-ce 版本,并按照版本号从高到低进行排序,同时显示重复的版本。
dnf list docker-ce --showduplicates | sort -r
# 安装最新版本 docker-ce,也可以指定版本安装(dnf install -y docker-ce-3:28.1.1-1.el9)
dnf install -y docker-ce
# 启用Docker Cgroup用于限制进程的资源使用量,如CPU、内存资源
# 创建目录,存放 docker 的配置文件
mkdir -p /etc/docker
# 创建并写入 /etc/docker/daemon.json 文件,设置 Docker 使用 systemd 作为 Cgroup 驱动
# registry-mirrors 配置:docker 镜像加速器的地址列表。
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://docker.m.daocloud.io"
]
}
EOF
# 设置 docker 开机自启,并启动 docker
systemctl enable docker --now
2、解压 harbor 离线安装包
# 根目录下创建 /data 目录
mkdir -p /data
# 解压缩 harbor-offline-installer-v2.12.4.tgz 内容到 /data 目录下
tar -zxvf harbor-offline-installer-v2.12.4.tgz -C /data
# 进入 /data/harbor/
cd /data/harbor/
# 将当前目录下的 harbor.yml.tmpl 文件复制一份到当前目录下
cp harbor.yml.tmpl harbor.yml
四、配置 Harbor 的 HTTPS 访问
默认情况下,Harbor 不附带证书。可以在没有安全性的情况下部署 Harbor,以便可以通过 HTTP 连接到它。在生产环境中,推荐始终使用 HTTPS。要配置 HTTPS,您必须创建 SSL 证书。您可以使用由受信任的第三方 CA 签名的证书,也可以使用自签名证书。
(1)本文使用的是阿里云提供的免费 SSL 证书,一个自然年内可以领取一次,数量为20,有效期三个月。
(2)需要购买一个域名,直接在阿里云购买就可以,100块之内
(3)如果只是本地部署测试,也可以用下面自签名证书
(一) 阿里云 CA 证书
1、创建证书
2、证书申请
3、三步验证 DNS
4、将域名解析到 IP 地址
5、下载证书
(二) 自签名证书
# 下面的 harbor.zhixu 可自行修改
# 创建目录并进入
mkdir -p /data/cert
cd /data/cert
# 生成 CA 私钥
openssl genrsa -out ca.key 4096
# 使用 CA 私钥生成自签名证书
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.zhixu" \
-key ca.key \
-out ca.crt
# 生成服务端私钥
openssl genrsa -out harbor.zhixu.com.key 4096
# 使用服务端私钥生成 CSR
openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.zhixu" \
-key harbor.zhixu.com.key \
-out harbor.zhixu.com.csr
# 创建 v3.ext 文件定义扩展属性
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.zhixu.com
DNS.2=harbor.zhixu
DNS.3=redis
IP.1=192.168.31.116
EOF
# 使用 CA 签发服务器证书
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in harbor.zhixu.com.csr \
-out harbor.zhixu.com.crt
# 创建目录,向 Docker 提供证书
# 如果将默认的 nginx 端口 443 映射到不同的端口,比如8443,请创建文件夹harbor.zhixu.com:8443
mkdir -p /etc/docker/certs.d/harbor.zhixu.com:443
# 将 harbor.zhixu.com.crt 转换为 harbor.zhixu.com.cert,供 Docker 使用
openssl x509 -inform PEM -in harbor.zhixu.com.crt -out harbor.zhixu.com.cert
# 将服务器证书、密钥和 CA 文件复制到 Harbor 主机上的 Docker 证书文件夹中
cp harbor.zhixu.com.cert /etc/docker/certs.d/harbor.zhixu.com:443/
cp harbor.zhixu.com.key /etc/docker/certs.d/harbor.zhixu.com:443/
cp ca.crt /etc/docker/certs.d/harbor.zhixu.com:443/
# 自签名证书需要配置域名本地解析
echo -e "192.168.31.116 harbor.zhixu.com" | sudo tee -a /etc/hosts
# 为了使自签名证书能够正常工作,您需要确保使用该证书的客户端能够正确解析到Harbor服务的地址。这意味着您应该在计划访问Harbor仓库的每台客户端机器上配置域名的本地解析。
# Windows系统,编辑位于C:\Windows\System32\drivers\etc\hosts,对于Linux或MacOS系统,编辑位于/etc/hosts的文件
# 重启 Docker
systemctl restart docker
五、配置 Harbor 组件之间的内部 TLS 通信
默认情况下,Harbor 组件(harbor-core、 harbor-jobservice、proxy、harbor-portal、registry、registryctl、trivy_adapter、chartmuseum)之间的内部通信使用 HTTP 协议,这对于某些生产环境可能不够安全。自 Harbor v2.0 起,TLS 可以用于此内部网络。在生产环境中,始终建议使用 HTTPS。
此功能通过 harbor.yml 文件中的 internal_tls 引入。要启用内部 TLS,请将 enabled 设置为 true,并将 dir 值设置为包含内部证书文件的目录路径。
# 所有证书都可以通过 prepare 工具自动生成。
# 不加 -d 3650 默认有效期一年,加了之后十年
# 里面的版本号是v2.12.4,版本号如果不一致请自行修改
docker run -v /:/hostfs goharbor/prepare:v2.12.4 gencert -p /data/cert/tls/internal -d 3650
六、配置 Harbor YML 文件
1、必须设置的参数
# Harbor 的目标主机上的 IP 地址、主机名 或 域名
hostname: 192.168.31.116
# 使用 HTTPS 访问 Harbor 门户和令牌/通知服务。始终在生产环境和没有隔离的环境中使用 HTTPS。
https:
# HTTPS 的端口号,用于 Harbor 门户和 Docker 命令。默认值为 443,但是一定要与 external_url 参数的端口号一致
port: 443
# SSL 证书的路径
certificate: /data/cert/harbor.zhixu.com.cert
# SSL 密钥的路径
private_key: /data/cert/harbor.zhixu.com.key
# 是否启用强 SSL/TLS 加密套件,建议将此选项设置为 true
strong_ssl_ciphers: true
# 使用 HTTPS 在 Harbor 组件之间通信
internal_tls:
# 将此标志设置为 true 表示内部 tls 已启用
enabled: true
# 包含内部证书和密钥的目录的路径
dir: /data/cert/tls/internal/
# 启用此选项以使用外部代理。启用后,将不再使用主机名
external_url: https://harbor.zhixu.com:443
# Harbor 系统管理员设置初始密码
# 默认用户名和密码为 admin 和 Harbor12345
# 记住在启动 Harbor 后从 UI 更改管理员密码
harbor_admin_password: Harbor12345
# 使用本地 PostgreSQL 数据库。您可以选择配置外部数据库,在这种情况下,您可以停用此选项。
database:
# 设置本地数据库的 root 密码。您必须为生产部署更改此密码。
password: root123
# 空闲连接池中的最大连接数。如果它 <=0,则不保留任何空闲连接。
max_idle_conns: 100
# 到数据库的最大打开连接数。如果它 <= 0,则对打开连接数没有限制。
max_open_conns: 900
# 连接可以重复使用的最长时间。如果它 <= 0,则连接不会因为连接的年龄而关闭。
conn_max_lifetime: 5m
# 连接可以空闲的最长时间。如果它 <= 0,则连接不会因为连接的空闲时间而关闭。
conn_max_idle_time: 0
# 在目标主机上存储 Harbor 数据的位置。即使 Harbor 的容器被删除和/或重新创建,这些数据也会保持不变。路径需要你手动创建。
data_volume: /data/harbor-storage
2、配置 Trivy(Harbor 的漏洞扫描组件) 扫描器(可选)
trivy:
# 生产环境建议仅显示有官方修复方案的漏洞
ignore_unfixed: true
# 生产环境必须启用跳过自动更新(需手动维护漏洞数据库)
skip_update: true
# 生产环境建议跳过 Java 数据库自动更新
skip_java_db_update: true
# 启用离线扫描模式(避免依赖外部网络)
offline_scan: true
# 生产环境建议全安全检查(漏洞+配置+密钥)
security_check: vuln,config,secret
# 保持证书验证严格模式
insecure: false
# 根据实际镜像大小调整超时时间(建议 10-15 分钟)
timeout: 15m0s
# 在 air-gapped 环境需要注释以下 token
# github_token: your_github_token
七、运行安装脚本
1、两种方式运行安装脚本
# 进入目录 harbor
cd /data/harbor
# 方式一:默认安装,不含 Trivy
./install.sh
# 方式二:包含 Trivy 的安装
./install.sh --with-trivy
看到下面输出,说明安装成功
[Step 5]: starting Harbor ...
[+] Running 10/10
✔ Network harbor_harbor Created 0.3s
✔ Container harbor-log Started 1.5s
✔ Container registryctl Started 5.0s
✔ Container harbor-db Started 5.6s
✔ Container redis Started 5.1s
✔ Container registry Started 5.6s
✔ Container harbor-portal Started 5.4s
✔ Container harbor-core Started 6.8s
✔ Container harbor-jobservice Started 9.6s
✔ Container nginx Started 9.7s
✔ ----Harbor has been installed and started successfully.----
2、浏览器访问
# 通过浏览器访问 Harbor 控制台,访问 https://harbor.zhixu.com 或http://192.168.31.116
# 如果是自签名证书,浏览器会有警告
# 默认用户 admin,默认初始密码 Harbor12345(可在 harbor.yml 中修改)
# 此密码仅在 Harbor 首次启动时使用,登录后记得修改密码。在后续登录时,将忽略此设置。
(1) 登录页
(2) 右上角点击账户 admin -> 修改密码
(3) 新建项目 nginx
(4) 测试 Harbor 是否能正常上传、下载镜像
# 下载 nginx 镜像
docker pull nginx
# 查看所有本地镜像
docker images
# 为本地 nginx 镜像添加一个新的标签
docker tag nginx:latest harbor.zhixu.com:443/nginx/nginx:1.0
# 登录 Docker Harbor 镜像仓库,输入账号和密码
docker login harbor.zhixu.com:443
# 推送镜像
docker push harbor.zhixu.com:443/nginx/nginx:1.0
# 拉取镜像
docker pull harbor.zhixu.com:443/nginx/nginx:1.0
八、其它
1、如果你希望通过 HTTP 来访问 Docker Registry(包括 Harbor),你需要在 Docker 客户端进行额外的配置,因为默认情况下 Docker 只允许通过 HTTPS 访问 registry。这需要你在 Docker 的配置文件 daemon.json 中添加对应的不安全注册表(insecure registry)。
# 编辑 /etc/docker/daemon.json,添加
"insecure-registries" : ["192.168.31.116"]
# 更新 docker 服务配置
systemctl daemon-reload
# 重启 docker 服务
systemctl restart docker
2、版本问题:Harbor 2.12.3
v 2.12.3 注释掉 https 部分,可以正常部署,但是登录的时候会提示:用户名或者密码不正确。维护人员已与 2025-5-23 在 新版本 2.12.4 中修复 2.12.3 版本中 http 登录问题,所有上文中使用的版本已经改成 2.12.4