前言

Harbor 是企业级的 Docker 镜像仓库,提供镜像管理、访问控制、镜像复制、漏洞扫描、审计日志等一系列增强功能,是传统 Docker Registry 的强化版本。在企业容器化平台(如 Kubernetes、Docker Swarm、CI/CD 流水线等)中,Harbor 扮演着关键角色,用于统一管理镜像、提升安全性、规范镜像生命周期。

本文档将详细介绍 Harbor 仓库的部署流程,包括证书生成、配置文件修改、服务启动、客户端信任配置等步骤。通过本文档,你可以快速搭建一套可用于生产环境的 Harbor 私有镜像仓库,支持 HTTPS 安全访问,并确保 Docker 客户端可以成功完成镜像推拉操作。

1 安装 Docker & Docker Compose

===============================安装Docker===============================
# 关闭防火墙和增强功能
systemctl stop firewalld.service && systemctl disable firewalld.service && setenforce 0

# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2

# 配置镜像加速——华为云加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [ "https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com" ]
}
EOF

# 设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装 Docker-CE
yum install -y docker-ce docker-ce-cli containerd.io

# 启动服务
systemctl start docker && systemctl enable docker

===============================安装 Docker Compose===============================
curl -L "https://github.com/docker/compose/releases/download/2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version
===============================若以上Docker Compose下载失败===============================
# 执行
docker compose version
//输出:Docker Compose version v2.27.1 #说明内置了 docker compose 可以直接往下执行

2 下载 Harbor 安装包

wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-online-installer-v2.10.0.tgz
tar xf harbor-online-installer-v2.10.0.tgz
===============================若以上下载失败===============================
# 手动到网页下载安装包
https://github.com/goharbor/harbor/releases/download/v2.8.2/harbor-offline-installer-v2.8.2.tgz
# 将安装包上传到服务器上
cd /opt
tar xf harbor-offline-installer-v2.8.2.tgz

3 生成 HTTPS 证书(自签)

cd /opt/harbor
============================= 配置SAN =============================
cat > harbor-openssl.cnf <<EOF
[ req ]
default_bits       = 4096
distinguished_name = req_distinguished_name
req_extensions     = v3_req
prompt = no

[ req_distinguished_name ]
CN = harbor.mydomain.com

[ v3_req ]
subjectAltName = @alt_names

[ v3_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = harbor.mydomain.com
IP.1  = 192.168.10.71
EOF

============================= 生成CA =============================
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -subj "/CN=harbor-ca" -days 3650 -out ca.crt

============================= 生成key和csr =============================
openssl genrsa -out server.key 4096
openssl req -new -key server.key -out server.csr -config harbor-openssl.cnf

============================= 生成crt =============================
openssl x509 -req -in server.csr \
  -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out server.crt -days 3650 \
  -extensions v3_ext -extfile harbor-openssl.cnf

============================= 复制证书到指定目录 =============================
mkdir -p /opt/harbor/certs
cp server.key /opt/harbor/certs && cp server.crt /opt/harbor/certs

# 目录名要是yml文件定义的IP或域名
mkdir -p /etc/docker/certs.d/192.168.10.71
cp ca.crt /etc/docker/certs.d/192.168.10.71

# 重启docker
systemctl restart docker.service

4 修改 harbor.yml

cp harbor.yml.tmpl harbor.yml

vim harbor.yml
-----------------------------------------------------------------------------------------
# 修改内容:
hostname: <你的服务器 IP>
https:
  certificate: /opt/harbor/certs/server.crt
  private_key: /opt/harbor/certs/server.key
harbor_admin_password: Harbor12345

============================ 配置主机映射 ==============================
vim /etc/hosts
192.168.10.71 harbor.mydomain.com

5 安装 Harbor

# 检查环境和配置
./prepare
# 拉镜像、启动容器(也可以直接执行,因为会覆盖以上内容)
./install.sh

============================== 启动和关闭容器的命令 ==============================
# 需要重启docker compose 所以容器的时候才需要
//在 /opt/harbor 下执行
docker compose down			# 关闭
docker compose up -d		# 启动

6 访问 Harbor

https://192.168.10.71
用户:admin
密码:Harbor12345

7 Docker 客户端登录 Harbor

# 登入
docker login -u admin -p harbor12345 192.168.10.71

8 push 镜像测试

# 打标签
docker tag nginx:latest harbor.mydomain.com/library/nginx:v1
# 上传
docker push harbor.mydomain.com/library/nginx:v1
# 下载
docker pull <镜像名>

9 k8s 拉取权限授权

9.1 Harbor UI 准备(必须)

9.1.1 创建一个专用用户用于 K8s 拉取镜像

Harbor UI → Users → New User
例如:

  • 用户名:harbor-secret
  • 密码:Harbor12345
  • 给该用户赋予项目 myharbor 的 pull 权限。
    请添加图片描述
    请添加图片描述
9.1.2 创建项目,并允许上传镜像

Harbor UI → Projects → New Project → library → 设为 Public 或 Private(建议 private)。

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

9.2 测试 Docker/Containerd 登录(仅用于测试)

9.2.1 拷贝信任证书

1️⃣ 若是docker

# 每个节点创建目录
mkdir -p /etc/docker/certs.d/192.168.10.100

# 在harbor上执行,拷贝证书到每个节点上
scp /etc/docker/certs.d/192.168.10.100/ca.crt root@192.168.10.80:/etc/docker/certs.d/192.168.10.100

# 重启
systemctl restart docker && systemctl status docker

2️⃣ 若是 containerd

mkdir -p /etc/containerd/certs.d/192.168.10.100
scp /etc/docker/certs.d/192.168.10.100/ca.crt root@192.168.10.80:/etc/containerd/certs.d/192.168.10.100

# 修改 containerd 配置
vim /etc/containerd/config.toml
-----------------------------------------------------------------------------------------
[plugins."io.containerd.grpc.v1.cri".registry.configs] # 151行下添加
152           [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.10.100".tls]
153             ca_file = "/etc/containerd/certs.d/192.168.10.100/ca.crt"
154             insecure_skip_verify = false

# 重启
systemctl restart containerd && systemctl status containerd
9.2.2 登入测试

1️⃣ 若是docker

docker login -u harbor-secret -p Harbor12345 192.168.10.100

2️⃣ 若是 containerd

# 前提是安装了 nerdctl
nerdctl login -u harbor-secret -p Harbor12345 192.168.10.100

9.3 在 K8s 创建 imagePullSecret

所有 Namespace 需要各自创建 Secret,或使用 ImagePullSecret Admission Plugin 自动注入。

# 创建命名空间
kubectl create ns htj

kubectl create secret docker-registry harbor-secret \
  --docker-server=192.168.10.100 \
  --docker-username=harbor-secret \
  --docker-password=Harbor12345 \
  --docker-email=1194743653@qq.com \
  -n htj

查看:

kubectl get secret harbor-secret -n htj

9.4 k8s 上创建一个服务账户 ServiceAccount

创建一个默认拉取 Secret:

# 					这个default为该命名空间下默认账户的名称
kubectl patch serviceaccount default \
  -p '{"imagePullSecrets": [{"name": "harbor-secret"}]}' \
  -n htj	# <命名空间>

注:每个命名空间单独创建,拉镜像时自动引用,不需要额外加 imagePullSecret: harbor-secret

总结

通过本次部署,我们成功搭建了一套完整的 Harbor 私有镜像仓库环境,并实现了以下目标:

  • 生成自签名 CA 证书与服务器证书,保证 Harbor 支持 HTTPS 安全访问

  • 完成 Harbor 的 prepare 与 install.sh 初始化与启动

  • 配置 Docker 客户端信任 Harbor 证书,实现安全登录与镜像推拉

  • 成功启动 Harbor 各组件(Core、Registry、JobService、Portal、DB 等)

  • Harbor Web UI 可正常访问,账号密码可登录

  • Docker 客户端可执行 docker login、docker push、docker pull 操作

至此,一个功能完整、安全可用的 Harbor 镜像仓库已搭建完成,可稳定服务企业内部的容器镜像管理需求。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐