一文搞懂:企业级DockerRegistry——Harbor搭建和使用

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 一文搞懂:企业级DockerRegistry——Harbor搭建和使用

本节内容:


Harbor介绍


安装部署Harbor


环境要求


环境信息


安装部署harbor


配置harbor


配置存储


完成安装和启动harbor


访问Harbor


修改管理员密码


启动后相关容器


Harbor持久化数据和日志


管理Harbor的生命


停止harbor


启动harbor


修改配置后启动


清除harbor容器,保留镜像和数据


删除harbors数据库和镜像(用于干净的重新安装)


Harbor的安全机制


用户


成员


Harbor使用


镜像删除和空间回收


一、Harbor介绍


Harbor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,AD/LDAP集成以及审计日志等。


二、安装部署Harbor


官方安装文档:


1. 环境要求


python 2.7+


docker 1.10+


docker-compose 1.6.0+


Docker的安装见文章《Docker镜像和容器》和docker-compose的安装见文章《Registry私有仓库搭建及认证》。


2. 环境信息


主机名


操作系统版本


IP地址


安装软件


spark32


CentOS 7.0


172.16.206.32


docker-ce 17.06.1、docker-compose 1.15.0、harbor-online-installer-v1.1.2.tar


3. 安装部署harbor


【root@spark32 ~】# cd /opt/


【root@spark32 opt】# mkdir harbor


【root@spark32 opt】# cd harbor/


下载地址:


由于我这里服务器可以联网,离线版本又很大,所以下载的在线安装版本的1.1.2版本,将软件上传到/opt/harbor/目录下。


【root@spark32 harbor】# tar xvf harbor-online-installer-v1.1.2.tar


4. 配置harbor


可配置的参数在文件harbor.cfg中。在该文件中,有两种参数,必须配置的和可选的。


必须的:这些参数会在用户更新配置文件和执行install.sh脚本重新安装harbor起作用。你至少得设置 hostname 参数。


可选的:用户可以就使用默认值,或者在启动后通过web ui进行修改。如果这些可选参数被设置在harbor.cfg文件中,它们只会在第一次启动时起作用,以后在harbor.cfg文件中修改会被忽略。也就是说在 Harbor 初次启动时,Admin Server 从 harbor.cfg 文件读取配置并记录下来。之后重新启动Harbor的过程中,只有必需的配置会从 harbor.cfg 文件读取;其他可选的配置将不再生效,需要通过 Admin Server 的管理界面来修改。


//代码效果参考:http://hnjlyzjd.com/xl/wz_25442.html

【注意】:如果你通过web ui设置这些参数,请在harbor启动后立即设置。尤其是,必须先设置 auth_mode 在你注册或创建任何用户之前。

这些具体参数的名字和意义详见


【root@spark32 harbor】# cd harbor/


【root@spark32 harbor】# vim harbor.cfg


# 指定 hostname,为IP或者域名,用于登录 Web UI 界面


hostname = 172.16.206.32


# mysql 数据库 root 账户密码


db_password = 123456


# 邮件相关信息配置,如忘记密码发送邮件


email_server_port = 465


email_username = 01115004@wisedu.com


email_password = 123456


email_from = admin [span style="color: rgba(128, 0, 128, 1)">01115004@wisedu.com>


email_ssl = on


5. 配置存储


默认情况下,harbor把镜像存储在本地文件系统,在生产环境中,你可能考虑用其他的存储替代本地存储,比如S3, Openstack Swift, Ceph等等。你需要修改 common/templates/registry/config.yml 中的 storage 段。比如使用Openstack Swift,storage段的配置类似如下:


storage:


swift:


username: admin


password: ADMIN_PASS


authurl:


tenant: admin


domain: default


region: regionOne


container: docker_images


更详细的存储配置,见 Registry Configuration Reference


6. 完成安装和启动harbor


一旦harbor.cfg和后端存储(可选的)配置完成,就可以使用install.sh脚本安装和启动harbor了。注意在线安装可能需要等待一些时间从dockerhubs下载harbor镜像。


【注意】:请确保主机上80和443端口没被占用。如果想修改端口,需要去修改docker-compose.yml文件。


【root@spark32 harbor】# pwd


/opt/harbor/harbor


【root@spark32 harbor】# ./install.sh


我这里配置了阿里云容器加速,所以在线版安装没有问题,如果有网络问题可以选择离线包安装。


三、访问Harbor


浏览器输入


默认账号密码是admin/Harbor12345。默认是80端口,如果端口占用,我们可以去修改docker-compose.yml文件中,对应服务的端口映射。


我们可以看到系统各个模块如下:


项目:新增/删除项目,查看镜像仓库,给项目添加成员、查看操作日志、复制项目等


日志:仓库各个镜像create、push、pull等操作日志


系统管理


用户管理:新增/删除用户、设置管理员等


复制管理:新增/删除从库目标、新建/删除/启停复制规则等


配置管理:认证模式、复制、邮箱设置、系统设置等


其他设置


用户设置:修改用户名、邮箱、名称信息


修改密码:修改用户密码


【注意】:非系统管理员用户登录,只能看到有权限的项目和日志,其他模块不可见。


1. 修改管理员密码


点击右上角的admin,点击修改密码。


2. 启动后相关容器


Harbor的所有服务组件都是在Docker中部署的。


【root@spark32 harbor】# ls


common docker-compose.notary.yml docker-compose.yml harbor_1_1_0_template harbor.cfg install.sh LICENSE NOTICE prepare upgrade


【root@spark32 harbor】# docker-compose ps


Name Command State Ports


------------------------------------------------------------------------------------------------------------------------------


harbor-adminserver /harbor/harbor_adminserver Up


harbor-db docker-entrypoint.sh mysqld Up 3306/tcp


harbor-jobservice /harbor/harbor_jobservice Up


harbor-log /bin/sh -c crond && rm -f ... Up 127.0.0.1:1514->514/tcp


harbor-ui /harbor/harbor_ui Up


nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp


registry /entrypoint.sh serve /etc/ ... Up 5000/tcp


harbor-adminserver:用来管理系统配置,并提供了相应的 WEB 页面和 API 来供用户操作,改进了之前需用户手动修改配置文件并手动重启系统的用户体验。


harbor-db : 由官方MySql镜像构成的数据库容器


harbor-jobservice:是harbor的job管理模块,job在harbor里面主要是为了镜像仓库同步使用的。


harbor-log : 运行着rsyslogd的容器,通过log-driver的形式收集其他容器的日志


harbor-ui : 即架构中的core services, 构成此容器的代码是Harbor项目的主体


nginx : 由 nginx 服务器构成的反向代理


registry : 由Docker官方的开源 registry 镜像构成的容器实例


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


【注意】:之前的版本更新配置,需要修改harbor.cfg,然后停止并删除现有Harbor实例,再重新运行Harbor,比较繁琐。新版本的adminconsole可以使用户很方便地通过WEB界面配置认证、同步、邮件和系统等信息,修改立即生效,无需重启整个系统。


四、Harbor持久化数据和日志


默认情况下,registrys数据被持久化在宿主机的/data/目录下,甚至你删除harbor容器或者重新被创建,这部分数据也不会改变。


另外,harbor使用rsyslog来收集每一个容器日志,默认情况下,这些日志存放在宿主机的/var/log/harbor/目录下。


五、管理Harbor的生命


可以使用docker-compose来管理harbor的启动、停止和销毁。但是注意必须切换到docker-compose.yml同级目录运行以下的命令。


1. 停止harbor


# docker-compose stop


2. 启动harbor


# docker-compose start


3. 修改配置后启动


先停止harbor,在修改配置文件harbor.cfg,然后运行prepare脚本应用配置,最后重新创建harbor并运行它。


# docker-compose down -v


# vim harbor.cfg


# prepare


# docker-compose up -d


4. 清除harbor容器,保留镜像和数据


# docker-compose down -v


5. 删除harbors数据库和镜像(用于干净的重新安装)


# rm -r /data/database


# rm -r /data/registry


六、Harbor的安全机制


企业中的软件研发团队往往划分为诸多角色,如项目经理、产品经理、测试、运维等。在实际的软件开发和运维过程中,这些角色对于镜像的使用需求是不一样的。比如:开发人员需要拥有对镜像的读写(PULL/PUSH)权限以更新和改正代码;测试人员中需要读取(PULL)权限;而项目经理需要对上述的角色进行管理。


Harbor为这种需求提供了用户和成员两种管理概念。


1. 用户


用户主要分两类:


管理员


普通用户


两类用户都可以成为项目的成员。而管理员可以对用户进行管理。


2. 成员


成员是对应于项目的概念,分为三类:


管理员


开发者


访客


管理员可以对开发者和访客作权限的配置和管理。测试和运维人员可以访客身份读取项目镜像,或者公共镜像库中的文件。


从项目的角度出发,项目管理员拥有最大的项目权限,如果要对用户进行禁用或限权等,可以通过修改用户在项目中的成员角色来实现,甚至将用户移除出这个项目。


下面以实际操作来演示。


七、Harbor使用


官方使用文档:


注意:当项目设为公开后,任何人都有此项目下镜像的读权限。命令行用户不需要“docker login”就可以拉取此项目下的镜像。所以一般需要建立私有项目。


1. 登录harbor,点击“+项目”


2. 点击左侧菜单“用户管理”,点击“+用户”


3. 点击左侧菜单项目,选择刚才创建的项目“godseye”,在点击右侧正文中的选项卡“成员”,点击“+成员”,输入刚才创建的用户,并设置其为管理员。


对于权限(角色),项目管理员和开发人员可以有 push 的权限,而访客只能查看和 pull


4. 测试


我这里找了另外一台机器,安装了docker 1.12.6。由于这里harbor采用了默认的 http 方式连接,而 Docker 认为这是不安全的,所以在 push 之前需要调整一下 docker 配置:


【root@node3 ~】# vim /etc/docker/daemon.json


{


"insecure-registries": 【"172.16.206.32"】


}


【root@node3 ~】# systemctl restart docker


登录harbor:


【root@node3 ~】# docker login 172.16.206.32


Username: jkzhao


Password:


Login Succeeded


然后 tag 一个 image,名称一定要标准( registryAddress【:端口】/项目/imageName【:tag】 ),最后将其 push 即可


【root@node3 ~】# docker tag centos:centos7 172.16.206.32/godseye/centos:latest


【root@node3 ~】# docker push 172.16.206.32/godseye/centos:latest


然后到web ui上查看刚才push的镜像是否成功了:


【补充】:如果使用的docker客户端版本比较低,比如在centos6上安装了docker 1.7.1,那么同样需要先调整docker的配置:


【root@osb30 ~】# vim /etc/sysconfig/docker


other_args="--insecure-registry=172.16.206.32"


八、镜像删除和空间回收


Docker命令没有提供Registry镜像删除功能,日积月累,将会产生许多无用的镜像,占用大量存储空间。若要删除镜像并回收空间,需要调用docker registry API来完成,比较麻烦。Harbor提供了可视化的镜像删除界面,可以逻辑删除镜像。在维护状态下可以回收垃圾镜像的空间。


【root@node3 ~】# docker images


REPOSITORY TAG IMAGE ID CREATED SIZE


java openjdk-8-jre-alpine d61ff40a5bf6 16 months ago 108.3 MB


【root@node3 ~】# docker login 172.16.206.32


Username: jkzhao


Password:


Login Succeeded


【root@node3 ~】# docker tag java:openjdk-8-jre-alpine 172.16.206.32/godseye/jdk:openjdk-8-jre-alpine


【root@node3 ~】# docker push 172.16.206.32/godseye/jdk:openjdk-8-jre-alpine


我们先查看下宿主机上存放镜像的目录大小:


【root@spark32 2017-09-08】# du -sh /data/registry/docker/registry/v2/


110M /data/registry/docker/registry/v2/


登录harbor界面,点击godseye项目,删除刚才上传的镜像:


但是实际上这只是逻辑删除,我们可以查看此时宿主机上存放镜像的目录大小,仍然是110M:


【root@spark32 2017-09-08】# du -sh /data/registry/docker/registry/v2/


110M /data/registry/docker/registry/v2/


此时你完全可以再次上传这个镜像,会显示这些镜像层已经存在了:


【root@node3 ~】# docker push 172.16.206.32/godseye/jdk:openjdk-8-jre-alpine


The push refers to a repository 【172.16.206.32/godseye/jdk】


2b4866cc0048: Layer already exists


5f70bf18a086: Layer already exists


8f01a53880b9: Layer already exists


openjdk-8-jre-alpine: digest:sha256:56b1ffe13af2ee1c5e2c9a3d3cd8c377b5f1bc6130a87648d48ba3fffab0d5eb size: 1977


那么如何彻底删除这个镜像呢?


1.首先去界面删除这个镜像


2.在harbor宿主机上执行如下的命令:


先找到当前的registry版本:


【root@spark32 harbor】# docker images vmware/registry


REPOSITORY TAG IMAGE ID CREATED SIZE


vmware/registry 2.6.1-photon 0f6c96580032 3 months ago 150MB


列出要删除的镜像:


【root@spark32 harbor】# docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.1-photon garbage-collect --dry-run /etc/registry/config.yml


选项 --dry-run 只是在最后打印出界面删除了的但是实际上并未删除的镜像层,但是这条命令不会删除这些镜像层。


运行下面的命令删除镜像:


【root@spark32 harbor】# docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.1-photon garbage-collect /etc/registry/config.yml


再次查看存放镜像的目录大小:


【root@spark32 2017-09-08】# du -sh /data/registry/docker/registry/v2/


70M /data/registry/docker/registry/v2/

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7月前
|
分布式计算 Java Linux
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
Docker 是一套构建在 Linux 内核之上的高级工具,旨在帮助开发人员和运维人员更轻松地交付应用程序和依赖关系,实现跨系统和跨主机的部署。使用安全且轻量级的容器环境来实现这一目标。容器可以手动创建,也可以通过编写 Dockerfile 自动创建。开发人员和运维人员可以将应用程序及其依赖打包到容器中,实现应用程序的可移植性和环境一致性。
263 5
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
|
网络协议 应用服务中间件 网络安全
Harbor企业级镜像管理系统实战
Harbor企业级镜像管理系统实战
180 0
|
4月前
|
监控 NoSQL 关系型数据库
一文吃透企业级elk技术栈:5. logstatsh 安装配置
一文吃透企业级elk技术栈:5. logstatsh 安装配置
|
7月前
|
存储 运维 Linux
精彩推荐 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
在使用Docker时,管理维护工作可能会显得复杂。然而,实际上,Docker提供了许多便捷且人性化的工具,这些工具的使用技巧可以大大简化维护工作,并提升效率。通过掌握这些技巧,你不仅能够更轻松地管理Docker环境,还能展现出专业的能力。接下来我们就给大家介绍一下对于我在工作当中对于Docker容器使用的技术实战总结
84 2
精彩推荐 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
|
7月前
|
Cloud Native Shell Linux
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
96 0
|
7月前
|
Cloud Native Linux 虚拟化
云原生专题 |【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(底层实现系列)
云原生专题 |【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(底层实现系列)
205 0
|
Kubernetes jenkins 持续交付
膜拜!阿里内部爆款K8s+Docker+Jenkins实战笔记,不能再详细了!
膜拜!阿里内部爆款K8s+Docker+Jenkins实战笔记,不能再详细了!
|
Kubernetes 监控 Java
K8s企业级管理神器:Rancher 你值得拥有!
K8s企业级管理神器:Rancher 你值得拥有!
|
应用服务中间件 Linux nginx
企业应用交付Docker镜像进阶实战笔记(上)
企业应用交付Docker镜像进阶实战笔记
113 0
企业应用交付Docker镜像进阶实战笔记(上)
|
Cloud Native Docker 容器
【云原生Docker系列第十一篇】Docker harbor私有仓库部署与管理(有故事的人根本不会讲故事)(二)
【云原生Docker系列第十一篇】Docker harbor私有仓库部署与管理(有故事的人根本不会讲故事)(二)
141 0
【云原生Docker系列第十一篇】Docker harbor私有仓库部署与管理(有故事的人根本不会讲故事)(二)
下一篇
DataWorks