一、什么是Harbor  

Harbor是一个企业级Registry服务。它对开源的Docker Registry服务进行了扩展,添加了更多企业用户需要的功能。Harbor被设计用于部署一套组织内部使用的私有环境,这个私有Registry服务对于非常关心安全 的组织来说是十分重要的。另外,私有Registry服务可以通过避免从公域网下载镜像而提高企业生产力。这对于没有良好的Internet连接状态,使用Docker Container的用户是一个福音。

Harbor是VMware公司最近开源的企业级Docker Registry项目(https://github.com/vmware/harbor) 。其目标是帮助用户迅速搭建一个企业级的Docker registry服务。它提供了管理UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文。Harbor的每个组件都是以Docker容器的形式构建的,使用Docker Compose来对它进行部署。

Harbor项目使用了go语言开发,WEB框架采用beego。容器应用的开发和运行离不开可靠的镜像管理。从安全和效率等方面考虑,在企业私有环境内部署的Registry服务是非常必要的。

Harbor(https://github.com/vmware/harbor)由VMware中国研发团队为企业用户设计的Registry Server开源项目,包括了权限管理(RBAC)、图形管理界面、LDAP/AD集成、审计、自我注册、HA等企业必需的功能,同时针对中国用户的特点,原生支持中文,并计划实现镜像复制(roadmap)等功能。

主要组件  

Harbor系统由五个容器组成:Proxy、Core Services(包含UI, tokenservice和webhook)、Database、Registry和Log Collector。

  • Proxy提供反向代理服务,用户的不同请求由Proxy分发到后端的UI或者Registry。Harbor中使用的是官方的nginx镜像。

  • Core Services是Harbor项目的核心组件,主要提供权限管理、审计、管理界面UI、token service以及可供其他系统调用的API等功能。

  • Database提供数据持久化服务,采用了官方的mysql镜像。

  • Registry是Docker官方的开源的Registry镜像,主要提供镜像的存储和分发功能。

  • Log Collector负责收集其他容器的日志并进行日志轮转。

各个容器之间的关系如下图所示:

n2e2emj.png%21web

图摘选自:


http://geek.csdn.net/news/detail/65989


二、快速部署  

1、环境准备

1)加入 Docker源


增加repo

tee /etc/yum.repos.d/docker.repo <<-'EOF'

[dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7/

enabled=1

gpgcheck=1

gpgkey=https://yum.dockerproject.org/gpg

EOF


yum install docker-engine -y

systemctl enable docker.service

systemctl start docker


安装EPEL源

yum install -y epel-release



yum -y install python-pip
pip install -U docker-compose


修改/usr/lib/systemd/system/docker.service文件,添加–insecure-registry IP地址。

#修改前#ExecStart=/usr/bin/docker daemon -H fd://
#修改后ExecStart=/usr/bin/docker daemon -H fd:// --insecure-registry 172.16.74.150


)重启Docker服务

# systemctl daemon-reload
# systemctl restart docker


2、安装

注意:操作系统建议为CentOS 7.2。

首先,Clone该项目源代码:

# git clone 

vi/root/harbor/make/harbor.cfg


hostname:hostname为外部可访问的地址,即bind addr,通常设置为本地公有IP,若内部使用DNS,可设置为主机名;
harbor_admin_password:登录harbor界面admin用户的密码;


运行./prepare脚本更新配置完成配置后,就可以使用docker-compose快速部署Harbor了。(make目录下


然后:


 cd /root/harbor/make/dev

 docker-compose up -d



最后提示如下信息,便表示安装成功了。

.......
Creating deploy_log_1
Creating deploy_ui_1
Creating deploy_mysql_1
Creating deploy_registry_1
Creating deploy_proxy_1


安装完成后,访问Web UI,地址:http:// 172.16.74.150,即配置的hostname地址。



3、使用Harbor

1)从docker hub上下载busybox镜像

# docker run --rm -it busybox /bin/bash


2)给镜像打标签,以便上传到私服,其中library是harbor默认提供的项目

# docker tag busybox 192.168.93.205/sjwl/busybox


3)上传镜像

先登录镜像私服,执行以下指令,再输入用户名和密码

# docker login 192.168.93.205
Username: admin
Password:  sjwl123       //输入密码
Login Succeeded


上传镜像

# docker push 192.168.93.205/sjwl/busybox


4)在浏览器上访问192.168.93.205,登录完成后,点击sjwl这个项目,即可看到上传的busybox。

用户名:admin

密码:xxxx

4、其他(可选)

以下附带harbor的启动、停止命令

$ sudo docker-compose up –d
$ sudo docker-compose stop
$ sudo docker-compose start
$ sudo docker-compose rm
$ rm -r /data/database
$ rm -r /data/registry

从客户端验证:

由于我们配置认证服务使用的是http,Docker认为是不安全的,要使用我们部署的镜像仓库,需要配置

docker启动项(因为我们使用的是1.12.13版本,没有配置文件了,所以只能修改启动项)


vi /usr/lib/systemd/system/docker.service   

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.93.205


systemctl restart docker

[root@kube dockerfile]# systemctl restart docker

Warning: docker.service changed on disk. Run 'systemctl daemon-reload' to reload units.


这时你要先执行下systemctl daemon-reload

再执行次systemctl restart docker

这次修改的内容才生效,切记哦!




其中192.168.93.205是我们部署Harbor的地址,即hostname配置项值。配置完后需要重启docker服务。

验证能否登录:

docker login 192.168.93.205


push成功后,我们就可以从Harbor仓库中使用docker pull拉取我们的镜像了,注意如果是私有项目,必须先使用docker login登录。

docker pull 192.168.93.205/sjwl/busybox


5、Harbor作为mirror registry

Mirror是Docker Registry的一种特殊类型,它起到了类似代理服务器的缓存角色,在用户和Docker Hub之间做Image的缓存。 其基本工作原理是,当用户pull一个镜像时,若镜像在mirror 服务器存在,则直接从mirror服务器拉取,否则若不存在该镜像,则由mirror server自动代理往dockerhub(可配置)中拉取镜像,并缓存到mirror服务器中,当客户再次拉取这个镜像时,直接从mirror server中拉取,不需要再次从docker hub中拉取。

Harbor目前不支持pull cache功能,已提交Github issue #120。不过我们只需要手动修改下配置即可完成,具体配置可查看官方Registry as a pull through cache。

我们在运行./prepare之前修改config/registry/config.yml文件,追加以下配置:

proxy:remoteurl: https://registry-1.docker.io