docker基础:私库系列:再探Harbor:(1) 安装&设定

这里写图片描述
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进来。

参照内容 link
二进制包 https://github.com/goharbor/harbor/releases
安装文档 https://github.com/vmware/harbor/blob/master/docs/installation_guide.md
用户使用说明 https://github.com/vmware/harbor/blob/master/docs/installation_guide.md
1.5.2离线安装包 https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.5.2.tgz

安装

依赖事项

类型 依赖 说明
硬件资源 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的运行机制和其他的一些知识。

猜你喜欢

转载自blog.csdn.net/liumiaocn/article/details/81805063