本节内容:java
Harbor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而得到了更加普遍的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,AD/LDAP集成以及审计日志等。node
官方安装文档:
https://github.com/vmware/harbor/blob/master/docs/installation_guide.mdpython
1. 环境要求mysql
Docker的安装见文章《Docker镜像和容器》和docker-compose的安装见文章《Registry私有仓库搭建及认证》。nginx
2. 环境信息git
主机名 | 操做系统版本 | IP地址 | 安装软件 |
spark32 | CentOS 7.0 | 172.16.206.32 | docker-ce 17.06.一、docker-compose 1.15.0、harbor-online-installer-v1.1.2.tar |
3. 安装部署harborgithub
[root@spark32 ~]# cd /opt/ [root@spark32 opt]# mkdir harbor [root@spark32 opt]# cd harbor/
下载地址:https://github.com/vmware/harbor/releasesweb
因为我这里服务器能够联网,离线版本又很大,因此下载的在线安装版本的1.1.2版本,将软件上传到/opt/harbor/目录下。sql
[root@spark32 harbor]# tar xvf harbor-online-installer-v1.1.2.tar
4. 配置harbordocker
可配置的参数在文件harbor.cfg中。在该文件中,有两种参数,必须配置的和可选的。
【注意】:若是你经过web ui设置这些参数,请在harbor启动后当即设置。尤为是,必须先设置 auth_mode 在你注册或建立任何用户以前。
这些具体参数的名字和意义详见https://github.com/vmware/harbor/blob/master/docs/installation_guide.md
[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 = smtp.exmail.qq.com email_server_port = 465 email_username = 01115004@wisedu.com email_password = 123456 email_from = admin <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: http://keystone_addr:35357/v3/auth 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
我这里配置了阿里云容器加速,因此在线版安装没有问题,若是有网络问题能够选择离线包安装。
浏览器输入http://172.16.206.32
默认帐号密码是admin/Harbor12345。默认是80端口,若是端口占用,咱们能够去修改docker-compose.yml文件中,对应服务的端口映射。
咱们能够看到系统各个模块以下:
【注意】:非系统管理员用户登陆,只能看到有权限的项目和日志,其余模块不可见。
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
这几个 Contianer 经过 Docker link 的形式链接在一块儿,在容器之间经过容器名字互相访问。对终端用户而言,只须要暴露 proxy(即Nginx)的服务端口。
【注意】:以前的版本更新配置,须要修改harbor.cfg,而后中止并删除现有Harbor实例,再从新运行Harbor,比较繁琐。新版本的adminconsole可使用户很方便地经过WEB界面配置认证、同步、邮件和系统等信息,修改当即生效,无需重启整个系统。
默认状况下,registrys数据被持久化在宿主机的/data/目录下,甚至你删除harbor容器或者从新被建立,这部分数据也不会改变。
另外,harbor使用rsyslog来收集每个容器日志,默认状况下,这些日志存放在宿主机的/var/log/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
企业中的软件研发团队每每划分为诸多角色,如项目经理、产品经理、测试、运维等。在实际的软件开发和运维过程当中,这些角色对于镜像的使用需求是不同的。好比:开发人员须要拥有对镜像的读写(PULL/PUSH)权限以更新和改正代码;测试人员中须要读取(PULL)权限;而项目经理须要对上述的角色进行管理。
Harbor为这种需求提供了用户和成员两种管理概念。
1. 用户
用户主要分两类:
两类用户均可以成为项目的成员。而管理员能够对用户进行管理。
2. 成员
成员是对应于项目的概念,分为三类:
管理员能够对开发者和访客做权限的配置和管理。测试和运维人员能够访客身份读取项目镜像,或者公共镜像库中的文件。
从项目的角度出发,项目管理员拥有最大的项目权限,若是要对用户进行禁用或限权等,能够经过修改用户在项目中的成员角色来实现,甚至将用户移除出这个项目。
下面以实际操做来演示。
官方使用文档:https://github.com/vmware/harbor/blob/master/docs/user_guide.md
注意:当项目设为公开后,任何人都有此项目下镜像的读权限。命令行用户不须要“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/