前言                                               

笔者通过和主持开发Habor的VMware中国研发团队负责人了解到,Habor开源项目致力于为企业级提供准生产环境中的Docker私有镜像仓库服务。事实上,也正是如此。

一、什么是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负责收集其他容器的日志并进行日志轮转。

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

图摘选自:

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

二、快速部署

1、环境准备

1)加入 Docker源

# tee /etc/yum.repos.d/docker.repo << 'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

安装EPEL源

# yum install -y epel-release

安装docker-engine

# yum install -y docker-engine

启动 Docker 服务

# systemctl daemon-reload
# systemctl enable docker
# systemctl start docker

2)配置DaoCloud镜像源,加速镜像下载(可选)

#sed -i 's|other_args="|other_args="--registry-mirror=http://768e1313.m.daocloud.io |g' /etc/sysconfig/docker

#sed -i "s|OPTIONS='|OPTIONS='--registry-mirror=http://768e1313.m.daocloud.io |g" /etc/sysconfig/docker

#sed -i 'N;s|\[Service\]\n|\[Service\]\nEnvironmentFile=-/etc/sysconfig/docker\n|g' /usr/lib/systemd/system/docker.service

# sed -i 's|fd://|fd:// $other_args |g' /usr/lib/systemd/system/docker.service

3)查看Docker版本

# docker version

4)在正式安装之前,我们必须先安装docker-compose。

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

5)修改/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

6)重启Docker服务

# systemctl daemon-reload
# systemctl restart docker

2、安装

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

首先,Clone该项目源代码:

# git clone https://github.com/vmware/harbor

快速部署Harbor的方式有两种,一种是source code,另一种是tgz文件压缩包。这里,我使用源代码方式安装。Harbor使用Docker-compose部署,后续所有的配置以及部署均在$HARBOR_HOME/Deploy/目录下完成,因此若无特别说明,操作步骤都在该目录下。

1) 配置harbor.cfg(必选)

在进行简单的配置,配置文件为harbor.cfg,配置项如下:

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

2)配置存储后端(可选)

默认情况下,Docker镜像存储在本地文件系统中。在生产环境中,您可能会考虑使用其他的存储后端,而不是本地文件系统,如S3,OpenStack Swift,Ceph、etc等,那么,你需要更新Deploy/templates/registry/config.yml文件中的storage配置部分。例如,如果你使用OpenStack Swift作为你的后端存储,部分可能看起来像这样:

storage:
  swift:
    username: admin
    password: ADMIN_PASS
    authurl: http://keystone_addr:35357/v3
    tenant: admin
    domain: default
    region: regionOne
    container: docker_images

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

# 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上下载hello-world镜像

# docker run hello-world

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

# docker tag hello-world 172.16.74.150/library/hello-world

3)上传镜像

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

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

上传镜像

# docker push 172.16.74.150/library/hello-world

4)在浏览器上访问172.16.74.150,登录完成后,点击library这个项目,即可看到上传的hello-world。

用户名: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,修改配置文件(/etc/default/docker)为:

DOCKER_OPTS="$DOCKER_OPTS --insecure-registry 172.16.74.150 "

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

验证能否登录:

docker login 172.16.74.150

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

docker pull 172.16.74.150/library/hello-world

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

参考地址:

https://github.com/vmware/harbor

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐