Harbor简介
  Harbor是一个用于存储和分发Docker镜像的企业级Registry的服务器镜像仓库,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有的Registry中,确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
  
二、Harbor的特性:
基于角色的访问控制:用户与Docker镜像仓库通过"项目"进行组织和管理,一个用户可以对多
          个镜像仓库在同一个命名空间(project)里有不同的权限。
镜像复制:镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云
     和多云场景。
图形化用户场景:用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
AD/LDAP支持:Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
国际化:已拥有英文、中文、德文、日文好俄文的本地化版本。更多的语言将被添加进来。
RESTful API:RESTful API提供给管理员对于Harbor更多的操控,使得与其它管理软件集成变得
       更容易。
部署简单:提供在线和离线两种工具,也可以安装到vSphere平台(OVA方式)虚拟设备。

三、Harbor的组件
Harbor在架构上主要由6个组件构成:
Proxy:Harbor的代理程序,Harbor的registry、UI、token等服务,通过一个前置的反向代理统一
    接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务处理。
Registry:负责存储Docker的镜像,并处理docker的pull/push命令。由于我们要对用户进行访问
     控制,即不同用户对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客户端向Registry服
     务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进
     行请求。
Database:为core services提供数据库服务器,负责存储用户权限、审计、Docker image分组信
     息等数据。
Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。
Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。

各组件之间的关系如图所示:

harbor仓库自建证书 harbor仓库是什么_bc

环境名称

版本

系统版本

CentOS Linux release 7.5.1804

docker-ce

19.03.1

Harbor版本

harbor-offline-installer-v1.5.0.tgz

docker-compose版本

1.24.1

实验:

docker-compose的安装
#配置阿里的base源和epel源
 [root@docker ~]# cat /etc/yum.repos.d/CentOS-Base.repo | grep -v "^#" 
 [base]
 name=CentOS-$releasever - Base - mirrors.aliyun.com
 failovermethod=priority
 baseurl=http://mirrors.aliyun.com/centos/7/os/$basearch/
 gpgcheck=0[root@docker ~]# cat /etc/yum.repos.d/epel.repo 
 [epel]
 name=Extra Packages for Enterprise Linux 7 - $basearch
 mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
 enabled=1
 gpgcheck=0#安装Python-pip
  yum install python2-pip -y
 ............................................
 #升级Python-pip
  pip install --upgrade pip#安装docker-compose
  pip install docker-compose
 .................................
 ERROR: Cannot uninstall 'requests'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
 如果报一上的错误我们需要执行以下命令"pip install docker-compose --ignore-installed requests"
 #查看docker-compose版本
  docker-compose -v
 docker-compose version 1.24.1, build 4667896
  安装harbor
#下载1.5.0离线安装包
 wget https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.5.0.tgz#解压并修改配置文件、安装
  cd /application/
  ls
 harbor-offline-installer-v1.5.0.tgz 
 tar xf harbor-offline-installer-v1.5.0.tgz 
 cat harbor.cfg |grep -v ^$|grep -v ^#_version = 1.5.0
hostname = docker #需要写IP地址或者域名
ui_url_protocol = http
max_job_workers = 50
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,ui
email_identity =
email_server = smtp.mydomain.com
email_server_port = 25
email_username = sample_admin@mydomain.com
email_password = abc
email_from = admin <sample_admin@mydomain.com>
email_ssl = false
email_insecure = false
harbor_admin_password = 12345 #harbor登录密码
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
clair_db_host = postgres
clair_db_password = password
clair_db_port = 5432
clair_db_username = postgres
clair_db = postgres
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 =
 #安装并启动
 #安装之前需要启动docker,如果docker服务重启了harbor程序也必须要重新启动
 [root@docker harbor]# ./install.sh
 .............................................

harbor仓库自建证书 harbor仓库是什么_开发语言_02

 

 

使用Harbor上传下载镜像
连接登录harbor 

# docker login 192.168.126.155
 输入用户名admin/Harbor12345
 Login Succeeded #显示此字段说明登录成功可以上传下载镜像#连接报错解决
 Error response from daemon: Get https://docker/v2/: dial tcp 192.168.100.100:443: connect: connection refused#报错分析
 Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是我们搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误。#解决办法:
 #修改docker的主配置文件
 [root@docker harbor]# vim /etc/docker/daemon.json 
 {
         "registry-mirrors":["https://registry.docker-cn.com"],
         "insecure-registries":["192.168.100.100"]    #添加信任的IP地址信息
 }#重启docker服务和harbor应用程序
 systemctl daemon-reload 
 systemctl restart docker
 docker-compose down
  docker-compose up #再次尝试登录
 docker login 192.168.100.100
 Username: admin
 Password: 
 WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
 Configure a credential helper to remove this warning. See
 https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded

访问harbor的web界面

harbor仓库自建证书 harbor仓库是什么_Docker_03

使用Harbor上传下载镜像
连接登录harbor

# docker login 192.168.100.100
 输入用户名admin/Harbor12345
 Login Succeeded #显示此字段说明登录成功可以上传下载镜像#连接报错解决
 Error response from daemon: Get https://docker/v2/: dial tcp 192.168.13.129:443: connect: connection refused#报错分析
 Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是我们搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误。#解决办法:
 #修改docker的主配置文件
 vim /etc/docker/daemon.json 
 {
         "registry-mirrors":["https://registry.docker-cn.com"],
         "insecure-registries":["192.168.100.100"]    #添加信任的IP地址信息
 }#重启docker服务和harbor应用程序
 systemctl daemon-reload 
 systemctl restart docker
 docker-compose down
 docker-compose up #再次尝试登录
 docker login 192.168.100.100
 Username: admin
 Password: 
 WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
 Configure a credential helper to remove this warning. See
 https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded


 

上传镜像
在Harbor上新创建一个项目供上传使用

harbor仓库自建证书 harbor仓库是什么_bc_04

给本地镜像打标签

docker tag  httpd:latest  192.168.100.100/test/httpd:v0.1
 docker image ls 192.168.100.100/test/httpd
 REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
 192.168.100.100/test/httpd   v0.1                7d85cc3b2d80        10 days ago         154MB
 推送镜像到远程仓库harbor上docker   push   192.168.100.100/test/httpd:v0.1 
 The push refers to repository [192.168.100.100/test/httpd]
 9e0ab3afff15: Pushed 
 7a0960d9b679: Pushed 
 8b16516271d6: Pushed 
 5bcb93651a74: Pushed 
 1c95c77433e8: Pushed 
 v0.1: digest: sha256:90cca2f9c32ad25afa180da6b14f35de9990cb02b9007350a5bccef4cac1e1c9 size: 1367
 拉取镜像[root@docker ~]# docker image rm  192.168.100.100/test/httpd:v0.1 
 Untagged: 192.168.100.100/test/httpd:v0.1
 Untagged: 192.168.100.100/test/httpd@sha256:90cca2f9c32ad25afa180da6b14f35de9990cb02b9007350a5bccef4cac1e1c9
 docker  pull   192.168.100.100/test/httpd:v0.1 
 v0.1: Pulling from test/httpd
 Digest: sha256:90cca2f9c32ad25afa180da6b14f35de9990cb02b9007350a5bccef4cac1e1c9
 Status: Downloaded newer image for 192.168.100.100/test/httpd:v0.1
 192.168.100.100/test/httpd:v0.1
 [root@docker ~]# docker image ls 192.168.100.100/test/httpd:v0.1 
 REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
 192.168.100.100/test/httpd   v0.1                7d85cc3b2d80        10 days ago         154MB