docker镜像仓库管理软件(habor)

项目首页
http://vmware.github.io/harbor/#gettingHarbor
软件版本
操作系统:centos7.2
harbor:1.2.2
docker:17.09-ce
环境信息
container-0 192.168.2.110
container-1 192.168.2.112
container-2 192.168.2.113

habor是什么?

habor并不是镜像仓库,更确切的说是一个镜像仓库管理平台,原生的docker registry不支持用户权限管理,而habor镜像仓库也是用的原生的docker registry,只是又通过一些其他组件来进行用户和权限管理功能。
habor默认镜像是存储在本地文件系统,可以的支持的第三方对象存储,如Amazon s3、openstack swift、ceph radosgw。

组件介绍

habor安装默认会启动这些组件
habor-administrator
habor的系统管理容器,可以进行habor-Server的一些系统信息的获取,如存储用量
harbor-db
负责存储habor的用户信息和项目信息
harbor-jobservice
负责habor与habor的之间项目的同步
harbor-log
负责统一管理habor日志
habor-ui
负责web端展示,token的验证和生成。
nginx
前端反向代理,
registry
docker的镜像仓库

整体架构

来源(http://blog.csdn.net/u010278923/article/details/77941995)

主要组件包括proxy,他是一个nginx前端代理,主要是分发前端页面ui访问和镜像上传和下载流量,上图中通过深蓝色先标识;ui提供了一个web管理页面,当然还包括了一个前端页面和后端API,底层使用mysql数据库;registry是镜像仓库,负责存储镜像文件,当镜像上传完毕后通过hook通知ui创建repository,上图通过红色线标识,当然registry的token认证也是通过ui组件完成;adminserver是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置,通过灰色线标识;jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log,上图通过紫色线标识;log是日志汇总组件,通过docker的log-driver把日志汇总到一起,通过浅蓝色线条标识。

docker login过程

(http://www.sohu.com/a/67065472_115128)

(a) 首先,这个请求会由监听80端口的proxy容器接收到。根据预先设置的匹配规则,容器中的Nginx会将请求转发给后端的registry 容器;
(b) 在registry容器一方,由于配置了基于token的认证,registry会返回错误代码401,提示Docker客户端访问token服务绑定的URL。在Harbor中,这个URL指向Core Services;
(c) Docker 客户端在接到这个错误代码后,会向token服务的URL发出请求,并根据HTTP协议的Basic Authentication规范,将用户名密码组合并编码,放在请求头部(header);
(d) 类似地,这个请求通过80端口发到proxy容器后,Nginx会根据规则把请求转发给ui容器,ui容器监听token服务网址的处理程序接收到请求后,会将请求头解码,得到用户名、密码;
(e) 在得到用户名、密码后,ui容器中的代码会查询数据库,将用户名、密码与mysql容器中的数据进行比对(注:ui 容器还支持LDAP的认证方式,在那种情况下ui会试图和外部LDAP服务进行通信并校验用户名/密码)。比对成功,ui容器会返回表示成功的状态码,并用密钥生成token,放在响应体中返回给Docker 客户端。
至此,一次docker login 成功地完成了,Docker客户端会把步骤(c)中编码后的用户名密码保存在本地的隐藏文件中。

docker push的流程
(http://www.sohu.com/a/67065472_115128)


用户登录成功后用docker push命令向Harbor 推送一个Docker image:

1
# docker push 192.168.2.110/library/hello-world

(a) 首先,docker 客户端会重复login的过程,首先发送请求到registry,之后得到token 服务的地址;
(b) 之后,Docker 客户端在访问ui容器上的token服务时会提供额外信息,指明它要申请一个对imagelibrary/hello-world进行push操作的token;
(c) token 服务在经过Nginx转发得到这个请求后,会访问数据库核实当前用户是否有权限对该image进行push。如果有权限,它会把image的信息以及push动作进行编码,并用私钥签名,生成token返回给Docker客户端;
(d) 得到token之后Docker客户端会把token放在请求头部,向registry发出请求,试图开始推送image。Registry 收到请求后会用公钥解码token并进行核对,一切成功后,image的传输就开始了。

安装habor

container-0上安装
habor安装是写好的docker-compose.yml文件,所以需要先安装docker-compose

1
easy_install pip

1
pip install docker-compose

下载habor离线安装包

1
wget http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz

md5
d2af810be0554319181969835a462807
解压

1
tar -xvf harbor-offline-installer-v1.2.2.tgz

修改配置文件

1
cd /root/habor

vim /root/habor/harbor.cfg

1
2
3
hostname=192.168.2.110 //这里不能写localhost和127.0.0.1,
ui_url_protocol = http //协议写http或https
harbor_admin_password = 123456 //harbor admin的密码,默认为Harbor12345

执行安装

1
[root@container-0 harbor]# ./install.sh

它会将刚刚下载的镜像import进行,然后调用docker-compose,初始化,并启动。

查看集群状态

web访问和基本使用

我这里刚刚设置了用户名为admin密码为123456,如果默认密码为Harbor12345

用户管理

创建用户

创建项目

将刚刚创建的wanshaoyuan添加成项目内,角色为项目管理员
用户加入对应的项目分为三种角色
项目管理员、开发人员、访客
分别对应的权限为
项目管理员:M(管理)、D(删除)、R(读取)、W(写入)、S(查询)
开发人员:R(读取)、W(写入)、S(查询)
访客:R(读取)、S(查询)

项目管理
项目是一组镜像仓库的逻辑集合,habor对用户权限的控制,实上就是对这个用户在这个项目的权限控制,一个项目可以有多个项目管理员,下面的habor同步也是基于项目的。

验证

docker-client配置

去上传镜像啦,因为habor使用的是http协议,而默认docker push镜像默认是https的所以我们需要修改下docker-client
container-1和container-2上操作
vim /usr/lib/systemd/system/docker.service

1
ExecStart=/usr/bin/dockerd --insecure-registry=192.168.2.110

1
systemctl daemon-reload
1
systemctl restart docker

在container-1上,上传镜像导habor
给镜像打tag
habor格式为

1
[registry_host]:[port]/[project_name]/[封装的应用]:[版本]

原生的registry,是用户名,habor是写刚刚创建的项目名

1
[registry_host]:[port]/[username]/[封装的应用]:[版本]


push镜像

在habor web端查看

日志可以看见刚刚的push操作

pull镜像
在container-2上将刚刚push的镜像pull下来

多habor的同步

有多个habor服务器时可以设置镜像的同步

在container-1上在启动一个habor

安装方法同上
访问

配置项目复制
点击进项目

添加复制规则

container-0上查看日志,已经同步成功了

container-1上查看,项目已经创建好了

后面只要container-0上的镜像有更新,container-1也会自动同步

http://blog.csdn.net/u010278923/article/details/72468791
http://www.sohu.com/a/67065472_115128
https://github.com/vmware/harbor/blob/master/docs/installation_guide.md
http://www.cnblogs.com/huangjc/p/6270405.html