源本科技 | 码上会

Harbor 企业级容器镜像仓库

2026/04/25
3
0

概述

Harbor

Harbor 是一个开源的企业级容器镜像注册中心,旨在提供安全、可靠、高性能的镜像管理服务。作为 CNCF(Cloud Native Computing Foundation)的孵化项目,Harbor 支持多种存储后端,具备权限管理、漏洞扫描、镜像复制和自动同步等核心功能。它为团队和组织提供了容器镜像集中化管理平台,有效提升容器化应用的开发、部署效率,同时强化镜像安全管控。

Harbor 是用于存储和分发 Docker 镜像的企业级 Registry 服务器,基于开源 Docker Distribution 扩展了企业级安全、权限、管理等特性,相比原生 Registry 拥有更优的性能与安全性。

https://goharbor.io/

Bitnami

Bitnami 是一家专注于应用程序打包、部署与管理的技术提供商,其打造了预配置、高安全性的应用堆栈,覆盖开发工具、数据库、容器服务等主流场景,帮助开发者与运维人员在多云、本地环境中快速部署应用。

Bitnami 提供的解决方案包含 Stack 应用包、Helm Charts、容器镜像等,大幅简化了应用的部署与维护流程。

https://bitnami.com/

部署与安装

前置操作

解压缩下载的 containers-main.tar.gzharbor-portal\2\debian-12 目录里的内容打包上传至服务器

解压到 /usr/local/docker/harbor 目录

组件说明

Harbor 基于微服务架构拆分,核心组件功能如下:

  • Proxy:基于 Nginx 实现反向代理,统一接收客户端请求,转发至 Registry、UI、Token 等后端服务

  • Registry:负责存储 Docker 镜像,处理 docker push/pull 指令,通过 Token 实现访问权限校验

  • UI:图形化管理控制台,支持镜像管理、用户授权、项目管理等操作

  • WebHook:监听镜像状态变更,实时同步状态至 UI 模块

  • Token:为镜像推拉操作签发合法 Token,保障访问安全

  • Database:存储用户权限、审计日志、镜像分组等核心数据

  • Job Services:负责镜像复制、同步任务,支持跨实例镜像同步

  • Log Collector:统一收集所有组件的日志,方便排查与管理

配置修改

配置服务访问域名

编辑 docker-compose 配置文件,将外部访问地址修改为部署服务器的 IP 地址

注意:无需复制下面的脚本,这里只是提示需要修改为你的服务器 IP

services:
  registry:
    image: docker.io/bitnami/harbor-registry:2
    environment:
      - REGISTRY_HTTP_SECRET=CHANGEME
    volumes:
      - registry_data:/storage
      - ./config/registry/:/etc/registry/:ro
  registryctl:
    image: docker.io/bitnami/harbor-registryctl:2
    environment:
      - CORE_SECRET=CHANGEME
      - JOBSERVICE_SECRET=CHANGEME
      - REGISTRY_HTTP_SECRET=CHANGEME
    volumes:
      - registry_data:/storage
      - ./config/registry/:/etc/registry/:ro
      - ./config/registryctl/config.yml:/etc/registryctl/config.yml:ro
  postgresql:
    image: docker.io/bitnami/postgresql:14
    container_name: harbor-db
    environment:
      - POSTGRESQL_PASSWORD=bitnami
      - POSTGRESQL_DATABASE=registry
    volumes:
      - postgresql_data:/bitnami/postgresql
  core:
    image: docker.io/bitnami/harbor-core:2
    container_name: harbor-core
    depends_on:
      - registry
    environment:
      - CORE_KEY=change-this-key
      - _REDIS_URL_CORE=redis://redis:6379/0
      - SYNC_REGISTRY=false
      - CHART_CACHE_DRIVER=redis
      - _REDIS_URL_REG=redis://redis:6379/1
      - PORT=8080
      - LOG_LEVEL=info
      # 替换为你服务器的 IP
      - EXT_ENDPOINT=http://192.168.203.128
      - DATABASE_TYPE=postgresql
      - REGISTRY_CONTROLLER_URL=http://registryctl:8080
      - POSTGRESQL_HOST=postgresql
      - POSTGRESQL_PORT=5432
      - POSTGRESQL_DATABASE=registry
      - POSTGRESQL_USERNAME=postgres
      - POSTGRESQL_PASSWORD=bitnami
      - POSTGRESQL_SSLMODE=disable
      - REGISTRY_URL=http://registry:5000
      - TOKEN_SERVICE_URL=http://core:8080/service/token
      - HARBOR_ADMIN_PASSWORD=bitnami
      - CORE_SECRET=CHANGEME
      - JOBSERVICE_SECRET=CHANGEME
      - ADMIRAL_URL=
      - CORE_URL=http://core:8080
      - JOBSERVICE_URL=http://jobservice:8080
      - REGISTRY_STORAGE_PROVIDER_NAME=filesystem
      - REGISTRY_CREDENTIAL_USERNAME=harbor_registry_user
      - REGISTRY_CREDENTIAL_PASSWORD=harbor_registry_password
      - READ_ONLY=false
      - RELOAD_KEY=
    volumes:
      - core_data:/data
      - ./config/core/app.conf:/etc/core/app.conf:ro
      - ./config/core/private_key.pem:/etc/core/private_key.pem:ro
  portal:
    image: docker.io/bitnami/harbor-portal:2
    container_name: harbor-portal
    depends_on:
      - core
  jobservice:
    image: docker.io/bitnami/harbor-jobservice:2
    container_name: harbor-jobservice
    depends_on:
      - redis
      - core
    environment:
      - CORE_SECRET=CHANGEME
      - JOBSERVICE_SECRET=CHANGEME
      - CORE_URL=http://core:8080
      - REGISTRY_CONTROLLER_URL=http://registryctl:8080
      - REGISTRY_CREDENTIAL_USERNAME=harbor_registry_user
      - REGISTRY_CREDENTIAL_PASSWORD=harbor_registry_password
    volumes:
      - jobservice_data:/var/log/jobs
      - ./config/jobservice/config.yml:/etc/jobservice/config.yml:ro
  redis:
    image: docker.io/bitnami/redis:latest
    environment:
      # ALLOW_EMPTY_PASSWORD is recommended only for development.
      - ALLOW_EMPTY_PASSWORD=yes
  harbor-nginx:
    image: docker.io/bitnami/nginx:latest
    container_name: nginx
    volumes:
      - ./config/proxy/nginx.conf:/opt/bitnami/nginx/conf/nginx.conf:ro
    ports:
      - '80:8080'
    depends_on:
      - postgresql
      - registry
      - core
      - portal
volumes:
  registry_data:
    driver: local
  core_data:
    driver: local
  jobservice_data:
    driver: local
  postgresql_data:
    driver: local
# 拉取镜像
docker-compose pull

配置 Docker 信任私有仓库

Docker 1.3.X 版本之后,与 Registry 交互默认强制使用 HTTPS 协议,而本地私有仓库默认使用 HTTP 协议,因此需要配置信任规则。

  • 编辑 Docker 守护进程配置文件

vi /etc/docker/daemon.json
  • 添加私有仓库信任配置(IP 替换为你的服务器地址)

{
  "insecure-registries": ["192.168.203.128"]
}
  • 重载配置并重启 Docker 服务

systemctl daemon-reload 
systemctl restart docker

服务启动与登录

启动 Harbor

进入部署目录,执行后台启动命令:

cd /usr/local/docker/harbor
docker-compose up -d

Web 控制台登录

直接访问部署服务器的 IP 地址即可进入登录页面:

  • 用户名:admin

  • 密码:bitnami

镜像管理实操

命令行登录 Harbor 仓库

为保证安全,推荐非交互方式登录,避免密码泄露到命令行历史或日志中。

  • 创建密码存储文件并写入密码

# 创建目录
mkdir -p /usr/local/docker/pwd
# 编辑密码文件,写入:bitnami
vi /usr/local/docker/pwd/harbor
  • 执行登录命令

cat /usr/local/docker/pwd/harbor | docker login http://192.168.203.128 --username admin --password-stdin
  • 登录成功提示

Login Succeeded

上传镜像至私有仓库

  • 下载测试镜像(生产环境使用自定义业务镜像)

docker pull nginx
  • 为镜像打标签(格式:仓库地址 / 项目名 / 镜像名: 版本)

library 为 Harbor 默认项目,可根据需求自定义创建项目

docker tag nginx 192.168.203.128/library/nginx:latest
  • 推送镜像到 Harbor

docker push 192.168.203.128/library/nginx:latest
  • 上传成功输出

d874fd2bc83b: Pushed 
32ce5f6a5106: Pushed 
f1db227348d0: Pushed 
b8d6e692a25e: Pushed 
e379e8aedd4d: Pushed 
2edcec3590a4: Pushed 
latest: digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3 size: 1570

返回 Harbor Web 控制台,即可查看已上传的镜像。

拉取与部署私有镜像

  • 拉取私有仓库镜像

docker pull 192.168.203.128/library/nginx
  • 通过 Docker Compose 部署容器

services:
  web:
    image: 192.168.203.128/library/nginx
    container_name: nginx
    ports:
      - 80:80