镜像仓库-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

安装配置指南:链接

用户使用指南:链接

二、架构分解

Docker:企业级私有镜像仓库Harbor使用

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安装步骤归结为以下几点:

  1. 下载安装程序;

  2. 配置harbor.cfg文件;

  3. 运行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

http://blog.51cto.com/dangzhiqiang/1962874

特别好:https://www.cnblogs.com/kevingrace/p/6547616.html

Last updated