本节内容:

  • Harbor介绍
  • 安装部署Harbor
    • 环境要求
    • 环境信息
    • 安装部署harbor
    • 配置harbor
    • 配置存储
    • 完成安装和启动harbor
  • 访问Harbor
    • 修改管理员密码
    • 启动后相关容器
  • Harbor持久化数据和日志
  • 管理Harbor的生命
    • 停止harbor
    • 启动harbor
    • 修改配置后启动
    • 清除harbor容器,保留镜像和数据
    • 删除harbors数据库和镜像(用于干净的重新安装)
  • Harbor的安全机制
    • 用户
    • 成员
  • Harbor使用
  • 镜像删除和空间回收

一、Harbor介绍

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

二、安装部署Harbor

官方安装文档:
https://github.com/vmware/harbor/blob/master/docs/installation_guide.md

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/

下载地址:https://github.com/vmware/harbor/releases

由于我这里服务器可以联网,离线版本又很大,所以下载的在线安装版本的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 的管理界面来修改。

【注意】:如果你通过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 =
# 邮件相关信息配置,如忘记密码发送邮件
email_server = smtp.exmail.qq.com
email_server_port =
email_username = @wisedu.com
email_password =
email_from = admin <@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

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

三、访问Harbor

浏览器输入http://172.16.206.32

默认账号密码是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 /tcp
harbor-jobservice /harbor/harbor_jobservice Up
harbor-log /bin/sh -c crond && rm -f ... Up 127.0.0.1:->/tcp
harbor-ui /harbor/harbor_ui Up
nginx nginx -g daemon off; Up 0.0.0.0:->/tcp, 0.0.0.0:->/tcp, 0.0.0.0:->/tcp
registry /entrypoint.sh serve /etc/ ... Up /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使用

官方使用文档: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--jre-alpine d61ff40a5bf6 months ago 108.3 MB
[root@node3 ~]# docker login 172.16.206.32
Username: jkzhao
Password:
Login Succeeded
[root@node3 ~]# docker tag java:openjdk--jre-alpine 172.16.206.32/godseye/jdk:openjdk--jre-alpine
[root@node3 ~]# docker push 172.16.206.32/godseye/jdk:openjdk--jre-alpine

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

[root@spark32 --]# du -sh /data/registry/docker/registry/v2/
110M /data/registry/docker/registry/v2/

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

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

[root@spark32 --]# du -sh /data/registry/docker/registry/v2/
110M /data/registry/docker/registry/v2/

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

[root@node3 ~]# docker push 172.16.206.32/godseye/jdk:openjdk--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--jre-alpine: digest:sha256:56b1ffe13af2ee1c5e2c9a3d3cd8c377b5f1bc6130a87648d48ba3fffab0d5eb size:

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

1.首先去界面删除这个镜像
2.在harbor宿主机上执行如下的命令:

先找到当前的registry版本:

[root@spark32 harbor]# docker images vmware/registry
REPOSITORY TAG IMAGE ID CREATED SIZE
vmware/registry 2.6.-photon 0f6c96580032 months ago 150MB

列出要删除的镜像:

[root@spark32 harbor]# docker run -it --name gc --rm --volumes-from registry vmware/registry:2.6.-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.-photon garbage-collect  /etc/registry/config.yml

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

[root@spark32 --]# du -sh /data/registry/docker/registry/v2/
70M /data/registry/docker/registry/v2/

企业级Docker Registry —— Harbor搭建和使用的更多相关文章

  1. 搭建企业级Docker Registry -- Harbor

    Harbor 是一个企业级的 Docker Registry,可以实现 images 的私有存储和日志统计权限控制等功能,并支持创建多项目(Harbor 提出的概念),基于官方 Registry V2 ...

  2. 企业级镜像仓库harbor搭建

    企业级镜像仓库harbor搭建 一.    Harbor概述 VMware公司最近开源了企业级Registry项目Harbor,其的目标是帮助用户迅速搭建一个企业级的Docker registry 服 ...

  3. docker仓库harbor搭建

    1.安装docker-compose [root@docker02 ~]# yum install epel-release [root@docker02 ~]# pip install docker ...

  4. 使用docker Registry快速搭建私有镜像仓库

    当我们执行docker pull xxx的时候,docker默认是从registry.docker.com这个地址上去查找我们所需要的镜像文件,然后执行下载操作.这类的镜像仓库就是docker默认的公 ...

  5. Harbor 企业级 Docker Registry

    HarBor项目:https://github.com/vmware/harbor 下载:https://github.com/vmware/harbor/releases 安装文档:https:// ...

  6. [转]Ubuntu18.04下使用Docker Registry快速搭建私有镜像仓库

    本文转自:https://blog.csdn.net/BigData_Mining/article/details/88233015 1.背景 在 Docker 中,当我们执行 docker pull ...

  7. docker仓库harbor搭建随笔

    docker除了自己的registry仓库工具外,还有vmware出品的harbor,harbor集成了ui界面,用户级别认证,重要的是对镜像管理比较全面,可以删除镜像,下面是 简单的部署指南 首先: ...

  8. 企业级docker仓库Harbor部署

    1.安装环境下载离线安装包地址https://github.com/vmware/harbor/releases/yum install -y dockerpip install -i https:/ ...

  9. 搭建harbor企业级私有registry

    主机环境要求 硬件Hardware Resource Capacity Description CPU minimal 2 CPU 4 CPU is prefered Mem minimal 4GB ...

随机推荐

  1. Kubernetes Deloyment实现滚动更新

    目录 滚动更新简介 使用kubectl rolling-update更新RC Deployment的rolling-update 滚动更新简介 当kubernetes集群中的某个服务需要升级时,传统的 ...

  2. Java基础-Collection子接口之Set接口

    Java基础-Collection子接口之Set接口 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学习Collection接口时,记得Collection中可以存放重复元素,也可 ...

  3. 科学计算三维可视化---TVTK管线与数据加载(数据集)

    一:数据集 三维可视化的第一步是选用合适的数据结构来表示数据,TVTK提供了多种表示不同种类数据的数据集 (一)数据集--ImageData >>> from tvtk.api im ...

  4. python---协程理解

    推文:python---基础知识回顾(七)迭代器和生成器 推文:Python协程深入理解(本文转载于该文章) 从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数.yield在协程中 ...

  5. 深入剖析linq的联接

    内联接 代码如下 from a in new List<string[]>{ ]{"张三","男"}, ]{"李四"," ...

  6. A Gentle Guide to Machine Learning

    A Gentle Guide to Machine Learning Machine Learning is a subfield within Artificial Intelligence tha ...

  7. 多年前写的DataTable与实体类的转换

    介绍 介绍 很多年前一直使用Ado.net,后来慢慢转型到其他的orm,在转型过程中,有意向将两者的模型结合起来,利用DataTable中的行状态完善一些mvc中的数据控制作用.现在把它放出来,留个纪 ...

  8. 手把手教你在.NET中创建Web服务

    最近发现在.NET平台下使用Web服务还是很简单的.下面举个在.NET平台下创建Web服务的简单例子.首先用Visul Studio .Net创建一个C# 项目Asp.Net Web服务程序,源代码如 ...

  9. slice层解析

    如果说之前的Concat是将多个bottom合并成一个top的话,那么这篇博客的slice层则完全相反,是把一个bottom分解成多个top,这带来了一个问题,为什么要这么做呢?为什么要把一个低层的切 ...

  10. MySQL Sakila样本数据库

    Sakila样本数据库介绍 Sakila样本数据库是MySQL官方提供的一个模拟DVD租赁信息管理的数据库,提供了一个标准模式,可作为书中例子,教程.文章.样品,等等,对学习测试来说是个不错的选择. ...