当前位置: 首页 > 科技观察

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

时间:2023-03-14 14:19:16 科技观察

介绍Harbor是VMware最近开源的企业级DockerRegistry项目,项目地址为https://github.com/vmware/harbor其目标是帮助用户快速构建一个企业级Docker注册服务。基于Docker的开源注册表,提供管理UI、基于角色的访问控制(RoleBasedAccessControl)、AD/LDAP集成,以及企业用户所需的审计日志记录(Auditlogging)等功能,同时恢复原始支持中文。Harbor的每个组件都构建为Docker容器,并使用DockerCompose进行部署。用于部署Harbor的DockerCompose模板位于/Deployer/docker-compose.yml,由5个容器组成:Proxy:由Nginx服务器组成的反向代理。Registry:由Docker官方开源的registry镜像组成的容器实例。UI:架构中的核心服务,组成这个容器的代码是Harbor项目的主体。Mysql:由官方的MySql镜像组成的数据库容器。日志:运行rsyslogd的容器以log-driver的形式收集其他容器的日志。这些容器以Dockerlink的形式连接在一起,容器之间通过容器名相互访问。对于最终用户,只需要暴露代理(即Nginx)的服务端口即可。Harbor的快速部署方式使用Docker-compose进行部署,后续所有的配置和部署都在$HARBOR_HOME/Deploy/`目录下完成,所以如无特殊说明,工作目录均在该目录下。首先,需要一个简单的配置。配置文件为harbor.cfg,配置项如下:hostname:hostname为外部可访问地址,即bindaddr,一般设置为本地公网IP。如果在内部使用DNS,则可以将其设置为主机名。auth_mode:Harbor支持两种认证方式。默认为本地存储,即账户信息存储在mysql下。本文首先使用本地存储的方式。另一种认证方式LDAP,将在后续章节单独介绍。设置完成后,配置文件为:hostname=42.62.x.xui_url_protocol=http#email_server=smtp.mydomain.com#email_server_port=25#email_username=sample_admin@mydomain.com#email_password=abc#email_from=admin##ThepasswordofHarboradmin,changethisbeforeanyproductionuse.harbor_admin_password=admin##Bydefaulttheauthmodeisdb_auth,i.e.thecredentialsarestoredinalocaldatabase.#Setittoldap_authifyouwanttoverifyausercredentialsagainstanLDAPserver.auth_mode=ldap_auth#Thepasswordfortherootuserofmysqldb,changethisbeforeanyproductionuse.db_password=root123#Switchforself-registrationfeatureself_registration=on运行./prepare脚本更新配置。Aftercompletingtheconfiguration,可以使用docker-compose快速部署harbor:docker-composeup-d安装完成后,访问WebUI,地址:http://bind_addr,为配置的hostname地址,端口为80。如图:使用harborWebUI安装完成后,打开WebUI,点击登录,默认账号为admin/Harbor12345,登录成功后进入项目管理界面:用户可以点击“我的项目”进行管理项目,如新建项目、用户和权限管理等。点击项目名称,进入项目下的图片管理界面,可以查看和调取图片。上面的docker客户端就是UI界面的使用。下面介绍如何使用docker客户端管理镜像。由于harbor只支持RegistryV2API,所以Docker客户端的版本必须>=1.6.0。由于我们将身份验证服务配置为使用http,因此Docker认为它不安全。要使用我们部署的镜像仓库,需要配置本地的docker。修改配置文件(/etc/default/docker)为:DOCKER_OPTS="$DOCKER_OPTS--insecure-registry42.62.x.x"其中42.62.x.x是我们部署Harbor的地址,也就是hostname配置的值物品。配置完成后需要重启docker服务。验证是否可以登录:dockerlogin42.62.x.x#dockerlogin-uadmin-pHarbor12345-etest@gmail.com42.62.x.x登录成功后显示如下:接下来我们上传一个镜像,以ubuntu镜像为举个例子,先从dockerhub上拉取ubuntu镜像:dockerpullubuntu:14.04然后在镜像上打上新标签,标签格式为:Harbor地址/项目名称/镜像名称:镜像标签,比如42.62.x.x/library/ubuntu:14.04:dockertagubuntu:14.0442.62.x.x/library/ubuntu:14.04push我们的镜像到harbor仓库:dockerpushubuntu:14.0442.62.x.x/library/ubuntu:14.04push成功后,我们可以使用dockerpull来从harbor仓库拉取我们的镜像,注意如果是私有项目,必须先使用dockerlogin登录:dockerpull42.62.x.x/library/ubuntu:14.04使用harbor作为镜像registryMirrorRegistry简介镜像是一个特殊的DockerRegistry类型,起到类似于代理服务器的缓存作用。用户和DockerHub之间的图像缓存。官方定义是:此类注册表由第三方托管基础设施提供,但仅针对其客户。一些机制确保公共镜像从赞助商注册表拉到镜像注册表,以确保第三方提供商的客户可以在本地docker拉取这些镜像。其基本工作原理是,当用户拉取镜像时,如果镜像在镜像服务器上存在,则直接从镜像服务器上拉取,否则,如果镜像不存在,则镜像服务器会自动代理拉取从dockerhub(可配置)获取镜像并将其缓存在镜像服务器中。客户再次拉取镜像时,会直接从镜像服务器拉取,不会再次从dockerhub拉取。请注意,Mirror和PrivateRegistry之间存在本质区别。PrivateRegistry是由开发者或企业建立的镜像仓库。通常用于存储企业内部的Docker镜像,用于内部开发流程和产品发布及版本控制。Mirror是一种代理传输服务。我们提供的镜像服务直接连接到DockerHub的官方注册中心。DockerHub上有数十万个各种Docker镜像。使用PrivateRegistry时,需要直接在DockerPull或Dockerfile中输入PrivateRegistry的地址,这通常会导致与PrivateRegistry绑定,缺乏灵活性。原理如图:Harbor目前不支持pullcache功能,已提交issue#120。不过我们只需要手动修改配置即可完成。具体配置请参考官方Registry作为pullthroughcache。在运行./prepare之前,我们修改config/registry/config.yml文件,添加如下配置:proxy:remoteurl:https://registry-1.docker.io如果需要访问私有仓库,需要填写dockerhub的用户名和密码:proxy:remoteurl:https://registry-1.docker.iousername:[username]password:[password]然后重启启动harbor服务:#注意不要执行./preparedocker-composestopdocker-composerm-fdocker-composeup-d除了设置harbor(或registry),还需要配置本地docker服务,指定--registry-mirror参数,修改docker配置文件(/etc/default/docker):DOCKER_OPTS="$DOCKER_OPTS--registry-mirror=http://42.62.x.x--insecure-registry42.62.x.x"注意把42.62.x.x换成你的registry地址。注意:修改docker配置文件后,必须重启docker服务才能生效。由于harbor引入了认证功能,所以在push操作的时候需要保证项目存在,比如pushkrystism/ffmpeg,必须保证harbor已经创建了krystism项目,否则会失败。为了能够正常push/pulldockerhub官方镜像,需要创建库工程,如图:假设本地不存在python镜像:dockerpullpython#pullfromdockerhubdockerrmipython#removetheimagedockerpullpython#yes,itwillpullfromharbornAfter我们第一次拉取python,harbor发现镜像不存在,于是我从dockerhub代理拉取,拉取后保存在本地,可以通过WebUI查看。客户端再次拉取python镜像时,由于镜像已经存在于harbor中,不需要从dockerhub中拉取,速度大大提升!连接LDAP认证Harbor支持两种认证方式,默认是本地存储,即账户信息存储在mysql下,上面已经详细介绍了。接下来介绍另一种认证方式LDAP。你只需要修改配置文件。您需要提供ldapurl和ldapbasedn参数,并将auth_mode设置为ldap_auth。快速部署LDAP服务为了测试方便,我们使用docker来启动一个LDAP服务器。启动脚本如下:#!/bin/bashNAME=ldap_serverdockerrm-f$NAME2>/dev/nulldockerrun--envLDAP_ORGANISATION="UnitedstackInc."--envLDAP_DOMAIN="ustack.com"\--envLDAP_ADMIN_PASSWORD="admin_password"-v`pwd`/containers/openldap/data:/var/lib/ldap-v`pwd`/containers/openldap/slapd.d:/etc/ldap/slapd.d--detach--name$NAMEosixia/openldap:1.1.2创建新用户,首先需要定义ldif文件,new_user.ldif:dn:uid=test,dc=ustack,dc=comuid:testcn:testsn:3objectClass:topobjectClass:posixAccountobjectClass:inetOrgPersonloginShell:/bin/bashhomeDirectory:/home/testuidNumber:1001gidNumber:1001userPassword:1q2w3e4rmail:test@example.comgecos:test通过以下脚本新建用户,其中ldap_server是LDAP服务容器名称。dockercpnew_user.ldifldap_server:/dockerexecldap_serverldapadd-x-D"cn=admin,dc=ustack,dc=com"-wadmin_password-f/new_user.ldif-ZZ查看用户是否创建成功:dockerexecldap_serverldapsearch-x-hlocalhost-bdc=ustack,dc=com-D"cn=admin,dc=ustack,dc=com"-wadmin_password查看test用户是否存在。如果存在,则说明创建成功。否则,您需要使用dockerlogs查看日志。配置harbor使用LDAP认证修改harbor.cfg文件关于LDAP配置项,如下:auth_mode=ldap_authldap_url=ldap://42.62.x.xldap_basedn=uid=%s,dc=ustack,dc=com然后重新部署harbor:./prepareddocker-composestopdocker-composerm-fdocker-composeup-d测试是否可以用测试用户登录:dockerlogin-utest-p1q2w3e4r-etest@example.com42.62.x.x查看结果。【本文为专栏作家“傅光平”原创文章,如需转载请get联系】点击查看更多该作者好文