一、前言:为什么需要私有镜像仓库?

在容器化时代,Docker镜像成为应用交付的核心载体。但直接使用公共仓库(如Docker Hub)面临安全风险(敏感信息泄露)、速率限制版本管理混乱等问题。Harbor作为CNCF毕业的镜像仓库解决方案,提供:

  • 🔒 企业级安全(RBAC、漏洞扫描、镜像签名)

  • 🚀 高性能分发(P2P分发、异地复制)

  • 📦 全生态兼容(支持Helm Chart、OCI标准)

本文将带你在Docker容器上一步步完成Harbor的安装、配置与生产级优化

二、环境准备

一、资源需求

下表概述了部署 Harbor 的最低和建议资源需求。

资源

最低

推荐

CPU

2 CPU

4 CPU

内存

4 GB

8 GB

磁盘

40 GB

160 GB

二、软件堆栈要求 Compose

下表列出了目标主机上必须安装的软件版本。

软件

版本

描述

Docker 引擎

版本 > 20.10

Docker 引擎安装

Docker Compose

Docker Compose > 2.3

Docker Compose 是 Docker 引擎的一部分

OpenSSL

最新 (可选)

用于为 Harbor 生成证书和密

三、外置服务准备(可选)

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)

    • 确保所有节点能访问同一存储卷


外置服务优势总结

组件

主要收益

生产环境必选?

外置数据库

避免单点故障,便于维护

✅ 是

外置 Redis

提升高并发性能,减少数据库压力

✅ 是

对象存储

无限扩展,数据冗余

✅ 是

负载均衡

实现高可用和零停机升级

⚠️ 按需

三、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
  • 注意

    • 不能使用 localhost127.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),类似于命名空间的概念。

步骤如下:

  1. 登录 Harbor 控制台。

  2. 点击左侧导航栏的 “项目” > “新建项目”

  3. 填写项目名称(如 test-project)。

  4. 选择项目是否公开(默认私有,仅登录用户可访问)。

  5. 点击 “确定”。

项目名建议使用小写字母和短横线,避免特殊字符。


三、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 私有仓库地址。步骤如下:

  1. 编辑 Docker 配置文件

sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
  1. 加入如下内容(或在已有内容中添加该字段):

{
  "insecure-registries": ["192.168.11.1:8080"]
}

如果你已有其他配置项,比如 "registry-mirrors",记得保持 JSON 格式正确,不能重复逗号或丢括号。

  1. 重启 Docker 服务

sudo systemctl daemon-reexec
sudo systemctl restart docker
  1. 再次登录 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.0latest 等)

# 语法规范如下:
# 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 命令。