镜像仓库-Harbor
一、简介
CentOS下安装Harbor镜像仓库
harbor的官方安装指南介绍了harbor有三种安装方式,分别是在线安装、离线安装和OVA安装,由于网络环境受限,本文主要采用离线安装的方式。 官方文档上面说明需要依赖Python 2.7或以上版本,Docker引擎1.10以上,还有Docker Compose 1.6.0或以上版本。 CentOS 7.2自带Python 2.7.5
官方中文文档:https://vmware.github.io/harbor/cn
安装配置指南:链接
用户使用指南:链接
二、架构分解
Harbor在架构上主要由五个组件构成:
Proxy
Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
Registry
负责储存Docker镜像,并处理dockerpush/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token,Registry会通过公钥对token 进行解密验证。
Core services
这是Harbor的核心功能,主要提供以下服务:
UI(harbor-ui)
提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。
webhook
为了及时获取registry上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。
token服务
负责根据用户权限给每个docker push/pull命令签发token.Docker客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
Database(harbor-db)
为coreservices提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。
Log collector(harbor-log)
为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。
Harbor的每个组件都是以Docker容器的形式构建的,因此很自然地,我们使用Docker Compose来对它进行部署。在源代码中(https://github.com/vmware/harbor), 用于部署Harbor的Docker Compose模板位于harbor/make/docker-compose.tpl。
Harbor安装步骤归结为以下几点:
下载安装程序;
配置harbor.cfg文件;
运行install.sh来安装并启动Harbor;
组件
功能
harbor-adminiserver
配置管理中心
harbor-db
Mysql数据库
harbor-jobservice
负责镜像复制
harbor-log
记录操作日志
harbor-ui
web管理页面和API
nginx
前端代理,负责前端页面和镜像上传/下载转发
redis
会话
registry
镜像存储
三、安装
建议在centos7上安装,本文以centos7.4 64为例
1、安装docker
2、安装Docker Compose
下载1.21.2版本的Docker Compose,参考文档
修改docker-compose为可执行文件:
或者使用pip安装
测试是否安装成功
运行命令【docker-compose version】测试安装是否成功
3、安装Harbor
3.1、下载离线安装包
在GitHub上找到下载地址并下载,我这里下载的1.5.1版本,整个文件800多MB:

解压安装包
tar xvf harbor-offline-installer-v1.5.1.tgz

其中:
Harbor.cfg 全局配置文件,主要包含了一些常用设置,比如是否开启https等。
install.sh 安装脚本
prepare 是一个python写的预处理脚本,主要用于初始化一些harbor.cfg的相关设置。
docker-compose.yaml 描述了组件之间依赖关系以及配置挂载,数据持久化等设置
3.2、修改配置文件【harbor.cfg】
必需的参数有:
1. hostname:目标主机的主机名,用于访问UI和注册服务。不能使用localhost和127.0.0.1,因为harbor需要被外部客户端访问,我这里修改成了IP地址。

2. ui_url_protocol:用于访问UI和令牌/通知服务的协议,默认为http,如果在Nginx上启用了SSL认证可以设置成https,我这里用的默认的http。

3.电子邮件设置:Harbor需要这些参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能时才需要。还有,千万注意,在默认情况下SSL连接是没有启用-如果你的SMTP服务器需要SSL,但不支持STARTTLS,那么你应该通过设置启用SSL
4.harbour_admin_password:管理员的初始密码。此密码仅在港口首次发布时生效。之后,将忽略此设置,并且应在UI中设置管理员的密码。
auth_mode:使用的认证类型。默认情况下,它是db_auth,即凭据存储在数据库中。对于LDAP认证,请将其设置为ldap_auth。
ldap_url:LDAP端点URL(例如ldaps://ldap.mydomain.com)。 仅当auth_mode设置为ldap_auth时使用。
ldap_searchdn:具有搜索LDAP / AD服务器(例如uid=admin,ou=people,dc=mydomain,dc=com)的权限的用户的DN 。
ldap_search_pwd:由指定的用户的密码ldap_searchdn。
ldap_basedn:查找用户的基本DN,例如ou=people,dc=mydomain,dc=com。 仅当auth_mode设置为ldap_auth时使用。
ldap_filter:用于查找用户的搜索过滤器,例如(objectClass=person)。
ldap_uid:用于在LDAP搜索期间匹配用户的属性,可以是uid,cn,电子邮件或其他属性。
ldap_scope:用于搜索用户的范围,1-LDAP_SCOPE_BASE,2-LDAP_SCOPE_ONELEVEL,3-LDAP_SCOPE_SUBTREE。默认值为3。
db_password:用于db_auth的MySQL数据库的根密码。更改此密码以用于任何生产使用!
self_registration:(on或off。默认为on)启用/禁用用户注册自己的能力。禁用时,新用户只能由管理员用户创建,只有管理员用户才能在Harbor中创建新用户。 注意:当auth_mode设置为ldap_auth时,将始终禁用自注册功能,并且将忽略此标志
5. max_job_workers:作业服务中的最大复制worker数,这里默认写的50,考虑到我的服务器的性能,我这里修改成了5。

6. customize_crt:设置为on,prepare脚本创建用于生成/验证注册表令牌的私钥和根证书。如果设置成off,密钥和根证书将由外部源提供,我设置的是on。

7. ssl_cert:SSL证书的位置,只有协议设置成https的时候,这个属性才会生效。
8. ssl_cert_key:SSL秘钥的位置,只有协议设置成https的时候,这个属性才会生效。
9. secretkey_path:密码存放的路径,这里最好别修改,否则后面会报错,我修改成了【/data/admin/】。

10. log_rotate_count:日志文件保留的数量,达到最大值后会循环删除之前的日志。
11. log_rotate_size:每个日志的大小,我为了节省空间设置日志最多保留5个,每个最大200MB。

注:添加阿里云oss做存储
官方文档:https://docs.docker.com/registry/storage-drivers/oss/
docker-compose.yml文件中registry:容器内增加以下内容
3.3、运行【prepare】使用官方自带脚本更新参数

3.4、开始安装
执行【install.sh】自动进行安装
启动:
3.5、打开页面访问:

命令行登陆Harbor
由于https原因登陆报错,修改docker配置文件
四、升级Harbor和迁移数据
1. 登到harbor所在的服务器上,如果harbor还在运行,就停止并删除对应的Harbor实例。
cd harbor
docker-compose down
2. 备份harbor当前的文件,确保在需要的时候可以回滚到当前的这个版本。
cd ..
mv harbor /my_backup_dir/harbor
3. 在github上获取最新的harbor发布版安装包,下载地址:https://github.com/vmware/harbor/releases
4. 在更新harbor之前,先做数据库迁移操作。这个迁移工具以docker镜像的方式提供,所以你需要从docker hub上pull镜像。在下面的命令里,用harbor的发布版本号来替换[tag]:
docker pull vmware/harbor-db-migrator:[tag]
5. 备份数据库到一个目录,比如/path/to/backup。如果目录不存在的话,你需要自己创建,并且数据库的用户名和密码需要通过环境变量“DB_USR”和“DB_PWD”来提供。
docker run -ti --rm -e DB_USR=root -e DB_PWD=xxxx -v/data/database:/var/lib/mysql -v /path/to/backup:/harbor-migration/backupvmware/harbor-db-migrator:[tag] backup
6. 更新数据库模式并迁移数据:
docker run -ti --rm -e DB_USR=root -e DB_PWD=xxxx -v/data/database:/var/lib/mysql vmware/harbor-db-migrator:[tag] up head
7. 解压新的harbor安装包,并切换到工作目录./harbor中去。通过修改harbor.cfg来配置harbor。
通过修改harbor.cfg来配置harbor,你可能需要参考第二步操作时备份的配置文件。参考安装和配置手册获取更多的信息。由于新版本的harbor.cfg配置文件的格式和内容可能会发生改变,所以不能直接从之前的版本来复制harbor.cfg配置文件。
重要:如果你更新harbor之前使用的认证方式为LDAP/AD,那边在你加载启动新版本的harbor之前,必须要确保harbor.cfg中的auth_mode配置成ldap_auth,否则,更新之后用户将无法登陆
升级后回滚
不管什么原因,如果你想回滚到之前的harbor版本,可以参考如下步骤:
1. 停harbor服务。
cd harbor
docker-compose down
2. 从备份文件/path/to/backup中恢复数据库。
docker run -ti --rm -e DB_USR=root -e DB_PWD=xxxx -v/data/database:/var/lib/mysql -v /path/to/backup:/harbor-migration/backupvmware/harbor-db-migrator:[tag] restore
3. 删除当前的harbor实例。
rm -rf harbor
4. 恢复老版本的harbor文件。
mv /my_backup_dir/harbor harbor
5. 使用之前的配置重启harbor服务。
如果之前版本是通过发布的二进制包安装的:
cd harbor
./install.sh
注意:如果你安装harbor选择其他组件,比如Notary或者Clair,可参考安装和配置手册获取更新信息。
如果之前的harbor版本是通过源码安装的:
cd harbor
docker-compose up --build -d
迁移工具参考
使用help命令显示迁移工具帮助信息:
docker run --rm -e DB_USR=root -e DB_PWD=xxxxvmware/harbor-db-migrator:[tag] help
使用test命令测试mysql连接:
docker run --rm -e DB_USR=root -e DB_PWD=xxxx -v/data/database:/var/lib/mysql vmware/harbor-db-migrator:[tag] test
五、排障:
查看日志:例如查看adminserver的日志
配置harbor https
1.先停止harbor服务
2.修改harbor.cfg
3.重新发布服务
清理镜像释放空间
Harbor私有仓库运行一段时间后,仓库中存有大量镜像,会占用太多的存储空间。直接通过Harbor界面删除相关镜像,并不会自动删除存储中的文件和镜像。需要停止Harbor服务,执行垃圾回收命令,进行存储空间清理和回收
要启用垃圾回收(GC),首先要关闭Harbor服务,然后再执行清理命令
停止Harbor相关服务
$ docker-compose stop
使用--dry-run参数运行容器,预览运行效果,但不删除任何数据
$ docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.2-photon garbage-collect --dry-run /etc/registry/config.yml
不使用--dry-run参数,将删除相关的文件和镜像,
重新启动Harbor相关服务
$ docker-compose start
六.文章参考:
https://solution.cloudcare.cn/?p=1519
https://www.jianshu.com/p/bca5251c9a08
Last updated
