Harbor

2024-01-13T18:48:49+08:00 | 6分钟阅读 | 更新于 2024-01-13T18:48:49+08:00

@

学习目标

学完本章你应该能够:

  1. 说清 Harbor 在 CICD 链路里的位置——它就是一个「公司内部的私有 Docker Hub / 镜像图书馆」。
  2. 独立在 CentOS / Rocky 上装好 Docker,并配置国内镜像加速器,让 docker pull 不再卡顿。
  3. 生成自签名证书,并让「操作系统」和「Docker 客户端」两边都信任,从而实现 HTTPS 访问。
  4. harbor.yml 完成离线部署,并用 docker login 验证能正常推拉镜像。
  5. 讲清证书信任链的区别:系统 CA 信任库 vs Docker 的 certs.d 目录分别解决谁的问题。

前置知识

  • Linux 基础命令(sudosedteemkdirsystemctl)。
  • Docker 基本概念(镜像、容器、仓库、docker login / docker pull / docker push)。

本章你会动手做的事

  1. 给服务器配一套国内镜像加速器,实测 docker pull 速度。
  2. openssl 生成一套自签名证书,并分别装进系统 CA 和 Docker 的信任目录。
  3. 下载 Harbor 离线包,改 harbor.yml,跑 ./install.sh 把服务拉起来并登录。

一、先建立直觉:Harbor 是什么

类比:如果把 Docker Hub 理解成「公有的快递柜 / 公共图书馆」,那 Harbor 就是你们公司自己搭在机房里的「内部快递柜」。开发同学把打好的镜像(artifact)存进去,CI 流水线和其他同事按需取出来部署。它最大的价值是:镜像不出公司网络、有权限管控、有漏洞扫描和审计

Harbor 自身也是一组容器,由 Nginx 做统一入口,后面挂 Core(API/UI/鉴权)、Registry(真正存镜像 blobs)、PostgreSQL(元数据)和 Redis(缓存/会话)。一次 docker push 的请求流转大致是这样:

flowchart LR
    U[开发者 / CI 流水线] -->|docker push / pull| N[Nginx 反向代理
80 / 443] N --> C[Core 核心服务
API / UI / 鉴权] N --> R[Registry 镜像存储] C --> DB[(PostgreSQL 元数据)] C --> Redis[(Redis 缓存 / 会话)] R --> S[(存储卷 /data/harbor)]

一句话记住:Nginx 负责「门面」和 HTTPS 终结,Registry 负责「货架」,Core 负责「管理员」,DB/Redis 负责「账本和记忆」


更换国内源

⚠️ 新手必踩的坑:源没换就 dnf install。Rocky / CentOS 默认源在国外,不换源直接装会慢到怀疑人生,甚至超时失败。先换国内源再装任何东西。

# 阿里
sed -e 's|^#mirrorlist=|mirrorlist=|g' \
    -e 's|^baseurl=https://mirrors.aliyun.com/rockylinux|#baseurl=http://dl.rockylinux.org/$contentdir|g' \
    -i.bak \
    /etc/yum.repos.d/rocky*.repo

# 中科大
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.ustc.edu.cn/rocky|g' \
    -i.bak \
    /etc/yum.repos.d/rocky-extras.repo \
    /etc/yum.repos.d/rocky.repo

# 生成缓存
dnf makecache

Docker 安装

更新系统与安装依赖

sudo dnf update -y
sudo dnf install -y yum-utils device-mapper-persistent-data lvm2

配置国内 Docker 源

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/' /etc/yum.repos.d/docker-ce.repo

安装 Docker

sudo dnf install -y docker-ce docker-ce-cli containerd.io

安装完成后启动服务并设置开机自启

sudo systemctl start docker
sudo systemctl enable docker

配置国内镜像加速器

⚠️ 新手必踩的坑:加速器配完不重启 Docker。改了 /etc/docker/daemon.json 必须 systemctl restart docker 才生效,否则 docker pull 还是走默认源。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
   "https://192e82cca03a4a8aa64fea319af4dd55.mirror.swr.myhuaweicloud.com",
    "https://yp8sluaa.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "https://mirror.ccs.tencentyun.com",
    "https://registry.hub.docker.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://registry.docker-cn.com"
  ]
}
EOF

证书

白话:Harbor 默认用 HTTPS(443)。如果你用的是 harbor.local.com 这种「自造域名」,浏览器和 Docker 都不认识它的证书,会报「证书不受信任」。解决办法是自己当 CA,给 harbor.local.com 签一张证书,再把这张证书「告诉」操作系统和 Docker,让它们信任它。

创建证书目录

sudo mkdir -p /etc/harbor/ssl
cd /etc/harbor/ssl

生成自签名证书

# 生成私钥
sudo openssl genrsa -out harbor.local.com.key 2048

# 生成证书签名请求(注意替换IP/域名)
sudo openssl req -new -key harbor.local.com.key -out harbor.local.com.csr -subj "/CN=harbor.local.com"

# 生成自签名证书(有效期10年)
openssl req -x509 -nodes -days 3650 \
  -newkey rsa:2048 \
  -keyout harbor.local.com.key \
  -out harbor.local.com.crt \
  -subj "/CN=harbor.local.com" \
  -addext "subjectAltName=IP:192.168.66.66,DNS:harbor.local.com"

#设置权限
sudo chmod 600 harbor.local.com.key

证书信任的两条路径,恰恰是新手最容易混的地方——下面这张图说清「系统 CA」和「Docker certs.d」分别管谁:

flowchart TD
    A[生成私钥 harbor.key] --> B[生成 CSR 请求]
    B --> C[自签名生成 .crt]
    C --> D[系统 CA 信任库
update-ca-trust] C --> E[Docker certs.d 目录
/etc/docker/certs.d] D --> F[操作系统 / curl 信任] E --> G[Docker 客户端信任]

将证书加入系统

# 将Harbor的证书复制到系统CA信任目录
sudo mkdir -p /etc/pki/ca-trust/source/anchors
sudo cp /etc/harbor/ssl/harbor.local.com.crt /etc/pki/ca-trust/source/anchors/

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

验证证书信任状态

# 检查证书是否已加入信任库
sudo trust list | grep harbor.local.com
# 应显示类似:harbor.local.com: CN=harbor.local.com

docker 证书信任

⚠️ 新手必踩的坑:只装了系统 CA,没装 Docker 的 certs.d。系统信任了 ≠ Docker 信任。docker login 走的是 Docker 自己的证书逻辑,必须把 .crt 放到 /etc/docker/certs.d/<域名>/ca.crt,否则照样报 x509: certificate signed by unknown authority

# 创建Docker证书目录
sudo mkdir -p /etc/docker/certs.d/harbor.local.com

# 复制证书到Docker目录
sudo cp /etc/harbor/ssl/harbor.local.com.crt /etc/docker/certs.d/harbor.local.com/ca.crt

# 重启Docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker

使用 openssl 验证证书链

openssl s_client -connect harbor.local.com:443 -showcerts
# 检查输出中是否包含Verify return code: 0 (ok)

使用 Let’s Encrypt 免费证书(生产环境推荐)

白话:自签名证书只适合内网和测试。生产环境外部用户要访问,最好用 Let’s Encrypt 签的「公认可信」证书,浏览器和 Docker 天然信任,免去了到处装 CA 的麻烦。

# 安装Certbot
sudo yum install -y certbot

# 生成证书
sudo certbot certonly --standalone -d harbor.local.com

部署 harbor

下载镜像

wget https://github.com/amy5200/harbor-arm64/releases/download/v2.11.0/harbor-v2.11.0-aarch64.tar.gz
sudo tar -zxvf harbor-v2.11.0-aarch64.tar.gz -C /usr/local
cd /usr/local/harbor

配置文件

hostname: harbor.local.com # 域名
http:
  port: 80 # 非必要可注释
https:
  port: 443
  certificate: /etc/harbor/ssl/harbor.local.com.crt
  private_key: /etc/harbor/ssl/harbor.local.com.key
harbor_admin_password: Harbor12345 # 管理员密码
data_volume: /data/harbor # 存储路径

启动

⚠️ 新手必踩的坑:跳过 ./prepare 直接 ./install.shprepare 会根据 harbor.yml 生成各组件的配置文件(含 Nginx 的证书挂载),没它直接 install 会拿不到正确配置。prepare 在前,install 在后,顺序不能反。

# 预处理配置
sudo ./prepare

# 启动安装
sudo ./install.sh

部署全流程按顺序串起来就是下面这样:

flowchart LR
    A[下载离线包
tar 解压] --> B[配置 harbor.yml
域名/证书/密码] B --> C[./prepare
生成组件配置] C --> D[./install.sh
拉起容器] D --> E[docker login
验证可推拉]

登陆

# 验证
curl https://harbor.local.com

# Docker客户端登陆
docker login harbor.local.com -u admin

自测题与动手练习

自测题(合上书能答出来,才算懂)

  1. Harbor 和直接用 Docker Hub 相比,核心价值是什么?为什么说它「镜像不出公司网络」很重要?
  2. 系统 CA 信任库和 Docker 的 certs.d 目录,分别解决「谁」不信任证书的问题?
  3. 为什么自签名证书适合内网、却不适合生产环境对外暴露?生产环境该用什么?
  4. ./prepare./install.sh 的执行顺序能不能反过来?各自干了什么?
  5. 如果 docker login harbor.local.comx509: certificate signed by unknown authority,你的第一步排查动作是什么?

动手练习(建议真做一遍)

  1. 在一台测试机配好国内镜像加速器,用 time docker pull nginx 对比配前配后的耗时。
  2. 完整走一遍自签名证书流程,并故意「只装系统 CA 不装 Docker certs.d」,复现登录报错,再补齐目录验证修复。
  3. harbor.ymlharbor_admin_password 改掉,重新 ./prepare && ./install.sh,用新密码登录确认生效。

本章小结

  • Harbor 是私有镜像仓库,本质是「Nginx 入口 + Core 管理 + Registry 存镜像 + PostgreSQL/Redis 记账」的一组容器,是 CICD 流水线的镜像中转站。
  • 安装顺序是「换源 → 装 Docker → 配加速器 → 生成证书 → 装 CA 信任 → 部署 Harbor」,其中证书信任要同时覆盖「系统 CA」和「Docker certs.d」两处。
  • 自签名证书适合内网测试;生产环境优先用 Let’s Encrypt 等公开可信证书,省去到处分发的麻烦。
  • 下一篇我们进入「镜像推拉与 CICD 流水线集成」,看看 Jenkins / GitLab CI 如何把构建好的镜像自动推送到 Harbor 并触发部署。
About Me

没什么想介绍的,一个很大众的码农…

喜欢代码,车,马,真的是 🐎

讨厌别人让我给自己的代码写注释 最厌烦别人的程序没有写注释

目标

学AI,加油!加油!