部署企业私有仓库往往是很有必要的, 他可以帮助你管理企业的一些敏感镜像, 同时由于Docker Hub的下载速度和GFW的原因,
往往需要将一些无法直接下载的镜像导入本地私有仓库. 而Harbor就是部署企业私有仓库的一个不二之选。


Harbar简介

Harbor是VMware公司开源了企业级Registry项目, 其的目标是帮助用户迅速搭建一个企业级的Docker
registry服务。它以Docker公司开源的registry为基础,额外提供了如下功能:

* 基于角色的访问控制(Role Based Access Control)
* 基于策略的镜像复制(Policy based image replication)
* 镜像的漏洞扫描(Vulnerability Scanning)
* AD/LDAP集成(LDAP/AD support)
* 镜像的删除和空间清理(Image deletion & garbage collection)
* 友好的管理UI(Graphical user portal)
* 审计日志(Audit logging)
* RESTful API
* 部署简单(Easy deployment)
架构介绍

这里借用别人一张图:


Harbor依赖的外部组件:

* Nginx(Proxy):
Harbor的registry,UI,token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
* Registry v2: Docker官方镜像仓库, 负责储存Docker镜像,并处理docker
push/pull命令。由于我们要对用户进行访问控制,即不同用户对Docker
image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token,
Registry会通过公钥对token进行解密验证。
* Database(MySQL):为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。
Harbor自己组件:

* Core services(Admin Server): 这是Harbor的核心功能,主要提供以下服务:

* UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。
* webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。
* Auth服务:负责根据用户权限给每个docker push/pull命令签发token. Docker
客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
* API: 提供Harbor RESTful API
* Replication Job Service:提供多个 Harbor 实例之间的镜像同步功能。
* Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。
部署

这里不使用kubernetes来部署, 原因是镜像仓库非常重要, 尽量保证部署和维护的简洁性, 因此这里直接使用compose的方式进行部署。
官方提供3种部署Harbor的方式:

* 在线安装: 从Docker Hub下载Harbor的镜像来安装, 由于Docker Hub比较慢, 建议Docker配置好加速器。
* 离线安装: 这种方式应对与部署主机没联网的情况使用。需要提前下载离线安装包: harbor-offline-installer-.tgz 到本地
* OVA安装: 这个主要用vCentor环境是使用
后面部署时会为Docker配置镜像加速器, 因此会采用在线部署的方式, 部署步骤如下:

* 下载Harbor最新的在线安装包
* 配置Harbor(harbor.cfg)
* 运行install.sh来安装和启动Harbor
环境要求与准备

Harbor以容器的形式进行部署, 因此可以被部署到任何支持Docker的Linux发行版, 并且具备如下环境:

* Python2.7+
* Docker Engine 1.10+
* Docker Compose 1.6.0+
这里使用CentOS7.3的系统, Python2.7系统自带了, 剩下的就是安装Docker和Compose:
[[email protected] ~]# yum install docker -y [[email protected] ~]# yum -y install
epel-release [[email protected] ~]# yum install python-pip -y [[email protected] ~]#
pip install docker-compose # 查看安装完成的Docker和Compose的版本 [[email protected] ~]# docker
version Client: Version: 1.12.6 API version: 1.24 Package version: docker-1.12.6
-68.gitec8512b.el7.centos.x86_64 Go version: go1.8.3 Git commit: ec8512b/1.12.6
Built: Mon Dec11 16:08:42 2017 OS/Arch: linux/amd64 Cannot connect to the
Docker daemon. Is the docker daemon running on this host? [[email protected] ~]#
pip freeze | grep compose docker-compose==1.18.0
为Docker配置加速器, 方便通过国内镜像服务器快速拉取Docker Hub提供的镜像
mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors"
: ["https://v5d7kh0f.mirror.aliyuncs.com"] } EOF systemctl enable docker
systemctl start docker systemctl status docker
下载安装包
到Harbor的GitHub仓库的Release页面 <https://github.com/vmware/harbor/releases>,
下载最新的在线安装包(如果下载不了, 请从这里下载百度网盘Harbor安装包 <https://pan.baidu.com/s/1eTDUW0a>:
[[email protected] ~]# wget
https://storage.googleapis.com/harbor-releases/harbor-online-installer-v1.3.0.tgz
[[email protected] ~]# tar vxf harbor-online-installer-v1.3.0.tgz
配置Harbor
在刚才解压完的目录下有harbor配置文件: harbor.cfg, 这里有几处必要配置需要修改:

* hostname: 修改成你本机的ip地址
* db_password: 数据库root密码
* harbor_admin_password: harbor初始管理员密码为Harbor12345, 这里最好修改成自己的
其他详细的参数请查看Harbor官方文档(见参考)
启动Harbor
解压完过后再harbor目录下有一个install.sh, 执行它来进行安装
[[email protected] harbor]# ./install.sh [[email protected] harbor]# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver /harbor/start.sh Up harbor-db /usr/local/bin/docker-entr ...
Up3306/tcp harbor-jobservice /harbor/start.sh Up harbor-log /bin/sh -c
/usr/local/bin/ ... Up127.0.0.1:1514->10514/tcp harbor-ui /harbor/start.sh Up
nginx nginx -g daemon off; Up0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.
0.0:80->80/tcp registry /entrypoint.sh serve /etc/ ... Up 5000/tcp
然后访问:


使用

服务安装好了过后, 下面介绍如何通过Docker Client使用Harbor

配置docker客户端使用Harbor

因为Harbor开启的是HTTP服务, 而不是HTTPS, 所以要修改下Docker的配置:/etc/docker/daemon.json,
添加参数insecure-registries:
[[email protected] ~]# cat /etc/docker/daemon.json { "registry-mirrors": [
"https://v5d7kh0f.mirror.aliyuncs.com"], "insecure-registries": [
"192.168.204.15"] }
修改过后重启docker, 然后重启Harbor服务:
[[email protected] harbor]# systemctl restart docker [[email protected] harbor]#
docker-compose stop Stopping harbor-jobservice ... done Stopping harbor-ui ...
done Stopping harbor-db ... done Stopping registry ... done Stopping
harbor-adminserver ...done Stopping harbor-log ... done [[email protected] harbor]#
docker-compose start Starting log ... done Starting adminserver ... done
Starting registry ...done Starting ui ... done Starting mysql ... done Starting
jobservice ...done Starting proxy ... done
镜像的Push和Pull

为了使用Harbor我们需要在Harbor上建立一个项目:kubernetes

注意: 一定要先有项目 然后按照192.168.204.15/{project-name}/{image-name}[:Tag] 的方式打Tag

(a). 建好项目后, 我们先测试下能否Login Harbor
[[email protected] harbor]# docker login 192.168.204.15 Username: admin Password:
Login Succeeded
(b). 然后为我们的镜像打上相应的标签, 注意标签格式: 192.168.204.15/{project-name}/{image-name}[:Tag]
[[email protected] ~]# docker tag docker.io/nginx:latest
192.168.204.15/kubernetes/nginx:v1.10 [[email protected] ~]# docker push
192.168.204.15/kubernetes/nginx:v1.10 The push refers to a repository [192.168.
204.15/kubernetes/nginx] a103d141fc98: Pushed 73e2bd445514: Pushed 2
ec5c0a4cb57: Pushed v1.10: digest: sha256:926
b086e1234b6ae9a11589c4cece66b267890d24d1da388c96dd8795b2ffcfb size:948
(c). 最后在另一台机器上面拉取镜像(记得配置Docker客户端insecure-registries参数, 参考上面):
~/Blogs » docker pull 192.168.204.15/kubernetes/nginx:v1.10 v1.10: Pulling
from kubernetes/nginxe7bb522d92ff: Pull complete 6edc05228666: Pull complete
cd866a17e81f: Pull complete Digest: sha256:926
b086e1234b6ae9a11589c4cece66b267890d24d1da388c96dd8795b2ffcfbStatus: Downloaded
newer image for192.168.204.15/kubernetes/nginx:v1.10
参考

* Harbor GitHub <https://github.com/vmware/harbor>
* Harbor 安装手册
<https://github.com/vmware/harbor/blob/master/docs/installation_guide.md>
* Harbor 用户手册
<https://github.com/vmware/harbor/blob/master/docs/user_guide.md>
* 用 Harbor 和 Kubernetes 构建高可用企业级镜像仓库 <https://toutiao.io/posts/gbqfhv/preview>