Harbor 是一个开源的企业级容器镜像注册中心,旨在提供安全、可靠、高性能的镜像管理服务。作为 CNCF(Cloud Native Computing Foundation)的孵化项目,Harbor 支持多种存储后端,具备权限管理、漏洞扫描、镜像复制和自动同步等核心功能。它为团队和组织提供了容器镜像集中化管理平台,有效提升容器化应用的开发、部署效率,同时强化镜像安全管控。
Harbor 是用于存储和分发 Docker 镜像的企业级 Registry 服务器,基于开源 Docker Distribution 扩展了企业级安全、权限、管理等特性,相比原生 Registry 拥有更优的性能与安全性。
Bitnami 是一家专注于应用程序打包、部署与管理的技术提供商,其打造了预配置、高安全性的应用堆栈,覆盖开发工具、数据库、容器服务等主流场景,帮助开发者与运维人员在多云、本地环境中快速部署应用。
Bitnami 提供的解决方案包含 Stack 应用包、Helm Charts、容器镜像等,大幅简化了应用的部署与维护流程。
GitHub 仓库:https://github.com/bitnami/containers
全量服务包:https://github.com/bitnami/containers/archive/main.tar.gz
解压缩下载的 containers-main.tar.gz 将 harbor-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 pullDocker 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进入部署目录,执行后台启动命令:
cd /usr/local/docker/harbor
docker-compose up -d直接访问部署服务器的 IP 地址即可进入登录页面:
用户名:admin
密码:bitnami

为保证安全,推荐非交互方式登录,避免密码泄露到命令行历史或日志中。
创建密码存储文件并写入密码
# 创建目录
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