Docker系列(六):Harbor(一)
简介
Registry只能通过API进行管理,然而第三方开发了一些开源的平台来作为私有镜像库管理(类似于github),可以对用户、权限、镜像库及镜像进行管理,并且有图形化的界面,方便使用。
开源管理平台
开源的私有库的管理平台不是很多(可能是我没找到),主要看到2个,一个是SUSE的Portus,另一个是VMWare的Harbor。这里只介绍Harbor的部署及应用。
Harbor
Harbor是用于存储和分发Docker镜像的企业级Registry服务器,具有以下功能和特性:
- 基于角色的权限控制: 用户和docker镜像库通过”项目”关联在一起,一个用户在同一个命名空间下可以有不同的权限。
- 镜像复制: 多个Registry实例之间可以进行镜像复制,可以用于负载均衡,高可用及混合多用的场景。
- 用户图形化接口: 用户可以通过图形化界面更轻松的浏览和搜索docker仓库,管理项目和命名空间。
- 支持AD/LDAP: Harbor支持商业的AD/LDAP的用户认证及管理。
- 审计: 所有对于镜像库的操作都是可以被追踪的并可以被审计。
- 国际化: 已经支持英语、中文、德语、日语和俄语。
- RESTful API: Harbor大部分的管理操作已经提供了RESTful API。
- 部署方便: 提供了在线和离线的安装方式。
安装包
- 在线安装包: 在线安装包会从Docker公共库下载Harbor的镜像,因此在线安装包会很小。
- 离线安装包: 如果主机无法连接到互联网,可以使用离线安装包,离线安装包包含了每一个镜像的构建,所以这个安装包会很大。
安装准备
Harbor是使用镜像通过Docker容器部署的,因此需要系统支持Docker。主机需要Python,Docker及Docker Compose。
- Python版本需要2.7版本或更高版本。
- Dockery引擎需要1.10或更高版本。(Docker安装)
- Docker Compose需要1.6.0或更高版本。
安装
安装过程为以下几步:
- 下载安装包;
- 配置
harbor.cfg
; - 运行
install.sh
安装并运行Harbor;
1. 下载安装包
从官方发布地址下载安装包,选择在线或离线的安装包。使用tar
命令解压缩这个包。(本文档都是使用离线包进行安装。)
在线包:
$ tar -xzvf harbor-online-installer-<version>.tgz
离线包:
$ tar -xzvf harbor-offline-installer-<version>.tgz
2. 配置Harbor
harbor.cfg
中包含了配置项。
在harbor.cfg
中有2部分配置项,必须配置和可选配置。
- 必须配置: 这些配置是必须在配置文件中进行配置的。如果用户更新
harbor.cfg
中的这些配置将且运行install.sh
脚本的时候会重新安装Harbor,这些配置将会立即生效。 - 可选配置: 这些配置是可选的,用户可以使用这些默认的配置,也可以在启动Harbor后通过Web UI进行配置。如果可选配置在
harbor.cfg
中更新了,这些配置只在Harbor第一次启动的时候生效。之后在harbor.cfg
中更新这些配置就不会生效了。
注意: 如果选择通过UI来配置可选项,需要确认Harbor已经启动后,再去进行配置。在可选配置中,有一个特殊的配置项,auth_mode
必须在注册用户或创建新用户之前配置成需要的认证模式。如果系统中已经存在用户(admin用户除外),auth_mode
是不能被修改的。
必须配置项:
- hostname: 运行Harbor的服务器的hostname,用于访问UI和提供Registry服务。 这个配置可以是IP地址或者是域名,
10.0.100.2
或者test-harbor.test.com
。不要使用localhost
或者127.0.0.1
,因为Registry服务需要被其它客户端访问。 - ui_url_protocol: (值可以是http或者https,默认为http)这个协议用于访问UI和token/notification服务。如果认证被启用,这个配置必须是https。设置https协议后面会有文档详细说明。
- db_passwd: MySQL数据库root的密码,用于db_auth。
- max_job_wokers: (默认值为3) 这个作业服务器启动复制进程的数量。 每个镜像的复制作业会有1个进程同步1个库的所有标签到远程目标。 增加这个数值可以启动多个进程同时进行复制作业。但是,因为每个进程会消耗一定的网络/CPU/IO资源,请根据主机硬件资源谨慎设置这个配置。
- customize_crt:(on 或者 off, 默认为on) 当这个配置项为 on时,安装脚本会创建用于生成/验证库的
token
的私钥和根证书。 当私钥和根证书是通过其它来源提供时(从第三方机构购买的证书)设置此配置项为 off 。 - ssl_cert: SSL证书(
cert
)的路径, 仅当协议设置为https
时这个配置项会被应用。 - ssl_cert_key: SSL私钥(
key
)的路径, 仅当协议设置为https
时这个配置项会被应用。 - secretkey_path: 在复制规则中用于加解密一个远程库的密码的私钥(
key
)的路径。 - log_rotate_count: 日志文件被轮转 log_rotate_count 次后被删除。 如果这个配置项是
0
,旧的日志不会被轮转,而是直接删除。 - log_rotate_size: 只有当日志文件增长到大于 log_rotate_size (字节)时,日志文件才会被轮转。如果这个值后面跟随
k
,这个值被认为是KB
; 如果是M
, 就被认为是MB
;如果是G
,就被认为是GB
。所以,这个值是100
、100K
、100M
和100G
都是合法的。
可选配置项:
- Email settings: 这个配置项用于给用户发送密码重置邮件。注意,SSL连接默认是不启用的,如果你的SMTP服务器需要SSL,并且不支持
STARTTLS
,需要通过设置 email_ssl = true 来支持SSL。如果email服务器使用了一个自签名证书或者未授权的证书,需要配置 email_insecure = true 。 对于”email_identity”的详细描述请查看rfc2595。
例:
email_server = smtp.mydomain.com
email_server_port = 25
email_identity =
email_username = sample_admin@mydomain.com
email_password = abc
email_from = admin sample_admin@mydomain.com
email_ssl = false
email_insecure = falseemail_server = smtp.mydomain.com
email_server_port = 25
email_identity =
email_username = sample_admin@mydomain.com
email_password = abc
email_from = admin sample_admin@mydomain.com
email_ssl = false
email_insecure = false
- harbor_admin_password : 管理员初始密码。 这个密码仅仅是第一次安装并启动Harbor时有效。 之后再次启动时这个配将会被忽略,管理员密码在UI中可以被修改。注意, 默认的用户名/密码是 admin/Harbor12345。
- auth_mode: 认证模式。默认为 db_auth , 认证信息存储到数据库中。对于LDAP认证, 需要设置 ldap_auth 。
注意: 当升级已有的Harbor实例的时候,在升级启动新版本的Harbor之前确认 auth_mode 配置与harbor.cfg
中的配置相同。否者,已有用户无法在升级后登录系统。
- ldap_url: LDAP服务的URL(如:
ldaps://ldap.yourdomain.com
)。 仅当 auth_mode 选项被设置为ldap_auth时,此配置项生效。 - ldap_searchdn: 一个有搜索LDAP/AD服务器权限的用户的DN(如: `uid=admin,ou=people,dc=yourdomain,dc=com)。
- ldap_search_pwd: ldap_searchdn配置指定的用户的密码。
- ldap_basedn: 查找用户的基础DN,如:
ou=people,dc=yourdomain,dc=com
。仅当 auth_mode 选项被设置为ldap_auth时,此配置项生效。 - ldap_filter: 用于搜索用户的查询过滤器(如:
objectClass=person
)。 - ldap_uid: 这个属性用于在LDAP检索过程中去匹配用户,可以是uid, cn, email或者其它的属性。
- ldap_scope: 搜索用户的范围,值及含义为: 1-LDAP_SCOPE_BASE, 2-LDAP_SCOPE_NOLEVEL, 3-LDAP_SCOPE_SUBTREE。默认为3。
- self_registration: (on 或 off。默认为 on) 是否允许用户自己进行注册。当不允许用户自助注册时, 新用户只能由管理员来创建, 在Harbor中只有一个管理员可以创建新用户。 _注意:当 atuh_mode被设置为 ldap_auth 时,用户自助注册的功能会自动被关闭,这个配置项将被忽略。_
- token_expiration: token服务创建的token超时的时间(分钟), 默认为30分钟。
- project_creation_restriction: 这个配置项控制用户是否有权限去创建项目。默认每个人都可以创建项目,设置为”adminonly”为只有管理员可以创建项目。
配置存储(可选项)
默认情况下,Harbor会将镜像存储到本地文件系统。 但在某些环境中,你可能考虑使用其他的后端存储来代替本地文件系统,比如: S3, OpenStack Swift, Ceph等。 你可以通过更新配置文件common/templates/registry/config.yml
中storage
这个配置段来更改后端存储。例如,你使用OpenStack Swift作为你后端的存储,这个配置段的配置如下:
storage:
swift:
username: admin
password: ADMIN_PASS
authurl: http://keystone_addr:35357/v3/auth
tenant: admin
domain: default
region: regionOne
container: docker_images
注意: 对于镜像库的后端存储的详细信息请参见: Docker Registry配置说明
完成安装并启动Harbor
完成 harbor.cfg 与存储配置(可选配置项)的配置, 使用install.sh
脚本完成安装并启动。注意,对于在线安装可能要花费一些时间从Docker hub下载镜像。 Harbor需要使用Docker Compose启动,请在运行install.sh
脚本前安装,请参考: Docker Compose安装说明。
$ ./install.sh
[Step 0]: checking installation environment ...
Note: docker version: 17.06.2
Note: docker-compose version: 1.17.0
[Step 1]: loading Harbor images ...
c5c1f3d43c8b: Loading layer [==================================================>] 135.4MB/135.4MB
62f93b2c84e5: Loading layer [==================================================>] 72.99MB/72.99MB
72842e5a36df: Loading layer [==================================================>] 3.584kB/3.584kB
478e65478cba: Loading layer [==================================================>] 3.072kB/3.072kB
59b789abf78f: Loading layer [==================================================>] 4.096kB/4.096kB
004c30d5e900: Loading layer [==================================================>] 3.584kB/3.584kB
30c3b4c78f76: Loading layer [==================================================>] 10.24kB/10.24kB
Loaded image: vmware/harbor-log:v1.3.0-rc1
454c81edbd3b: Loading layer [==================================================>] 135.2MB/135.2MB
bab81b4d4981: Loading layer [==================================================>] 463.7MB/463.7MB
5735a75e540c: Loading layer [==================================================>] 9.216kB/9.216kB
44394f38b0c9: Loading layer [==================================================>] 9.216kB/9.216kB
13775ef23512: Loading layer [==================================================>] 7.68kB/7.68kB
9d8d34eb8c97: Loading layer [==================================================>] 1.536kB/1.536kB
94af0237e276: Loading layer [==================================================>] 9.216kB/9.216kB
f1a95e05d345: Loading layer [==================================================>] 2.56kB/2.56kB
3ca7ba769253: Loading layer [==================================================>] 3.072kB/3.072kB
Loaded image: vmware/harbor-db:v1.3.0-rc1
e4813ce65d72: Loading layer [==================================================>] 23.21MB/23.21MB
3491428eff72: Loading layer [==================================================>] 18.33MB/18.33MB
22355de6ca70: Loading layer [==================================================>] 18.33MB/18.33MB
Loaded image: vmware/harbor-jobservice:v1.3.0-rc1
11a7546bc950: Loading layer [==================================================>] 90.74MB/90.74MB
cd2cb03dfead: Loading layer [==================================================>] 12.16MB/12.16MB
fdcb5fa28b07: Loading layer [==================================================>] 17.3MB/17.3MB
eef410f82bbe: Loading layer [==================================================>] 15.87kB/15.87kB
938e5e2a4bad: Loading layer [==================================================>] 3.072kB/3.072kB
558c91f2870a: Loading layer [==================================================>] 3.072kB/3.072kB
Loaded image: vmware/notary-photon:server-0.5.1
0e1b40dbb3d2: Loading layer [==================================================>] 10.95MB/10.95MB
58127bdab8e5: Loading layer [==================================================>] 17.3MB/17.3MB
2e3e9ac4492d: Loading layer [==================================================>] 15.87kB/15.87kB
bd6c57401b0f: Loading layer [==================================================>] 3.072kB/3.072kB
08a6f4315b6a: Loading layer [==================================================>] 3.072kB/3.072kB
Loaded image: vmware/notary-photon:signer-0.5.1
e99db1275091: Loading layer [==================================================>] 395.4MB/395.4MB
051e4ee23882: Loading layer [==================================================>] 9.216kB/9.216kB
6cca4437b6f6: Loading layer [==================================================>] 9.216kB/9.216kB
1d48fc08c8bc: Loading layer [==================================================>] 7.68kB/7.68kB
0419724fd942: Loading layer [==================================================>] 1.536kB/1.536kB
92ce53616a73: Loading layer [==================================================>] 599.2MB/599.2MB
2004244b53a2: Loading layer [==================================================>] 74.24kB/74.24kB
Loaded image: vmware/harbor-db-migrator:1.3
c116153f561a: Loading layer [==================================================>] 23.21MB/23.21MB
d82c9a7f1bce: Loading layer [==================================================>] 7.071MB/7.071MB
75e273c18f2a: Loading layer [==================================================>] 7.071MB/7.071MB
Loaded image: vmware/harbor-adminserver:v1.3.0-rc1
Loaded image: vmware/photon:1.0
Loaded image: vmware/mariadb-photon:10.2.10
eecd294cdc4d: Loading layer [==================================================>] 23.21MB/23.21MB
848ebb86cbdd: Loading layer [==================================================>] 22.71MB/22.71MB
75c57475cadf: Loading layer [==================================================>] 7.168kB/7.168kB
3dd4619c78ff: Loading layer [==================================================>] 5.381MB/5.381MB
757114e3e191: Loading layer [==================================================>] 22.7MB/22.7MB
Loaded image: vmware/harbor-ui:v1.3.0-rc1
cd0c2ef5af40: Loading layer [==================================================>] 72.46MB/72.46MB
Loaded image: vmware/nginx-photon:1.11.13
7280dd18d4e6: Loading layer [==================================================>] 90.74MB/90.74MB
29de07437cda: Loading layer [==================================================>] 2.048kB/2.048kB
bf435791a668: Loading layer [==================================================>] 2.048kB/2.048kB
ea6923ed1a8e: Loading layer [==================================================>] 2.048kB/2.048kB
b39969acb12a: Loading layer [==================================================>] 3.072kB/3.072kB
a07efc1d5b07: Loading layer [==================================================>] 22.8MB/22.8MB
Loaded image: vmware/registry:2.6.2-photon
fe75aea3eba7: Loading layer [==================================================>] 221.3MB/221.3MB
50b4cd38d514: Loading layer [==================================================>] 10.75MB/10.75MB
5ffc09e42afb: Loading layer [==================================================>] 2.048kB/2.048kB
ee0b77dfb8f1: Loading layer [==================================================>] 48.13kB/48.13kB
f1f5fc6c106a: Loading layer [==================================================>] 10.8MB/10.8MB
Loaded image: vmware/clair:v2.0.1-photon
418e636d0b27: Loading layer [==================================================>] 161.5MB/161.5MB
fb804e98cb47: Loading layer [==================================================>] 6.656kB/6.656kB
d961645df25c: Loading layer [==================================================>] 6.656kB/6.656kB
Loaded image: vmware/postgresql:9.6.5-photon
[Step 2]: preparing environment ...
Generated and saved secret to 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/log/logrotate.conf
Generated configuration file: ./common/config/jobservice/app.conf
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-adminserver ...
Creating registry ...
Creating harbor-db ...
Creating harbor-adminserver
Creating harbor-db
Creating registry ... done
Creating harbor-db ... done
Creating harbor-ui ... done
Creating harbor-jobservice ...
Creating nginx ...
Creating harbor-jobservice
Creating nginx ... done
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at http://reg.youerdomain.com.
For more details, please visit https://github.com/vmware/harbor .
如果所有组件都已经开始工作,你可以启动浏览器访问管理页面”http://reg.yourdomain.com“ 。 注意,默认的管理员用户名/密码是admin/Harbor12345。
登录到管理页面并创建一个新的工程,如myproject
。之后可用用docker命令登录并推送image(默认的Registry的服务监听在80端口)。
具体登录及推送过程和使用Docker Registry一样,不再具体演示了。
3. 管理Harbor
可以使用docker-compose管理Harbor启停。 下面列出一些常用的命令(必须在与docker-compose.yml
同级目录下运行)。
停止Harbor:
$ docker-compose stop
Stopping nginx ... done
Stopping harbor-jobservice ... done
Stopping harbor-ui ... done
Stopping harbor-db ... done
Stopping registry ... done
Stopping harbor-log ... done
重新再启动Harbor:
$ docker-compose start
Starting log ... done
Starting ui ... done
Starting mysql ... done
Starting jobservice ... done
Starting registry ... done
Starting proxy ... done
如果需要改变Harbor的配置,先停止已经存在的实例,然后更新harbor.cfg
。 运行prepare
脚本去更改配置文件。 最后重建并启动Harbor实例:
$ docker-compose down -v #-v 参数是停止容器后直接删除容器
$ vim harbor.cfg
$ ./prepare
$ docker-compose up -d #-d 是通过分离(后台)模式启动
只删除Harbor系统的容器,保留镜像数据及Harbor的数据库文件:
$ docker-compose down -v
删除Harbor的数据及镜像文件(用于清理后重新安装):
$ rm -rf /data/database
$ rm -rf /data/registry
注意:如重新安装,建议将/data目录下所有文件清空,有些配置保存在/data/config
中,并不会随重新安装而改变。