Harbor 介绍

Harbor 是一个开源的 云原生制品(artifact)仓库,最初由 VMware 开发并捐赠给 CNCF(Cloud Native Computing Foundation),现已成为 CNCF 的毕业项目。Harbor 主要用于存储、签名和扫描容器镜像(如 Docker 镜像),同时也支持 Helm Chart、OCI Artifacts 等多种云原生制品。

Harbor 的核心功能

环境准备

系统概况

系统版本: Rocky Linux 8.10
主机名: harbor
IP: 10.0.0.4/24

Docker

添加中科大源:

1
2
3
4
5
6
7
8
# 添加源
[jhon@harbor ~]$ sudo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

# 导入公钥
[jhon@harbor ~]$ sudo rpm --import https://mirrors.ustc.edu.cn/docker-ce/linux/centos/gpg

# 验证:列出docker 版本
[jhon@harbor ~]$ dnf list docker-ce --showduplicates

Harbor

使用离线安装模式, Harbor 版本 v2.13.2
安装包下载地址: harbor-offline-installer-v2.13.2.tgz

部署

将离线的资源上传到 harbor 主机上

安装 Docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装
[jhon@harbor ~]$ sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 启动并设置开机自启
[jhon@harbor ~]$ sudo systemctl enable --now docker

# 验证运行状态 应返回 "active"
[jhon@harbor ~]$ sudo systemctl is-active docker

# 配置普通用户,免 sudo 使用 Docker(可选但推荐)
[jhon@harbor ~]$ sudo usermod -aG docker jhon

# 刷新组权限(或重新登录 SSH)
[jhon@harbor ~]$ newgrp docker
  • 注意: docker-compose-plugin 是新版 Docker Compose(v2+),以插件形式集成,命令为 docker compose(注意中间是空格,不是 -)。

证书管理

创建内部 CA 证书 (证书颁发机构)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建专门存放证书的目录
[jhon@harbor ~]$ sudo mkdir -p /data/cert
[jhon@harbor ~]$ cd /data/cert

# 生成 CA 私钥(密码为空,方便自动启动)
[jhon@harbor cert]$ sudo openssl genrsa -out ca.key 4096

# 生成 CA 证书
# 由 CA 私钥 (ca.key) 生成 CA 证书 (ca.crt)
# 名称为 "MyHarborCA"
[jhon@harbor cert]$ sudo openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/CN=MyHarborCA"

# 这两文件就是你的“内部发证机关”。
[jhon@harbor cert]$ ls
ca.crt ca.key
  • /data/cert/ca.key → CA 私钥(绝对保密!不要外传!)
  • /data/cert/ca.crt → CA 证书(要分发给所有客户端信任)
用 “MyHarborCA” CA证书给 Harbor 创建一个证书

准备配置文件 支持域名:harbor.example.com

1
2
3
4
5
6
7
8
# 创建一个扩展配置文件,用于指定“允许通过哪些访问”

cat > /dev/stdout <<EOF | sudo tee v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = DNS:harbor.example.com
EOF

生成 Harbor 证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 生成 Harbor 服务器私钥
[jhon@harbor cert]$ sudo openssl genrsa -out harbor.key 4096
[jhon@harbor cert]$ sudo chmod 600 harbor.key

# 2. 生成证书签名请求(CSR)
# CN 必须和请求访问地址一致(这里用 域名 harbor.example.com)
[jhon@harbor cert]$ sudo openssl req -new -key harbor.key -out harbor.csr -subj "/CN=harbor.example.com"

# 3. 用 CA (MyHarborCA)签发正式证书
sudo openssl x509 -req \
-in harbor.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial \
-out harbor.crt \
-days 3650 \
-sha256 \
-extfile v3.ext

让系统信任自建 CA

1
2
3
4
5
6
7
8
9
# Rocky/CentOS/RHEL 标准做法:
sudo cp /data/cert/ca.crt /etc/pki/ca-trust/source/anchors/harbor-ca.crt

# 更新系统信任库
sudo update-ca-trust

# 验证
[jhon@harbor cert]$ trust list | grep -i harbor
label: MyHarborCA

安装 Harbor

解压并移动

1
2
3
4
5
6
7
[jhon@harbor ~]$ ls harbor-offline-installer-v2.13.2.tgz 
harbor-offline-installer-v2.13.2.tgz
[jhon@harbor ~]$ tar -zxf harbor-offline-installer-v2.13.2.tgz
[jhon@harbor ~]$ sudo mv harbor /usr/local/
[jhon@harbor ~]$ cd /usr/local/harbor/
[jhon@harbor harbor]$ ls
common.sh harbor.v2.13.2.tar.gz harbor.yml.tmpl install.sh LICENSE prepare

导入 harbor 镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[jhon@harbor harbor]$ docker load -i harbor.v2.13.2.tar.gz
[jhon@harbor harbor]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
goharbor/harbor-exporter v2.13.2 25f5a194d298 3 months ago 132MB
goharbor/redis-photon v2.13.2 4153f964b209 3 months ago 166MB
goharbor/trivy-adapter-photon v2.13.2 60672d380012 3 months ago 390MB
goharbor/harbor-registryctl v2.13.2 af207ccbe6db 3 months ago 166MB
goharbor/registry-photon v2.13.2 a0a146d033c4 3 months ago 87.4MB
goharbor/nginx-photon v2.13.2 aa191f956a23 3 months ago 151MB
goharbor/harbor-log v2.13.2 9835b2c97248 3 months ago 163MB
goharbor/harbor-jobservice v2.13.2 7678c8e2cc6e 3 months ago 179MB
goharbor/harbor-core v2.13.2 a754b7d40a2a 3 months ago 200MB
goharbor/harbor-portal v2.13.2 2cdbbbaec695 3 months ago 159MB
goharbor/harbor-db v2.13.2 d454060ee4b6 3 months ago 273MB
goharbor/prepare v2.13.2 53905b30703f 3 months ago 208MB

修改 harbor 配置文件

这里不启用 mTLS, 之后有时间在配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 通过模板生成配置文件
[jhon@harbor harbor]$ cp harbor.yml.tmpl harbor.yml

# 该配置定义了网址、证书、密码
[jhon@harbor harbor]$ vim harbor.yml
# 与证书 CN 匹配
5 hostname: harbor.example.com
# 不使用http
8 # http:
10 # port: 80
# 使用https 配置证书路径
17 certificate: /data/cert/harbor.crt
18 private_key: /data/cert/harbor.key
47 harbor_admin_password: <登陆密码>

预安装环境检查,生成项目文件

1
2
3
4
[jhon@harbor harbor]$ ./prepare 
...output omitted...
ca file /hostfs/data/secret/tls/harbor_internal_ca.crt is not exist
...output omitted...

注意:

1
2
Harbor 检测到你可能想使用内部 CA 证书(用于信任外部 HTTPS 服务,比如后端存储、Redis 等),但没找到对应的文件。
不过——如果你只是用自签名证书给 Harbor 自己提供 HTTPS 访问(最常见场景),这个警告可以忽略!

安装

有 2 种方式:

  • install.sh
  • docker compose -f docker-compose.yml up -d

安装包提供的 install.sh 更加推荐,会做得更加全面。

1
2
3
4
5
6
7
8
# 推荐使用 sudo 安装
[jhon@harbor harbor]$ sudo ./install.sh

# 验证 查看项目
[jhon@harbor harbor]$ docker compose ls -a
NAME STATUS CONFIG FILES
harbor running(9) /usr/local/harbor/docker-compose.yml

访问

由于是内网访问,所以需要配置 hosts 文件。

1
2
vim /etc/hosts 添加内容
<你的harbor主机 ip> harbor.example.com

浏览器访问:https://harbor.example.com

登陆界面

图片去哪里了!!!

控制界面

图片去哪里了!!!

配置 systemd 管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建 systemd 服务文件
[jhon@harbor harbor]$ sudo vim /etc/systemd/system/harbor.service
[Unit]
Description=Harbor Container Registry
After=docker.service
Requires=docker.service
Documentation=https://goharbor.io

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/usr/local/harbor
ExecStart=/usr/bin/docker compose -f /usr/local/harbor/docker-compose.yml up -d
ExecStop=/usr/bin/docker compose -f /usr/local/harbor/docker-compose.yml down
ExecReload=/usr/bin/docker compose -f /usr/local/harbor/docker-compose.yml up -d
TimeoutStartSec=600
TimeoutStopSec=180

[Install]
WantedBy=multi-user.target

# 重新加载服务
[jhon@harbor harbor]$ sudo systemctl daemon-reload

# 启动并设置开机自启
[jhon@harbor harbor]$ sudo systemctl enable --now harbor.service

使用 Harbor

等到 docker 和 k8s 在补充