docker——7、Docker私有Registry(Harbor)

一、Docker Registry分类

Registry用于保存docker镜像,包括镜像的层次结构和元数据
用户可自建Registry,也可使用官方的Docker hub
分类:

  • Sponsor Registry:第三方的registry,供客户和Docker使用

  • Mirror Registry:第三方的registry,只让客户使用

  • Vendor Registry:由发布Docker镜像的供应商提供的registry

  • Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry

    [[email protected] ~]# yum install docker-registry -y
    [[email protected] ~]# rpm -ql docker-distribution
    /etc/docker-distribution/registry/config.yml
    /usr/bin/registry
    /usr/lib/systemd/system/docker-distribution.service
    /usr/share/doc/docker-distribution-2.6.2
    /usr/share/doc/docker-distribution-2.6.2/AUTHORS
    /usr/share/doc/docker-distribution-2.6.2/CONTRIBUTING.md
    /usr/share/doc/docker-distribution-2.6.2/LICENSE
    /usr/share/doc/docker-distribution-2.6.2/MAINTAINERS
    /usr/share/doc/docker-distribution-2.6.2/README.md
    /var/lib/registry
    [[email protected] ~]# systemctl start docker-distribution
    [[email protected] ~]# docker tag myweb:v0.3-7 node2.change-can.com:5000/myweb:v0.3-7
    [[email protected] ~]# vim /etc/docker/daemon.json
    {
    “registry-mirrors”: [“http://hub-mirror.c.163.com”],
    “insecure-registries”: [“node2.change-can.com:5000”]
    }
    [[email protected] ~]# systemctl restart docker
    [[email protected] ~]# docker push node2.change-can.com:5000/myweb:v0.3-7
    The push refers to repository [node2.change-can.com:5000/myweb]
    7bcaffab5de6: Layer already exists
    f1d6039a7f54: Layer already exists
    59b059d445c1: Layer already exists
    0246bb21855f: Layer already exists
    42acf078bf60: Layer already exists
    7bff100f35cb: Layer already exists
    v0.3-7: digest: sha256:9194388a743c9f4b92c264b28971cb35862020abf1fc978afc840f10b6d429e4 size: 1568

二、Harbor

2.1 Harbor简介
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
官网:https://github.com/goharbor/harbor
安装文档:https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md
镜像的存储harbor使用的是官方的docker registry服务去完成,至于registry是用本地存储或者s3都是可以的,harbor的功能是在此之上提供用户权限管理、镜像复制等功能,提高使用的registry的效率。
通过docker registry 的API去拷贝,这不是省事,这种做法屏蔽了繁琐的底层文件操作、不仅可以利用现有docker registry功能不必重复造*,而且可以解决冲突和一致性的问题。

2.2 Harbor特性

  • 基于角色的访问控制:用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。多租户
  • 镜像复制 : 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
  • 图形化用户界面 : 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
  • AD/LDAP 支持 :Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
  • 审计管理 : 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
  • 国际化 : 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
  • RESTful API : RESTful API提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
  • 部署简单 : 提供在线和离线两种安装工具,也可以安装到vSphere平台(OVA方式)虚拟设备。

2.3 Harbor组件

  • Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务
  • Registry:负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token 进行解密验证。
  • Core services:这是Harbor的核心功能,主要提供以下服务:
  • UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。
  • webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。
  • token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
  • Database:为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。
  • Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。
  • Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。

各个组件之间的关系如下图所示:
docker——7、Docker私有Registry(Harbor)
主要组件包括proxy,他是一个nginx前端代理,主要是分发前端页面ui访问和镜像上传和下载流量,上图中通过深蓝色先标识;ui提供了一个web管理页面,当然还包括了一个前端页面和后端API,底层使用mysql数据库;registry是镜像仓库,负责存储镜像文件,当镜像上传完毕后通过hook通知ui创建repository,上图通过红色线标识,当然registry的token认证也是通过ui组件完成;adminserver是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候回需要加载adminserver的配置,通过灰色线标识;jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log,上图通过紫色线标识;log是日志汇总组件,通过docker的log-driver把日志汇总到一起,通过浅蓝色线条标识。

2.4 Harbor安装
下载安装程序:
Online installer:安装程序从Docker hub下载Harbor的图像。因此,安装程序的尺寸非常小。
Offline installer:当主机没有Internet连接时,请使用此安装程序。安装程序包含预先构建的图像,因此其大小较大。

[[email protected] ~]# yum info docker-compose
[[email protected] ~]# wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.1.tgz
[[email protected] ~]# tar xf harbor-offline-installer-v1.7.1.tgz -C /usr/local/
[[email protected] ~]# vim /usr/local/harbor/harbor.cfg
hostname = node2.change-can.com
ui_url_protocol = http
max_job_workers = 10 
customize_crt = on
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
secretkey_path = /data
admiral_url = NA
log_rotate_count = 50
log_rotate_size = 200M
http_proxy =
https_proxy =
no_proxy = 127.0.0.1,localhost,core,registry
email_identity = 
email_server = smtp.mydomain.com
email_server_port = 25
email_username = [email protected]
email_password = abc
email_from = admin <[email protected]>
email_ssl = false
email_insecure = false
harbor_admin_password = Harbor12345
auth_mode = db_auth
ldap_url = ldaps://ldap.mydomain.com
ldap_basedn = ou=people,dc=mydomain,dc=com
ldap_uid = uid 
ldap_scope = 2 
ldap_timeout = 5
ldap_verify_cert = true
ldap_group_basedn = ou=group,dc=mydomain,dc=com
ldap_group_filter = objectclass=group
ldap_group_gid = cn
ldap_group_scope = 2
self_registration = on
token_expiration = 30
project_creation_restriction = everyone
db_host = mysql
db_password = root123
db_port = 3306
db_user = root
redis_host = redis
redis_port = 6379
redis_password = 
redis_db_index = 1,2,3
clair_db_host = postgresql
clair_db_password = root123
clair_db_port = 5432
clair_db_username = postgres
clair_db = postgres
clair_updaters_interval = 12
uaa_endpoint = uaa.mydomain.org
uaa_clientid = id
uaa_clientsecret = secret
uaa_verify_cert = true
uaa_ca_cert = /path/to/ca.pem
registry_storage_provider_name = filesystem
registry_storage_provider_config =
registry_custom_ca_bundle = 
[[email protected] ~]# vim /usr/local/harbor/harbor.cfg 
[[email protected] ~]# grep "^[a-Z]" /usr/local/harbor/harbor.cfg
hostname = node2.change-can.com
ui_url_protocol = http
max_job_workers = 3 #小于等于CPU核心数
customize_crt = on
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
secretkey_path = /data
admiral_url = NA
log_rotate_count = 50
log_rotate_size = 200M
http_proxy =
https_proxy =
no_proxy = 127.0.0.1,localhost,core,registry
email_identity = 
email_server = smtp.mydomain.com
email_server_port = 25
email_username = [email protected]
email_password = abc
email_from = admin <[email protected]>
email_ssl = false
email_insecure = false
harbor_admin_password = Harbor12345
auth_mode = db_auth
ldap_url = ldaps://ldap.mydomain.com
ldap_basedn = ou=people,dc=mydomain,dc=com
ldap_uid = uid 
ldap_scope = 2 
ldap_timeout = 5
ldap_verify_cert = true
ldap_group_basedn = ou=group,dc=mydomain,dc=com
ldap_group_filter = objectclass=group
ldap_group_gid = cn
ldap_group_scope = 2
self_registration = on  #设置为 off 普通用户将无法自己实现注册,只能由管理员创建用户,主页右上角的注册按钮也会消失。
token_expiration = 30
project_creation_restriction = everyone
db_host = mysql
db_password = root123
db_port = 3306
db_user = root
redis_host = redis
redis_port = 6379
redis_password = 
redis_db_index = 1,2,3
clair_db_host = postgresql
clair_db_password = root123
clair_db_port = 5432
clair_db_username = postgres
clair_db = postgres
clair_updaters_interval = 12
uaa_endpoint = uaa.mydomain.org
uaa_clientid = id
uaa_clientsecret = secret
uaa_verify_cert = true
uaa_ca_cert = /path/to/ca.pem
registry_storage_provider_name = filesystem
registry_storage_provider_config =
registry_custom_ca_bundle = 
[[email protected] ~]# yum -y install docker-compose
[[email protected] harbor]# cd /usr/local/harbor/
[[email protected] harbor]# ./install.sh

安装过程中出现报错:
UnixHTTPConnectionPool(host=‘localhost’, port=None): Read timed out. (read timeout=60)
设置变量,再重试:
export DOCKER_CLIENT_TIMEOUT=120
export COMPOSE_HTTP_TIMEOUT=120
安装完成后出现提示“Harbor has been installed and started successfully”则安装成功

查看compose状态,状态都是UP
[[email protected] harbor]# docker-compose ps

在浏览器访问172.16.92.32,输入用户名admin,密码Harbor12345:
docker——7、Docker私有Registry(Harbor)
docker-compose pause #暂停服务