使用Harbor构建私有Docker镜像仓库

开发 开发工具
AD/LDAP集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文。Harbor的每个组件都是以Docker容器的形式构建的,使用Docker Compose来对它进行部署。

简介

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

  • Proxy: 由Nginx 服务器构成的反向代理。
  • Registry:由Docker官方的开源registry 镜像构成的容器实例。
  • UI: 即架构中的core services, 构成此容器的代码是Harbor项目的主体。
  • Mysql: 由官方MySql镜像构成的数据库容器。
  • Log: 运行着rsyslogd的容器,通过log-driver的形式收集其他容器的日志。

这几个容器通过Docker link的形式连接在一起,在容器之间通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。

快速部署方法

Harbor使用Docker-compose部署,后续所有的配置以及部署均在$HARBOR_HOME/Deploy/`目录下完成,因此若无特别说明,工作目录都在该目录下。

首先需要进行简单的配置,配置文件为harbor.cfg,配置项如下:

  • hostname:hostname为外部可访问的地址,即bind addr,通常设置为本地公有IP,若内部使用DNS,可设置为主机名。
  • auth_mode:Harbor支持两种认证方式,默认为本地存储,即账号信息存储在mysql下,本文先使用本地存储方式,另外一种认证方式LDAP将在后续章节单独介绍。

设置完毕后,配置文件为:

  1. hostname = 42.62.x.x 
  2. ui_url_protocol = http 
  3.  
  4. #email_server = smtp.mydomain.com 
  5. #email_server_port = 25 
  6. #email_username = sample_admin@mydomain.com 
  7. #email_password = abc 
  8. #email_from = admin <sample_admin@mydomain.com> 
  9.  
  10. ##The password of Harbor admin, change this before any production use. 
  11. harbor_admin_password= admin 
  12.  
  13. ##By default the auth mode is db_auth, i.e. the credentials are stored in a local database
  14. #Set it to ldap_auth if you want to verify a user credentials against an LDAP server. 
  15. auth_mode = ldap_auth 
  16.  
  17. #The password for the root user of mysql db, change this before any production use. 
  18. db_password = root123 
  19. #Switch for self-registration feature 
  20. self_registration = on 

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

  1. docker-compose up -d 

安装完成后,访问Web UI,地址:http://bind_addr,即配置的hostname地址,端口为80。如图:

使用harbor

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)为:

  1. DOCKER_OPTS="$DOCKER_OPTS --insecure-registry 42.62.x.x" 

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

验证能否登录:

  1. docker login 42.62.x.x 
  2. # docker login -u admin -p Harbor12345 -e test@gmail.com 42.62.x.x 

登录成功后显示如下:

接下来我们上传一个镜像,以ubuntu镜像为例,首先从docker hub拉取ubuntu镜像:

  1. docker pull ubuntu:14.04 

然后为该镜像打上新的标签,标签格式为:Harbor地址/项目名/镜像名称:镜像标签,如42.62.x.x/library/ubuntu:14.04:

  1. docker tag ubuntu:14.04 42.62.x.x/library/ubuntu:14.04 

push我们的镜像到harbor仓库中:

  1. docker push ubuntu:14.04 42.62.x.x/library/ubuntu:14.04 

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

  1. docker pull 42.62.x.x/library/ubuntu:14.04 

使用harbor作为mirror registry

Mirror Registry简介

Mirror是Docker Registry的一种特殊类型,它起到了类似代理服务器的缓存角色,在用户和Docker Hub之间做Image的缓存。 官方定义为:

Such a registry is provided by a third-party hosting infrastructure but is targeted at their customers only. Some mechanism ensures that public images are pulled from a sponsor registry to the mirror registry, to make sure that the customers of the third-party provider can docker pull those images locally.

其基本工作原理是,当用户pull一个镜像时,若镜像在mirror 服务器存在,则直接从mirror服务器拉取,否则若不存在该镜像,则由mirror server自动代理往dockerhub(可配置)中拉取镜像,并缓存到mirror服务器中,当客户再次拉取这个镜像时,直接从mirror server中拉取,不需要再次从dockerhub中拉取。

注意Mirror跟Private Registry有本质区别

Private Registry是开发者或者企业自建的Image存储库,通常用来保存企业内部的Docker Image,用于内部开发流程和产品的发布、版本控制。Mirror是一种代理中转服务,我们提供的Mirror服务,直接对接Docker Hub的官方Registry,Docker Hub上有数以十万计的各类Docker Image。在使用Private Registry时,需要在Docker Pull,或Dockerfile中直接键入Private Registry的地址,通常这样会导致跟Private Registry的绑定,缺少灵活性。

原理如图:

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

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

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

如果需要访问私有仓库,需要填写dockerhub的用户名和密码:

  1. proxy: 
  2.   remoteurl: https://registry-1.docker.io 
  3.   username: [username] 
  4.   password: [password

然后重新启动harbor服务:

  1. # 注意不要执行./prepare 
  2. docker-compose stop 
  3. docker-compose rm -f 
  4. docker-compose up -d 

除了设置harbor(或者registry),还需要配置本地docker服务,指定--registry-mirror参数,修改docker配置文件(/etc/default/docker):

  1. 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镜像:

  1. docker pull python # pull from dockerhub 
  2. docker rmi python # remove the image 
  3. docker pull python # yes, it will pull from harbor now 

我们***次pull python后,harbor发现不存在该镜像,于是自己作为代理往dockerhub里拉取,拉取后保存到本地,可以通过WebUI查看。客户端再次拉取python镜像时,由于harbor已经存在该镜像,因此不需要再往dockerhub拉取,速度大幅度提高!

对接LDAP认证

Harbor支持两种认证方式,默认为本地存储,即账号信息存储在mysql下,上文已经具体介绍。接下来介绍另外一种认证方式LDAP,只需要修改配置文件即可。需要提供ldap url以及ldap basedn参数,并且设置auth_mode为ldap_auth。

快速部署LDAP服务

为了测试方便,我们使用docker启动一个LDAP服务器,启动脚本如下:

  1. #!/bin/bash 
  2. NAME=ldap_server 
  3. docker rm -f $NAME 2>/dev/null 
  4. docker run --env LDAP_ORGANISATION="Unitedstack Inc." --env LDAP_DOMAIN="ustack.com" \ 
  5.  --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:

  1. dn: uid=test,dc=ustack,dc=com 
  2. uid: test 
  3. cn: test 
  4. sn: 3 
  5. objectClass: top 
  6. objectClass: posixAccount 
  7. objectClass: inetOrgPerson 
  8. loginShell: /bin/bash 
  9. homeDirectory: /home/test 
  10. uidNumber: 1001 
  11. gidNumber: 1001 
  12. userPassword: 1q2w3e4r 
  13. mail: test@example.com 
  14. gecos: test 

通过以下脚本创建新用户,其中ldap_server为LDAP服务容器名称。

  1. docker cp new_user.ldif ldap_server:/  
  2. docker exec ldap_server ldapadd -x -D "cn=admin,dc=ustack,dc=com" -w admin_password -f /new_user.ldif -ZZ 

查看用户是否创建成功:

  1. 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配置项,如下:

  1. auth_mode = ldap_auth 
  2. ldap_url = ldap://42.62.x.x 
  3. ldap_basedn = uid=%s,dc=ustack,dc=com 

然后重新部署harbor:

  1. ./prepare 
  2. docker-compose stop 
  3. docker-compose rm -f 
  4. docker-compose up -d 

测试是否能够使用test用户登录:

  1. docker login -u test -p 1q2w3e4r -e test@example.com 42.62.x.x 

查看结果。

【本文是51CTO专栏作者“付广平”的原创文章,如需转载请通过51CTO获得联系】

戳这里,看该作者更多好文

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2024-01-22 09:12:51

2022-07-11 07:37:55

HarborContainerd

2020-08-07 17:03:24

私有镜像仓库

2022-09-16 10:19:36

HarborContainerd

2020-09-18 07:59:44

GitLabCI

2023-03-30 07:35:55

2019-08-18 23:46:52

私有云容器镜像仓库

2024-02-20 08:08:43

2022-12-08 19:27:38

2021-08-23 08:30:30

Docker BuildKit 架构

2023-02-13 23:52:18

2022-09-15 10:03:42

Jaeger分布式追踪系统

2019-10-16 10:08:58

DockerLinuxWindows

2021-05-10 08:58:09

Harbor架构Registry 服务

2021-10-20 07:18:51

Harbor镜像项目

2020-11-12 07:51:05

DockerSpring Boot应用

2022-09-06 10:39:38

Docker镜像构建

2017-11-13 17:17:11

Docker镜像Go

2021-12-22 10:45:56

Docker RegiHarborLinux

2017-11-07 06:28:11

点赞
收藏

51CTO技术栈公众号