一、 Harbor仓库的基本介绍

  Harbor,是一个英文单词,意思是港湾,港湾是干什么的呢,就是停放货物的,而货物呢,是装在集装箱中的,说到集装箱,就不得不提到Docker容器,因为docker容器的技术正是借鉴了集装箱的原理。所以,Harbor正是一个用于存储Docker镜像的企业级Registry服务。   Harbor通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

1. Harbor特性:

 基于角色的访问控制 :用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。  镜像复制 : 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。  图形化用户界面 : 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。  AD/LDAP 支持 : Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。  审计管理 : 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。  RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。  部署简单 : 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。

2. Harbor核心组件介绍:

 Proxy:他是一个nginx的前端代理,代理Harbor的registry,UI, token等服务。  Database:负责储存用户权限、审计日志、Dockerimage分组信息等数据。  UI:提供图形化界面,帮助用户管理registry上的镜像, 并对用户进行授权。  jobsevice:jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log。  Adminserver:是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置。  Registry:镜像仓库,负责存储镜像文件。  Log:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。  webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块  token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。   主要组件包括proxy,他是一个NGINX前端代理,主要是分发前端UI访问和镜像上传和下载流量,上图中通过深蓝色标识;UI提供了一个web管理界面,当然还包括一个前端和后端的API,底层使用MySQL数据库;registry是镜像仓库,负责存储镜像文件。当镜像上传完毕后通过took通知UI创建repository,上图通过红色线标识,当然registry的token认证也是通过UI组件完成的,adminserver是系统的配置管理中心附带检查存储用量。UI和jobserver启动的时候会需要加载adminserver的配置,通过灰色线标识;jobservice是负责镜像的复制工作,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log ,上图中通过紫色线标识,log是日志汇总组件,通过docker的log-diver把日志汇总到一起,通过浅蓝色线标识。

3. Harbor和Registry的比较

Harbor和Registry都是Docker的镜像仓库,但是Harbor作为更多企业的选择,是因为相比较于Regisrty来说,它具有很多的优势:  提供分层传输机制,优化网络传输:Docker镜像是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。  提供WEB界面,优化用户体验:只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。  支持水平扩展集群:当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。  良好的安全机制:企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性。  Harbor提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制。kubernetes中通过namespace来对资源进行隔离,在企业级应用场景中,通过将两者进行结合可以有效将kubernetes使用的镜像资源进行管理和访问控制,增强镜像使用的安全性。尤其是在多租户场景下,可以通过租户、namespace和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。

4. Harbor的实现

Harbor的每个组件都是以Docker容器的形式构建的,官方也是使用Docker Compose来对它进行部署。用于部署Harbor的Docker Compose模板位于 harbor/docker-compose.yml,打开这个模板文件,发现Harbor是由7个容器组成的:   nginx:nginx负责流量转发和安全验证,对外提供的流量都是从nginx中转,所以开放https的443端口,它将流量分发到后端的ui和正在docker镜像存储的docker registry。   **harbor-jobservice:**harbor-jobservice 是harbor的job管理模块,job在harbor里面主要是为了镜像仓库之间同步使用的。   **harbor-ui:**harbor-ui是web管理页面,主要是前端的页面和后端CURD的接口。   **registry:**registry就是docker原生的仓库,负责保存镜像。   **harbor-adminserver:**harbor-adminserver是harbor系统管理接口,可以修改系统配置以及获取系统信息。   **harbor-db:**harbor-db是harbor的数据库,这里保存了系统的job以及项目、人员权限管理。由于本harbor的认证也是通过数据,在生产环节大多对接到企业的ldap中。   **harbor-log:**harbor-log是harbor的日志服务,统一管理harbor的日志。通过inspect可以看出容器统一将日志输出的syslog。 这几个容器通过Docker link的形式连接在一起,这样,在容器之间可以通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。

二、Harbor的安装和基本使用

1. Harbor的安装

环境介绍:

#①安装docker:
yum install -y yum-utils  device-mapper-persistent-data  lvm2
#配置repository
yum-config-manager  --add-repo  https://download.docker.com/linux/centos/docker-ce.repo

#安装docker,这里注意(docker的版本需要一致)比如,如果在拉去一个镜像之后并启动镜像时:[root@zy harbor]#docker run -it centos echo hello world: 如果出现如下错误: 或者: 可能是因为docker的版本不对:

#这里我们需要将centos中自带的docker删除:
	[root@zy harbor]#yum remove docker-ce docker-ce-cli containerd.io
#查看docker的版本
yum list docker-ce --showduplicates | sort -r
#下载对应的版本:
[root@zy harbor]#yum remove docker-ce docker-ce-cli containerd.io
#启动docker
[root@zy harbor]#systemctl start docker

此时在尝试,运行一个镜像,如果没问题,说明docker安装成功!!!

#②	安装docker-compose
[root@zy harbor]# yum install python-pip 
[root@zy harbor]# pip install docker-compose
#测试
[root@zy harbor]# docker-compose –version
#卸载
#[root@zy harbor]#  pip uninstall docker-compose
#③安装harbor
这里我已经下载过了 ,使用离线安装。
下载地址:https://github.com/vmware/harbor/releases/download 
也可以在线安装:
wget -P /usr/loca/src/ https://github.com/vmware/harbor/releases/download/v1.2.0/harbor-online-installer-v1.1.1.tgz
#下载成功后:
[root@zy harbor]#  tar zxf harbor-offline-installer-v1.1.1.tgz
[root@zy harbor]# cd harbor
#修改配置文件:
•	hostname:目标主机的主机名,用于访问UI和注册服务。
•	ui_url_protocol:(http或https,默认为http)用于访问UI和令牌/通知服务的协议。
•	db_password:用于db_auth的MySQL数据库的root密码。
•	max_job_workers:(默认值为3)作业服务中的最大复制工作数。
•	customize_crt:(开启或关闭,默认为开启),如果此属性开启,在准备脚本创建注册表的令牌生成/验证私钥和根证书。
•	ssl_cert:SSL证书的路径,仅在协议设置为https时应用。
•	ssl_cert_key:SSL密钥的路径,仅在协议设置为https时应用。
•	log_rotate_count:日志文件在被删除之前会被轮询log_rotate_count次数。
•	log_rotate_size:仅当日志文件大于log_rotate_size字节时才会轮换日志文件。
•	harbor_admin_password:管理员的初始密码。默认用户名/密码为:admin/Harbor12345。
•	auth_mode:使用的身份验证类型。默认情况下,它是db_auth,即凭据存储在数据库中。对于LDAP身份验证,请将其设置为ldap_auth。
#④执行安装脚本:
[root@zy harbor]# ./install.sh

看到如下界面表示安装成功,此时可以根据你设置的hostname和port访问harbor的界面: 这里我们也可以看到harbor启动的docker容器: 注意:执行这条命令时,所在的目录中一定要有:docker-compose.yml文件。

#补充命令:
#启动Harbor  d
[root@zy harbor]#docker-compose start 
#停止Harbor  
[root@zy harbor]#docker-comose stop 
#重启Harbor 
[root@zy harbor]#docker-compose restart

2. harbor上传和下载镜像的测试

1)上传操作

#1.创建/etc/docker/daemon.json文件,在文件中指定仓库地址
[root@zy harbor]#cat > /etc/docker/daemon.json << EOF { "insecure-registries":["hostname"] } EOF
#注意这里的hostname是harbor.cfg配置的那个。
#2.重启docker服务
[root@zy harbor]# systemctl daemon-reload
[root@zy harbor]# systemctl restart docker
#3.查看docker服务的本地registry
[root@zy harbor]# systemctl info

#4.下载镜像,上传至本地服务
[root@zy harbor]# docker pull busybox    #下载
[root@zy harbor]# docker tag busybox 192.168.130.101/library/busybox:0.1 #修改标签(ip/项目/名称)
[root@zy harbor]# docker login 192.168.130.101 #登录自己的私有仓库
[root@zy harbor]# docker push 192.168.130.101/library/busybox:0.1    #上传到私用仓库

2)下载操作

[root@zy harbor]# docker pull 192.168.130.101/library/busybox:0.1
#查看
[root@zy harbor]# docker images

3. 操作的常见问题

遇到的问题就是Harbor我配置的是http访问,但是docker客户端默认都是https访问Harbor,所以就会产生错误。 遇到上面的问题表示docker默认访问仓库时都是使用的https协议,而我们的仓库配置的是http:

#解决方法一:
#在docker启动的配置仓库地址添加如下内容:
--insecure-registry rgs.unixfbi.com
[root@zy harbor]#vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd --insecure-registry rgs.unixfbi.com    #不推荐  ,反正 我使用这个连docker都起不来
#解决方法二:
#创建/etc/docker/daemon.json文件,在文件中指定仓库地址
{ "insecure-registries":["私有仓库的地址"] } 
#然后重启docker就可以了 
[root@zy harbor]#systemctl restart docker