本文做者付广平,UnitedStack有云存储工程师,北京邮电大学硕士,从事大数据和云计算相关工做,2016年毕业后加入UnitedStack大数据&容器组,负责Docker、Magnum和Sahara相关工做,Openstack、Docker社区活跃者。
做者别出心裁地使用Harbor搭建了私有Mirror服务,加速外部Docker镜像的下载。编者对原文作了少许修改。
Harbor是VMware公司最近开源的企业级Docker Registry项目(https://github.com/vmware/harbor) 。其目标是帮助用户迅速搭建一个企业级的Docker registry服务。它提供了管理UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文。Harbor的每一个组件都是以Docker容器的形式构建的,使用Docker Compose来对它进行部署。
python
Harbor使用Docker-compose部署,后续全部的配置以及部署均在
$HARBOR_HOME/Deploy/
目录下完成,所以若无特别说明,工做目录都在该目录下。
首先须要进行简单的配置,配置文件为harbor.cfg,配置项以下:
hostname:hostname为外部可访问的地址,即bind addr,一般设置为本地公有IP,若内部使用DNS,可设置为主机名。
auth_mode:Harbor支持两种认证方式,默认为本地存储,即帐号信息存储在mysql下,本文先使用本地存储方式,另一种认证方式LDAP将在后续章节单独介绍。
设置完毕后,配置文件为:mysql
运行./prepare脚本更新配置。完成配置后,就可使用docker-compose快速部署Harbor:
docker-compose up -d
安装完成后,访问Web UI,地址:http://bind_addr,即配置的hostname地址,端口为80。如图:git
Web UI
安装完成后,打开Web UI,点击登陆,默认帐户admin/Harbor12345,登陆成功后进入项目管理界面:用户能够点击“个人项目”进行项目管理,好比新建项目、用户以及权限管理等。点击项目名称,进入该项目下的镜像管理界面,能够查看、检索镜像。
Docker client
以上是UI界面的使用,接下来介绍如何使用docker client进行镜像的管理,因为Harbor只支持Registry V2 API,所以Docker client版本必须>= 1.6.0。
因为咱们配置认证服务使用的是http,Docker认为是不安全的,要使用咱们部署的镜像仓库,须要配置本地docker,修改配置文件(/etc/default/docker)为:
DOCKER_OPTS="$DOCKER_OPTS --insecure-registry 42.62.x.x"
其中42.62.x.x是咱们部署Harbor的地址,即hostname配置项值。配置完后须要重启docker服务。
验证可否登陆:
docker login 42.62.x.x
登陆成功后显示以下:github
接下来咱们上传一个镜像,以ubuntu镜像为例,首先从docker hub拉取ubuntu镜像:
docker pull ubuntu:14.04
而后为该镜像打上新的标签,标签格式为:Harbor地址/项目名/镜像名称:镜像标签,如:
docker tag ubuntu:14.04 \
42.62.x.x/library/ubuntu:14.04
push咱们的镜像到Harbor仓库中:
docker push ubuntu:14.04 \
42.62.x.x/library/ubuntu:14.04sql
push成功后,咱们就能够从Harbor仓库中使用docker pull拉取咱们的镜像了,注意若是是私有项目,必须先使用docker login登陆:
docker pull 42.62.x.x/library/ubuntu:14.04
docker
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
若是须要访问私有仓库,须要填写Docker Hub的用户名和密码:
proxy:
remoteurl: https://registry-1.docker.io
username: [username]
password: [password]
而后从新启动Harbor服务:ubuntu
docker-compose stop
docker-compose rm -f
docker-compose up -d
除了设置Harbor(或者registry),还须要配置本地docker服务,指定--registry-mirror参数,修改docker配置文件(/etc/default/docker):
DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=http://42.62.x.x --insecure-registry 42.62.x.x"
注意替换42.62.x.x为你的registry地址。
注意:修改了docker配置文件,必须重启docker服务才能生效。
Harbor因为引进了认证功能,所以push操做时,必须保证project存在,好比push krystism/ffmpeg,必须保证Harbor建立了krystism project,不然会失败。为了可以正常push/pull dockerhub的官方镜像,务必建立library project,如图:缓存
假设本地不存在python镜像:
咱们第一次pull python后,Harbor发现不存在该镜像,因而本身做为代理往Docker Hub里拉取,拉取后保存到本地,能够经过Web UI查看。客户端再次拉取python镜像时,因为Harbor已经存在该镜像,所以不须要再往Docker Hub拉取,速度大幅度提升!
安全
Harbor支持两种认证方式,默认为本地存储,即帐号信息存储在mysql下,上文已经具体介绍。接下来介绍另一种认证方式LDAP,只须要修改配置文件便可。须要提供ldap url以及ldap basedn参数,而且设置auth_mode为ldap_auth。
快速部署LDAP服务
为了测试方便,咱们使用Docker启动一个LDAP服务器,启动脚本以下:bash
NAME=ldap_server
docker rm -f $NAME 2>/dev/null
docker run --env LDAP_ORGANISATION="Unitedstack Inc." \
--env LDAP_DOMAIN="ustack.com" \
--env LDAP_ADMIN_PASSWORD="admin_password" \
-v pwd
/containers/openldap/data:/var/lib/ldap \
-v pwd
/containers/openldap/slapd.d:/etc/ldap/slapd.d \
--detach --name $NAME osixia/openldap:1.1.2
建立新用户,首先须要定义ldif文件,new_user.ldif:
dn: uid=test,dc=ustack,dc=com
uid: test
cn: test
sn: 3
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
loginShell: /bin/bash
homeDirectory: /home/test
uidNumber: 1001
gidNumber: 1001
userPassword: 1q2w3e4r
mail: test@example.com
gecos: test
经过如下脚本建立新用户,其中ldap_server为LDAP服务容器名称。
docker cp new_user.ldif ldap_server:/
docker exec ldap_server ldapadd -x \
-D "cn=admin,dc=ustack,dc=com" \
-w admin_password \
-f /new_user.ldif -ZZ
查看用户是否建立成功:
docker exec ldap_server ldapsearch -x -h localhost \
-b dc=ustack,dc=com -D "cn=admin,dc=ustack,dc=com" \
-w admin_password
检查test用户是否存在,若存在,则说明建立成功,不然须要使用docker logs查看日志。
配置Harbor使用LDAP认证
修改harbor.cfg文件关于LDAP配置项,以下:
auth_mode = ldap_auth
ldap_url = ldap://42.62.x.x
ldap_basedn = uid=%s,dc=ustack,dc=com
而后从新部署Harbor:
./prepare
docker-compose stop
docker-compose rm -f
docker-compose up -d
测试是否可以使用test用户登陆:
docker login -u test -p 1q2w3e4r \
-e test@example.com 42.62.x.x
Harbor项目:https://github.com/vmware/harbor
官方配置mirror registry文档:https://github.com/docker/dist ... or.md
Daocloud关于mirror的博客:http://blog.daocloud.io/daocloud-mirror-free/
openLDAP部署:https://github.com/osixia/docker-openldap
欢迎广大用户使用Harbor项目并反馈意见和建议,也欢迎加入咱们贡献代码。若是您是Harbor的用户或开发者,可申请加入Harbor开源项目微信群,以方便沟通。请先扫描下面二维码关注“亨利笔记”公众号,并在公众号后台发送"入群"信息便可。