Harbor与Nexus一样可用用于构建企业级的镜像私库,但是与Nexus不同的是Harbor的策略是完全聚焦于镜像私库,对于Maven/Npm等私库的管理未做任何涉及。因为Harbor完全是在Registry上的封装,目前比Registry功能主要的强化在于:
- 提供UI界面
- 提供基于角色管理的用户权限
- 提供用户操作记录审计确认
- 提供镜像
- 提供对Helm Chart等的支持
概要信息
项目 | 说明 |
---|---|
官网 | https://goharbor.io/ |
开源/闭源 | 开源 |
License类别 | Apache License 2.0 |
代码管理地址 | https://github.com/goharbor/harbor |
开发语言 | go typescript |
当前稳定版本 | 1.5.2 |
更新频度 | 平均每月2次 |
注:开发语言可以看到是go和typescript,后端主要是使用beego的框架进行的go语言开发,而前端则是利用angular的cli框架进行的开发。
之前版本的Harbor
在2016年我曾经对Harbor的早期版本的使用方式做过记录,有兴趣的看一下。
版本 | 说明 |
---|---|
0.4.1 | https://blog.csdn.net/liumiaocn/article/details/52862408 |
0.3.0 | https://blog.csdn.net/liumiaocn/article/details/52244749 |
特点
优势 | 详细说明 |
---|---|
效率 | 搭建组织内部的私有容器Registry服务,可显著降低访问公共Registry服务的网络需求。这个基本上所有的镜像私库都能做到这一点。 |
访问控制 | 提供基于角色的访问控制,可集成企业目前拥有的用户管理系统(如:AD/LDAP)。 |
审计 | 所有访问Registry服务的操作均被记录,便于日后审计。这个是个不错的特性。 |
管理界面 | 具有友好易用图形管理界面,使得操作更加容易 |
镜像复制 | 在实例之间复制镜像。 |
国际化 | 支持多种语言的实时切换 |
镜像安全扫描 | 这个的确是一个很好的特性,安全是容器云需要考虑的重要因素之一,而镜像仓库由于它对与镜像近水楼台的得天独厚的优势,harbor集成了clair的镜像扫描功能为其功能增色不少 |
其他特性
目前1.6.0-rc1中可以看到已经增加了对CNCF的Helm chart的支持,等版本稳定之后我们将再继续跟进和确认。
安装方式
harbor提供二进制安装包和源码编译两种方式,二进制安装包又分离线安装包和在线安装包两种。离线安装包把所有的需要用到的镜像都docker save到了一个tar文件中,在安装的时候在harbor的自动化脚本中使用docker load一次性的load进来。
安装
依赖事项
类型 | 依赖 | 说明 |
---|---|---|
硬件资源 | CPU | 最小2CPU,推荐4CPU |
硬件资源 | 内存 | 最小4G,推荐8G |
硬件资源 | 硬盘 | 最小40G,推荐160G |
软件资源 | python | 2.7以及以上 |
软件资源 | docker | 1.10以上 |
软件资源 | docker-compose | 1.6.0以上 |
软件资源 | openssl | 建议最新版本 |
网络端口 | 80 | http方式下的UI和API访问 |
网络端口 | 443 | https方式下的UI和API访问 |
网络端口 | 4443 | Notary方式时需要 |
安装步骤
Harbor提供了一键安装脚本install.sh基本上,下载安装包后就只是需要三步
步骤 | 说明 |
---|---|
步骤1 | 解压安装包:tar xvpf harbor-offline-installer-v1.5.2.tgz |
步骤2 | 设定harbor.cfg: cd harbor; vi harbor.cfg |
步骤3 | 以前安装并启动harbor:sh install.sh |
设定harbor.cfg
最简单的设定方式是设定一下hostname即可,但是整个harbor.cfg是用户直接接触到的唯一接口,harbor直接开放出来的设定均在此设定文件可进行设定:
required设定
此种类型参数特点是需要在设定文件中设定。生效的方式在修改后需要重新执行install.sh进行Harbor的重新安装。
设定项 | 说明 | 缺省值 | 备注 |
---|---|---|---|
hostname | IP或者可以转化为IP的FQDN | reg.mydomain.com | 必须设定, 安装时会确认使用者是否修改了reg.mydomain.com |
ui_url_protocol | http/https | http | 安装时使用Notary,此处必须使用https |
db_password | Harbor使用Mysql(Mariadb)进行数据存储,此项设定为root用户的密码,在使用db_auth的方式也会使用 | root123 | 生产环境建议修改 |
max_job_workers | 复制服务是可并行的worker数目 | 3 | 建议根据CPU等资源的能力进行设定 |
customize_crt | token设定 | on | 设定为on时,python的prepare脚本在安装时会创建root的证书作为私库的token。如果需要使用外部提供的token时可设定为off |
ssl_cert | SSL证书路径 | /data/cert/server.crt | 仅在https方式下有效 |
ssl_cert_key | SSL私钥路径 | /data/cert/server.key, | 仅在https方式下有效 |
secretkey_path | 复制策略下需要对远程仓库的密码进行加密或者解密所需要的私钥路径 | /data | - |
log_rotate_count | 日志备份轮转最大次数设定 | 50 | 如果设定为0,表示不进行日志备份 |
log_rotate_size | 日志备份轮转大小 | 200M | 日志达到此值后开始进行备份轮转(rotate),大小可以和K/M/G结合进行设定,比如10K/10M/10G |
Optional可选设定
相比较于前面的required设定,在harbor中Optional的设定的主要特点是在于不需要执行install.sh进行重新安装,而是通过页面即可设定,比如smtp相关的设定。
设定项 | 说明 | 缺省值 | 备注 |
---|---|---|---|
email_server | 邮件通知设定:smtp服务器 | smtp.mydomain.com | |
email_server_port | 邮件通知设定:smtp服务端口 | 25 | |
email_identity | 邮件通知设定:identity检查 | - | 详细可参看RFC2595 |
email_username | 邮件通知设定:发送邮件信息 | [email protected] | |
email_password | 邮件通知设定:密码 | abc | |
email_from | 邮件通知设定:邮件发送者显示信息 | admin <[email protected]> |
|
email_ssl | 邮件通知设定:ssl设定 | false | |
email_insecure | 邮件通知设定:非信任证书 | false | 缺省为false,当需要使用自签名或者非信任证书时设定为true |
harbor_admin_password | 管理员账户初始密码 | Harbor12345 | 缺省的管理员用户为admin,登录后可以通过UI进行密码修改 |
auth_mode | 认证模式:db_auth/ldap_auth/uaa_auth | db_auth | 缺省方式下uaa_auth会将密码信息保存在数据库中。升级时请务必保证认证模式不会发生变化,否则登录之后可能无法直接登录。 |
ldap_url | LDAP设定:连接用URL | ldaps://ldap.mydomain.com | LDAP相关设定仅在认证模式ldap_auth下使用 . |
ldap_searchdn | LDAP设定:DN | uid=admin,ou=people,dc=mydomain,dc=com | - |
ldap_search_pwd | LDAP设定:密码 | password | ldap_searchdn所使用到的密码信息 |
ldap_basedn | LDAP设定:basedn | ou=people,dc=mydomain,dc=com | - |
ldap_filter | LDAP设定:filter | (objectClass=person) | LDAP搜索时所用到的filter |
ldap_uid | LDAP设定:uid | uid | 搜索显示的属性信息,以逗号隔开各个属性,比如:uid, cn, email |
ldap_scope | LDAP设定:搜索层级 | 2 | 分为3个层级:0/1/2:0-LDAP_SCOPE_BASE, 1-LDAP_SCOPE_ONELEVEL, 2-LDAP_SCOPE_SUBTREE |
self_registration | 用户注册开关 | on | 缺省开放用户注册,关闭时只能通过管理员用户创建,当然认证方式为ladap时自然也是不能也无法进行用户注册的,不然就是后门了 |
token_expiration | token有效期 | 30 | 缺省为30分钟,时间单位为分钟 |
project_creation_restriction | 项目创建限制 everyone/adminonly | everyone | 设定为adminonly时只能通过admin来进行项目创建。 |
起效方式
需要注意的是optional的参数都可以通过UI来进行设定,但是初次是通过harbor.cfg来设定的,初次之后则需要修改设定文件方式则不再起效,之后的设定会被忽视。
认证方式
db_auth是特别需要确认清楚的一个选项,最好在开始的时候想清楚到底是LDAP还是直接使用harbor的本地数据库,一旦定了之后并且里面有除了admin之外的用户就没有办法再修改了。另外再升级的时候也无法进行变更认证方式。一旦有混合方式的需求或者变化的需求,使用者可能需要自行进行用户的迁移。
安装&启动
事前准备
[root@liumiao harbor]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@liumiao harbor]# docker version
Client:
Version: 1.13.1
API version: 1.26
Go version: go1.7.5
Git commit: 092cba3
Built: Wed Feb 8 08:47:51 2017
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Go version: go1.7.5
Git commit: 092cba3
Built: Wed Feb 8 08:47:51 2017
OS/Arch: linux/amd64
Experimental: false
[root@liumiao harbor]#
使用上述提示的信息进行下载/解压/设定自然就很快了
下载并解压
[root@liumiao local]# cd harbor/
[root@liumiao harbor]# ls
LICENSE common docker-compose.notary.yml ha harbor.v1.5.2.tar.gz open_source_license
NOTICE docker-compose.clair.yml docker-compose.yml harbor.cfg install.sh prepare
[root@liumiao harbor]#
修改harbor.cfg
设定项 | 缺省值 | 修改值 | 说明 |
---|---|---|---|
hostname | reg.mydomain.com | 192.168.163.128 | 192.168.163.128是此时试验的centos的ip |
harbor_admin_password | Harbor12345 | liumiaopw | 注意此密码不符合UI的密码检查,请使用复杂一点的密码 |
db_password | root123 | liumiaopw | 请设定为自己的密码 |
clair_db_password | password | liumiaopw | harbor集成的clair所用到的postgres的db的密码,在后续使用详细中展开介绍 |
[root@liumiao harbor]# egrep 'hostname|liumiaopw' harbor.cfg
#The IP address or hostname to access admin UI and registry service.
hostname = 192.168.163.128
harbor_admin_password = liumiaopw
db_password = liumiaopw
clair_db_password = liumiaopw
[root@liumiao harbor]#
安装&启动
软件依赖
harbor使用docker-compose作为基础,所以对本地的docker和docker-compose有如下版本依赖
依赖软件 | 版本需求 |
---|---|
docker | 1.10.0+ |
docker-compose | 1.7.1+ |
[root@liumiao harbor]# grep docker_version_part1 install.sh |grep if
if [ "$docker_version_part1" -lt 1 ] || ([ "$docker_version_part1" -eq 1 ] && [ "$docker_version_part2" -lt 10 ])
[root@liumiao harbor]#
[root@liumiao harbor]# grep docker_compose_version_part1 install.sh |grep if
if [ "$docker_compose_version_part1" -lt 1 ] || ([ "$docker_compose_version_part1" -eq 1 ] && [ "$docker_compose_version_part2" -lt 6 ])
[root@liumiao harbor]#
镜像名称
因为harbor使用docker-compose作为部署标准方式,并在其中指定了很容易重复的容器名字,当前机器上如果有使用如下容器的名称,请选择删除当前机器同名容器(registry/nginx/redis是最为容易重名),或者修改harbor的配置文件:
[root@liumiao harbor]# grep container_name docker-compose.yml
container_name: harbor-log
container_name: registry
container_name: harbor-db
container_name: harbor-adminserver
container_name: harbor-ui
container_name: harbor-jobservice
container_name: redis
container_name: nginx
[root@liumiao harbor]#
安装&启动
为了说明安装过程这里取第二次执行的清爽日志信息
[root@liumiao harbor]# sh install.sh
[Step 0]: checking installation environment ...
Note: docker version: 1.13.1
Note: docker-compose version: 1.13.0
[Step 1]: loading Harbor images ...
Loaded image: vmware/registry-photon:v2.6.2-v1.5.2
Loaded image: vmware/photon:1.0
Loaded image: vmware/mariadb-photon:v1.5.2
Loaded image: vmware/harbor-log:v1.5.2
Loaded image: vmware/nginx-photon:v1.5.2
Loaded image: vmware/notary-signer-photon:v0.5.1-v1.5.2
Loaded image: vmware/postgresql-photon:v1.5.2
Loaded image: vmware/harbor-db:v1.5.2
Loaded image: vmware/harbor-jobservice:v1.5.2
Loaded image: vmware/clair-photon:v2.0.4-v1.5.2
Loaded image: vmware/harbor-adminserver:v1.5.2
Loaded image: vmware/harbor-ui:v1.5.2
Loaded image: vmware/redis-photon:v1.5.2
Loaded image: vmware/notary-server-photon:v0.5.1-v1.5.2
Loaded image: vmware/harbor-migrator:v1.5.0
[Step 2]: preparing environment ...
Clearing the configuration file: ./common/config/adminserver/env
Clearing the configuration file: ./common/config/ui/env
Clearing the configuration file: ./common/config/ui/app.conf
Clearing the configuration file: ./common/config/ui/private_key.pem
Clearing the configuration file: ./common/config/db/env
Clearing the configuration file: ./common/config/jobservice/env
Clearing the configuration file: ./common/config/jobservice/config.yml
Clearing the configuration file: ./common/config/registry/config.yml
Clearing the configuration file: ./common/config/registry/root.crt
Clearing the configuration file: ./common/config/nginx/nginx.conf
Clearing the configuration file: ./common/config/log/logrotate.conf
loaded secret from file: /data/secretkey
Generated configuration file: ./common/config/nginx/nginx.conf
Generated configuration file: ./common/config/adminserver/env
Generated configuration file: ./common/config/ui/env
Generated configuration file: ./common/config/registry/config.yml
Generated configuration file: ./common/config/db/env
Generated configuration file: ./common/config/jobservice/env
Generated configuration file: ./common/config/jobservice/config.yml
Generated configuration file: ./common/config/log/logrotate.conf
Generated configuration file: ./common/config/jobservice/config.yml
Generated configuration file: ./common/config/ui/app.conf
Generated certificate, key file: ./common/config/ui/private_key.pem, cert file: ./common/config/registry/root.crt
The configuration files are ready, please use docker-compose to start the service.
[Step 3]: checking existing instance of Harbor ...
[Step 4]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ...
Creating harbor-log ... done
Creating harbor-db ...
Creating redis ...
Creating harbor-adminserver ...
Creating registry ...
Creating harbor-db
Creating harbor-adminserver
Creating redis
Creating redis ... done
Creating harbor-db ... done
Creating harbor-ui ... done
Creating nginx ...
Creating harbor-jobservice ...
Creating nginx
Creating nginx ... done
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at http://192.168.163.128.
For more details, please visit https://github.com/vmware/harbor .
[root@liumiao harbor]#
所以非常清楚地看到整个流程,确认docker和compose的版本,然后进行load镜像,之后进行配置文件的生成,这个过程是common/template下的文件为基础结合设定的harbor.cfg生成common/config下的文件,之后就是使用docker-compose的up命令启动harbor与相关容器了
[root@liumiao harbor]# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver /harbor/start.sh Restarting
harbor-db /usr/local/bin/docker-entr ... Up 3306/tcp
harbor-jobservice /harbor/start.sh Up
harbor-log /bin/sh -c /usr/local/bin/ ... Up 127.0.0.1:1514->10514/tcp
harbor-ui /harbor/start.sh Up
nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp
redis docker-entrypoint.sh redis ... Up 6379/tcp
registry /entrypoint.sh serve /etc/ ... Up 5000/tcp
[root@liumiao harbor]#
使用admin/liumiaopw就可以登录了
docker login
事前准备
因为这里使用的是缺省的http方式,所以需要在dockerd的设定中设定insecure-registry
/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock --selinux-enabled=false --insecure-registry 192.168.163.128 --log-opt max-size=1g
docker login
[root@liumiao ~]# docker login 192.168.163.128
Username (admin): admin
Password:
Login Succeeded
[root@liumiao ~]#
docker push
初期启动之后,harbor就会有一个名为library的public的project,我们这里向这里面推送一个busybox的镜像
[root@liumiao ~]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
Digest: sha256:cb63aa0641a885f54de20f61d152187419e8f6b159ed11a251a09d115fdff9bd
Status: Image is up to date for busybox:latest
[root@liumiao ~]#
[root@liumiao ~]# docker tag busybox 192.168.163.128/library/busybox:latest
[root@liumiao ~]# docker push 192.168.163.128/library/busybox:latest
The push refers to a repository [192.168.163.128/library/busybox]
f9d9e4e6e2f0: Pushed
latest: digest: sha256:19fca0f4a812d0ba4ad89a4c345ce660ecc7c14c1ce9a9c12ac9db1ca62b4602 size: 527
[root@liumiao ~]#
docker pull
从harbor私库中拉取镜像
[root@liumiao ~]# docker pull 192.168.163.128/library/busybox:latest
latest: Pulling from library/busybox
Digest: sha256:19fca0f4a812d0ba4ad89a4c345ce660ecc7c14c1ce9a9c12ac9db1ca62b4602
Status: Image is up to date for 192.168.163.128/library/busybox:latest
[root@liumiao ~]#
可以看到push和pull操作的日志记录
总结
这篇文章整理了harbor使用中的设定方式,以及最基础的login/push/pull的基本操作,接下来的文章中会继续介绍一下harbor的运行机制和其他的一些知识。