目录
1、案例概述
2、什么是 Harbor
3、Harbor 架构构成
4、案例环境
5、部署harbor环境
安装docker-ce(所有主机)
阿里云镜像加速器
部署Docker Compose 服务
部署 Harbor 服务
启动并安装 Harbor
创建一个新项目
6、客户端上传镜像
7、Harbor 日常操作管理
1、通过 Harbor Web 创建项目
2、创建 Harbor 用户
3、管理 Harbor
1、案例概述
Docker 官方镜像仓库是用于管理公共镜像的地方,大家可以在上面找到想要的镜像,也可以把自己的镜像推送上去。但是有时候服务器无法访问互联网,或者不希望将自己的镜像放到互联网上,那么就需要用到 Docker Registry 私有仓库,它可以用来存储和管理自己的镜像。最近公司将项目全部打包成镜像有部署私有仓库服务的需求,经过几轮商讨,最终选择 Docker Harbor,Docker Harbor 有可视化的 Web 管理界面可以方便管理Docker 镜像操作也很方便简单,又提供了多个项目的镜像权限管理控制功能等。
2、什么是 Harbor
Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 仓库服务。它以Docker公司开源的Registry为基础,提供了管理 UI。基于角色的访问控制(Role Based AccessControl)、AD/LDAP集成、以及审计日志 (Auditlogging) 等企业用户需求的功能。通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全,以提升用户使用 Registry 构建和运行环境传输镜像的效率。
Harbor 的优势
- 基于角色控制:用户和仓库都是基于项目进行组织的,而用户基于项目可以拥有不同的权限。
- 基于镜像的复制策略: 镜像可以在多个 Harbor 实例之间进行复制(同步)。适用于负载平衡、高可用性、多数据中心、混合和多云场景。
- 支持 LDAP / AD:Harbor 与现有的企业 LDAP / ADA 集成,用于用户认证和管理。
- 图像删除和垃圾收集:镜像可以被删除,也可以回收镜像占用的空间。
- 图形 UI:用户可以轻松浏览、搜索镜像仓库以及对项目进行管理。
- 审计: 对存储库的所有操作都进行记录。
- RESTful API:用于大多数管理操作的 RESTful API,易于与外部系统集成。
3、Harbor 架构构成
1、Proxy:Harbor 的 Registry、UI、token 等服务。通过一个前置的反向代理统一接收浏览器Docker 客户端的请求,并将请求转发给后端不同的服务。
2、Registry:负责储存Docker镜像,并处理 Docker push/pull 命令。由于要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个 token服务,强制用户的每次 Docker pull/push 请求都要携带一个合法的token,Registry会通过公钥对 token 进行解密验证。
3、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进行请求。
4、Database(Harbor-db):为 core services 提供数据库服务,负责储存用户权限、审计日志、Docker image 分组信息等数据。
5、Log collector(Harbor-log):为了帮助监控 Harbor 运行,负责收集其他组件的log,供日后进行分析。
Harbor的每个组件都是以Docker容器的形式构建的,因此,使用Docker Compose 来 对它进行部署。在源代码中(https://github.com/vmware/Harbor), 用于部署Harbor的Docker Compose 模板位于 Harbor/make/docker-compose.tpl。
4、案例环境
主机规划
操作系统 | 主机名 | IP地址 | 软件 |
CentOS7.x | master | 192.168.2.118 | docker-ce、docker-compose、Harbor-offline |
CentOS7.x | slave | 192.168.2.117 | docker-ce、docker-compose、Harbor-offline |
CentOS7.x | ldns-nfs | 192.168.2.116 | docker-ce、mysql、redis、postgres 、nfs、bind |
拓扑图
架构隐患:
- NFS有单点问题
- 镜像太多导致占用大量的磁盘空间及镜像访问时磁盘IO过大
解决方案:
1、 NFS做成高可用NFS+DRBD+Heartbeat
2、 存储使用分布式文件系统(GlusterFS)
3、Harbor支持主从复制(双向)+Keepalived
5、部署harbor环境
安装docker-ce(所有主机)
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo[root@localhost ~]# ls /etc/yum.repos.d/backup Centos-aliyun.repo CentOS-Media.repo docker-ce.repo[root@localhost ~]# yum -y install docker-ce[root@localhost ~]# systemctl start docker[root@localhost ~]# systemctl enable docker
阿里云镜像加速器
阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台欢迎登录阿里云,全球领先的云计算及人工智能科技公司,阿里云为200多个国家和地区的企业、开发者和政府机构提供云计算基础服务及解决方案。阿里云云计算、安全、大数据、人工智能、企业应用、物联网等云计算服务。https://cr.console.aliyun.com/
[root@localhost ~]# cat << END > /etc/docker/daemon.json{"registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]
}
END[root@localhost ~]# systemctl daemon-reload[root@localhost ~]# systemctl restart docker[root@localhost ~]# docker versionClient: Docker Engine - CommunityVersion: 19.03.8API version: 1.40Go version: go1.12.17Git commit: afacb8bBuilt: Wed Mar 11 01:27:04 2020OS/Arch: linux/amd64Experimental: falseServer: Docker Engine - CommunityEngine:Version: 19.03.8API version: 1.40 (minimum version 1.12)Go version: go1.12.17Git commit: afacb8bBuilt: Wed Mar 11 01:25:42 2020OS/Arch: linux/amd64Experimental: falsecontainerd:Version: 1.2.13GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429runc:Version: 1.0.0-rc10GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dddocker-init:Version: 0.18.0GitCommit: fec3683
部署Docker Compose 服务
Docker-Compose提取链接:https://pan.baidu.com/s/1QBi4pzSC-4S1QtUAW1pfmw?pwd=dovj
提取码:dovj
上传Docker-Compose(两台harbor主机)
[root@master ~]# rz -E
rz waiting to receive.[root@master ~]# mv docker-compose /usr/local/bin/[root@master ~]# chmod +x /usr/local/bin/docker-compose
查看 Docker-Compose 版本判断安装是否成功
[root@master ~]# docker-compose --version
docker-compose version 1.21.1, build 5a3f1a3
部署 Harbor 服务
Harbor 被部署为多个 Docker 容器,因此可以部署在任何支持 Docker 的 Linux 发行版上。目标主机需要安装 Python、Docker 和 Docker Compose。
Harbor提取链接:https://pan.baidu.com/s/1VoNjocGt_ho7CJRL1DVsPQ?pwd=q8xu
提取码:q8xu
上传Harbor 安装程序(两台harbor主机)
[root@master ~]# rz -E
rz waiting to receive.[root@master ~]# tar xf harbor-offline-installer-v1.6.1.tgz [root@master ~]# mv harbor/ /usr/local/
配置 Harbor 参数文件
配置参数位于文件/usr/local/harbor/harbor.cfg 中。安装之前需要修改IP地址。
[root@master ~]# vim /usr/local/harbor/harbor.cfg7 hostname = 192.168.2.118
关于 Harbor.cfg 配置文件中有两类参数,所需参数和可选参数。
1、所需参数:这些参数需要在配置文件 Harbor.cfg 中设置。如果用户更新它们并运行 install.sh 脚本重新安装 Harbor,参数将生效。具体参数如下:
- hostname:用于访问用户界面和 register 服务。它应该是目标机器的 IP 地址或完全限定的域名(FQDN),例如 192.168.200.111或 www.crushlinux.com。不要使用 localhost 或 127.0.0.1 为主机名。
- ui_url_protocol:(http 或 https,默认为 http)用于访问 UI 和令牌/通知服务的协议。如果公证处于启用状态,则此参数必须为 https。
- max_job_workers:镜像复制作业线程。
- db_password:用于 db_auth 的 MySQL 数据库 root 用户的密码。
- customize_crt:打开或关闭,默认打开。打开此属性时,准备脚本创建私钥和根证书,用于生成/验证注册表令牌。当由外部来源提供密钥和根证书时,将此属性设置为 off。
- ssl_cert:SSL 证书的路径,仅当协议设置为 https 时才应用。
- ssl_cert_key:SSL 密钥的路径,仅当协议设置为 https 时才应用。
- secretkey_path:用于在复制策略中加密或解密远程 register 密码的密钥路径。
2、可选参数:这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动时生效,随后对这些参数的更新,Harbor.cfg 将被忽略。
注意:如果选择通过 UI 设置这些参数,请确保在启动 Harbour 后立即执行此操作。具体来说,必须在注册或在 Harbor 中创建任何新用户之前设置所需的 auth_mode。当系统中有用户时(除了默认的 admin 用户), auth_mode 不能被修改。具体参数如下:
- 电子邮件设置:Harbor 需要这些参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能时才需要。请注意,在默认情况下 SSL 连接时没有启用。如果SMTP 服务器需要 SSL,但不支持 STARTTLS,那么应该通过设置启用 SSL email_ssl = TRUE。
- harbor_admin_password:管理员的初始密码,只在 Harbour 第一次启动时生效。之后,此设置将被忽略,并且应在 UI 中设置管理员的密码。请注意,默认的用户名/密码是 admin/Harbor12345。
- auth_mode:使用的认证类型,默认情况下,它是 db_auth,即凭据存储在数据库中。对于 LDAP 身份验证,请将其设置为 ldap_auth。
- self_registration:( 打开或关闭,默认打开)启用/禁用用户注册功能。禁用时,新用户只能由 Admin 用户创建,只有管理员用户可以在 Harbour 中创建新用户。注意:当 auth_mode 设置为 ldap_auth 时,自注册功能将始终处于禁用状态,并且该标志被忽略。
- token_expiration:由令牌服务创建的令牌的到期时间(分钟),默认为 30 分钟。
- project_creation_restriction:用于控制哪些用户有权创建项目的标志。默认情况下,每个人都可以创建一个项目。如果将其值设置为“adminonly”,那么只有admin 可以创建项目。
- verify_remote_cert:打开或关闭,默认打开。此标志决定了当 Harbour 与远程register 实例通信时是否验证 SSL/TLS 证书。将此属性设置为 off 将绕过 SSL/TLS验证,这在远程实例具有自签名或不可信证书时经常使用。
另外,默认情况下Harbor 将镜像存储在本地文件系统上。在生产环境中,可以考虑使用其他存储后端而不是本地文件系统,如 S3、Openstack Swif、Ceph 等。需要更新 common/templates/registry/config.yml 文件。
启动并安装 Harbor
配置完成就可以启动 Harbor 了,如下操作:
[root@master ~]# sh /usr/local/harbor/install.sh
查看 Harbor 启动镜像
[root@master ~]# cd /usr/local/harbor/[root@master harbor]# docker-compose psName Command State Ports
-------------------------------------------------------------------------------------
harbor-adminserver /harbor/start.sh Up (healthy)
harbor-db /entrypoint.sh postgres Up (healthy) 5432/tcp
harbor-jobservice /harbor/start.sh Up
harbor-log /bin/sh -c Up (healthy) 127.0.0.1:1514->10514/t/usr/local/bin/ ... cp
harbor-ui /harbor/start.sh Up (healthy)
nginx nginx -g daemon off; Up (healthy) 0.0.0.0:443->443/tcp,:::443->443/tcp, 0.0.0.0:4443->4443/tcp,:::4443->4443/tcp, 0.0.0.0:80->80/tcp,:::80->80/tcp
redis docker-entrypoint.sh Up 6379/tcp redis ...
registry /entrypoint.sh Up (healthy) 5000/tcp /etc/regist ...
如果一切都正常,应该可以打开浏览器访问 http://192.168.2.118的管理页面,默认的管理员用户名和密码是 admin/Harbor12345。
至此, Harbor已经搭建完成,具体在WEB UI下面操作也是非常的简单,只有几个选项。
创建一个新项目
- 输入用户名和密码登录界面后可以创建一个新项目。点击“+项目”按钮。
2)填写项目名称为“myproject-crushlinux”。
3)点击“确定”按钮,成功创建
4)可以使用 Docker 命令在Harbor本地通过 127.0.0.1 来登录和推送镜像了。默认情况下, Register 服务器在端口 80 上侦听。
5)登录 Harbor
[root@master ~]# docker login -u admin -p Harbor12345 http://127.0.0.1WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
6)下载体积小点的镜像进行测试。
[root@master ~]# docker pull cirrosUsing default tag: latest
latest: Pulling from library/cirros
d0b405be7a32: Pull complete
bd054094a037: Pull complete
c6a00de1ec8a: Pull complete
Digest: sha256:1e695eb2772a2b511ccab70091962d1efb9501fdca804eb1d52d21c0933e7f47
Status: Downloaded newer image for cirros:latest
docker.io/library/cirros:latest
7)镜像打 tag。
[root@master ~]# docker tag cirros 127.0.0.1/myproject-crushlinux/cirros:v1
8)上传镜像到 Harbor。
[root@master ~]# docker push 127.0.0.1/myproject-crushlinux/cirros:v1The push refers to repository [127.0.0.1/myproject-crushlinux/cirros]
984ad441ec3d: Pushed
f0a496d92efa: Pushed
e52d19c3bee2: Pushed
v1: digest: sha256:483f15ac97d03dc3d4dcf79cf71ded2e099cf76c340f3fdd0b3670a40a198a22 size: 943
9)在 Harbor 界面 myproject-crushlinux目录下就可以看见这个镜像,以及这个镜像的一些信息。
6、客户端上传镜像
以上操作都是在master 服务器本地操作,如果其他客户端上传镜像到 Harbor,就会报如下错误。出现这问题的原因是 Docker 自从 1.3.X 之后 Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以下错误。
[root@dns-nfs ~]# docker login -u admin -p Harbor12345 http://192.168.2.118WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://192.168.2.118/v2/": dial tcp 192.168.2.118:443: connect: connection refused
1) 在 Docker 客户端配置操作如下:
解决办法是:在 Docker server 启动的时候,增加启动参数,默认使用 HTTP 访问
[root@dns-nfs ~]# vim /usr/lib/systemd/system/docker.service 13 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.2.118
2)重启 Docker,再次登录
[root@dns-nfs ~]# systemctl daemon-reload
[root@dns-nfs ~]# systemctl restart docker
3)再次登录 Harbor
[root@dns-nfs ~]# docker login -u admin -p Harbor12345 192.168.2.118WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
4)下载体积小一点的镜像进行测试
[root@dns-nfs ~]# docker pull cirrosUsing default tag: latest
latest: Pulling from library/cirros
d0b405be7a32: Pull complete
bd054094a037: Pull complete
c6a00de1ec8a: Pull complete
Digest: sha256:1e695eb2772a2b511ccab70091962d1efb9501fdca804eb1d52d21c0933e7f47
Status: Downloaded newer image for cirros:latest
docker.io/library/cirros:latest
5)镜像打标签及上传到 myproject-crushlinux 项目里面
[root@dns-nfs ~]# docker tag cirros 192.168.2.118/myproject-crushlinux/cirros:v2[root@dns-nfs ~]# docker push 192.168.2.118/myproject-crushlinux/cirros:v2The push refers to repository [192.168.2.118/myproject-crushlinux/cirros]
984ad441ec3d: Layer already exists
f0a496d92efa: Layer already exists
e52d19c3bee2: Layer already exists
v2: digest: sha256:483f15ac97d03dc3d4dcf79cf71ded2e099cf76c340f3fdd0b3670a40a198a22 size: 943
6)查看 Harbor 的 web 管理界面,myproject-crushlinux 项目里面有两个镜像。
7、Harbor 日常操作管理
1、通过 Harbor Web 创建项目
点击“+项目”时按规范填写项目名称。项目级别:私有即不勾选(勾选后会变为"公开")。如果设置为公共仓库,则所有人对此项目下的镜像拥有读权限,命令行中不需要执行"Docker login"即可下载镜像,镜像操作与Docker hub 一致。
2、创建 Harbor 用户
1)创建用户并分配权限
系统管理->用户管理->创建用户,填写用户名为“crushlinux-user01”,邮箱为 crushlinux-user01@crushlinux.cn,全名为“harbor admin”,密码为“A123a456”,注释为“管理员”。
2)添加项目成员
项目-> myproject-crushlinux->成员->+成员,填写上述创建的用户并分配角色为“项目管理员”。
可对成员角色进行变更或者删除操作。
3)在客户端上用普通账户镜像操作
(1)删除上述打标签的本地镜像.
[root@dns-nfs ~]# docker rmi 192.168.2.118/myproject-crushlinux/cirros:v2 Untagged: 192.168.2.118/myproject-crushlinux/cirros:v2
Untagged: 192.168.2.118/myproject-crushlinux/cirros@sha256:483f15ac97d03dc3d4dcf79cf71ded2e099cf76c340f3fdd0b3670a40a198a22[root@dns-nfs ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE
cirros latest f9cae1daf5f6 2 years ago 12.6MB
(2)首先退出当前用户,然后使用上述创建的账户crushlinux-user01 登录。
[root@dns-nfs ~]# docker logout 192.168.2.118Removing login credentials for 192.168.2.118[root@dns-nfs ~]# docker login 192.168.2.118Username: crushlinux-user01
Password: A123a456
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
(3)下载 192.168.2.118/myproject-kgc/cirros 标签为 v1 的镜像。
[root@dns-nfs ~]# docker pull 192.168.2.118/myproject-crushlinux/cirros:v1v1: Pulling from myproject-crushlinux/cirros
Digest: sha256:483f15ac97d03dc3d4dcf79cf71ded2e099cf76c340f3fdd0b3670a40a198a22
Status: Downloaded newer image for 192.168.2.118/myproject-crushlinux/cirros:v1
192.168.2.118/myproject-crushlinux/cirros:v1[root@dns-nfs ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE
192.168.2.118/myproject-crushlinux/cirros v1 f9cae1daf5f6 2 years ago 12.6MB
cirros latest f9cae1daf5f6 2 years ago 12.6MB
(4)查看日志
Web 界面日志,操作日志按时间顺序记录用户相关操作。
3、管理 Harbor
可以使用 docker-compose来管理Harbor。一些有用的命令如下所示(必须在与docker-compose.yml 相同的目录中运行)。
1、停止/启动/重启 Harbor
[root@master harbor]# docker-compose stop[root@master harbor]# docker-compose startStarting log ... done
Starting registry ... done
Starting postgresql ... done
Starting adminserver ... done
Starting ui ... done
Starting redis ... done
Starting jobservice ... done
Starting proxy ... done[root@master harbor]# docker-compose restartRestarting nginx ... done
Restarting harbor-jobservice ... done
Restarting harbor-ui ... done
Restarting registry ... done
Restarting harbor-db ... done
Restarting harbor-adminserver ... done
Restarting redis ... done
Restarting harbor-log ... done
2、修改 Harbor.cfg 配置文件
要更改 Harbor 的配置文件时,请先停止现有的 Harbor 实例并更新 harbor.cfg;然后运行 prepare 脚本来填充配置;最后重新创建并启动 Harbour 的实例。
[root@master harbor]# docker-compose down -vStopping nginx ... done
Stopping harbor-jobservice ... done
Stopping harbor-ui ... done
Stopping registry ... done
Stopping harbor-db ... done
Stopping harbor-adminserver ... done
Stopping redis ... done
Stopping harbor-log ... done
Removing nginx ... done
Removing harbor-jobservice ... done
Removing harbor-ui ... done
Removing registry ... done
Removing harbor-db ... done
Removing harbor-adminserver ... done
Removing redis ... done
Removing harbor-log ... done
Removing network harbor_harbor[root@master harbor]# vim harbor.cfg [root@master harbor]# ./prepare 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/registryctl/env
Clearing the configuration file: ./common/config/registryctl/config.yml
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/registryctl/env
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.[root@master harbor]# docker-compose up -dCreating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating harbor-db ... done
Creating registry ... done
Creating redis ... done
Creating harbor-adminserver ... done
Creating harbor-ui ... done
Creating harbor-jobservice ... done
Creating nginx ... done
3、移除 Harbor 服务容器同时保留镜像数据/数据库
[root@master harbor]# docker-compose down -vStopping harbor-jobservice ... done
Stopping nginx ... done
Stopping harbor-ui ... done
Stopping harbor-adminserver ... done
Stopping redis ... done
Stopping registry ... done
Stopping harbor-db ... done
Stopping harbor-log ... done
Removing harbor-jobservice ... done
Removing nginx ... done
Removing harbor-ui ... done
Removing harbor-adminserver ... done
Removing redis ... done
Removing registry ... done
Removing harbor-db ... done
Removing harbor-log ... done
Removing network harbor_harbor
4、移除 Harbor 服务容器全部数据(重新部署时采用)
持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的
/var/log/Harbor/目录下
[root@master harbor]# rm -rf /data/database
[root@master harbor]# rm -rf /data/registry