Docker Harbor概述及构建

目录

引言

一、Docker Harbor 概述

1.1  harbor  简介

1.2  Harbor的优势

1.3  Harbor 的核心组件

1.4  Docker私有仓库 架构

二、Harbor构建Docker私有仓库

案例需求

2.1  环境配置

2.2  部署Harbor服务

2.2.1  上传dock-compose,并设置权限

2.2.2  安装harbor-offline-installer-v1.2.2

2.2.3  配置Harbo参数文件

2.2.4  启动Harbor

2.3  查看Harbor启动镜像和容器

2.3.1  查看镜像 

2.3.2  检查服务容器是否开启

​编辑

2.4  在UI界面创建项目

2.5  在本地测试仓库功能

2.6  在客户端上,上传镜像

2.6.1 错误现象

​编辑

2.6.2   解决方法

​编辑

扩展:错误集

2.6.3  上传镜像

​编辑

 2.7  维护管理Harbor

2.7.1 停止现有的 Harbor 实例

​编辑

2.7.2  修改配置文件 Harbor.cfg

2.7.3  运行prepare脚本来填充配置

​编辑

2.7.4  重启服务

​编辑

三、创建Harbor用户

3.1  新建用户

3.2  在客户端上操作,删除之前打标签的镜像

3.3  移除 Harbor 服务容器同时保留镜像数据/数据库

四、关于Harbor.cfg 配置文件中有两类参数:所需参数和可选参数

4.1  所需参数

4.2  可选参数

五、总结

harbor 核心组件

hatbor工作原理


引言

部署企业私有仓库往往是很有必要的, 它可以帮助你管理企业的一些敏感镜像同时由于Docker Hub的下载速度和GFW的原因, 往往需要将一些无法直接下载的镜像导入本地私有仓库而Harbor就是部署企业私有仓库的一个不二之选。

一、Docker Harbor 概述

1.1  harbor  简介

Harbor是VMware公司开源的企业级Docker Registry 项目,其目标是帮助用户迅速搭建一个 企业级的Docker Registry 服务。
Harbor以Docker 公司开源的Registry 为基础,提供了图形管理UI、基于角色的访问控制(Role Based AccessControl)、AD/LDAP集成、以及审计日志(Auditlogging)等企业用户需求的功能,同时还原生支持中文。
Harbor的每个组件都是以Docker 容器的形式构建的,使用docker - compose来对它进行部署。用于部署Harbor 的docker- compose模板位于harbor/ docker-compose.yml。

1.2  Harbor的优势

基于角色控制:用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不同的权限。
基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制(同步),
支持LDAP/AD: Harbor 可以集成企业内部有的AD/LDAP (类似数据库的一-张表),用于对已经存在的用户认证和管理。
镜像删除和垃圾回收:镜像可以被删除,也可以回收镜像占用的空间。
图形化用户界面:用户可以通过浏览器来浏览,搜索镜像仓库以及对项目进行管理。
审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
支持RESTful API: RESTful API提供给管理员对于Harbor 更多的操控,使得与其它管理软件集成变得更容易。
Harbor和docker registry的关系: Harbor实质上是对docker registry做了封装,扩展了自己的业务模板。

1.3  Harbor 的核心组件

Harbor在架构上主要有Proxy、 Registry、 Core services、 Database ( Harbor-db)、Log collector ( Harbor-log)、Job services  六个组件。

1.Proxy: Harbor 的Registry、UI、Token 服务等组件,都处在nginx 反向代理后边。

  • 该代理将来自浏览器、docker clients .的请求转发到后端不同的服务上。

2.Registry:负责储存Docker 镜像,并处理Docker push/pull 命令。

  • 由于要对用户进行访问控制,即不同用户对Docker镜像有不同的读写权限,Registry 会指向一个Token 服务,强制用户的每次Docker pull/push 请求都要携带一个合法的Token,Registry会通过公钥对Token 进行解密验证。

3.Core services: Harbor的核心功能,主要提供以下3个服务:

  • UI (harbor-ui) :提供图形化界面,帮助用户管理Registry. 上的镜像(image) ,并对用户进行授权。
  • WebHook: 为了及时获取Registry.上 image状态变化的情况,在Registry上配置Webhook, 把状态变化传递给UI模块。
  • Token 服务:负责根据用户权限给每个Docker push/pull 命令签发Token。 Docker 客户端向Registry 服务发起的请求,如果不包含Token, 会被重定向到Token 服务,获得Token 后再重新向Registry 进行请求。

4.  Database (harbor-db) :为core services提 供数据库服务,负责储存用户权限、审计日志、Docker镜像分组信息等数据。

5.Job services:主要用于镜像复制,本地镜像可以被同步到远程Harbor实例上。

6.Log collector (harbor-log) :负责收集其他组件的日志到一个地方。

Harbor的每个组件都是以Docker 容器的形式构建的,因此,使用Docker Compose 来对它进行部署。

总共分为7个容器运行,通过在docker- compose . yml所在目录中执行docker-compose ps命令来查看,名称分别为: nginx、harbor-jobservice、harbor-ui、harbor-db、harbor-adminserver、registry、harbor-log。
其中harbor-adminserver主要是作为一个后端的配置数据管理,并没有太多的其他功能。harbor-ui所要操作的所有数据都通过harbor:-adminserver这样一个数据配置管理中心来完成。

1.4  Docker私有仓库 架构

如上图所示:
所有的请求都经过proxy代理,proxy代理转发给Core services和Registry,其中Core services包括UI界面、token令牌和webhook网页服务功能,Registry主要提供镜像存储功能。如果要进行下载上传镜像,要经过token令牌验证然后从Registry获取或上传镜像,每一次下载或上传都会生成日志记录,会记入Log collector,而用户身份权限及一些镜像语言信息会被存储在Database中。

二、Harbor构建Docker私有仓库

案例需求

通过Harbor创建Docker私有仓库
图形化管理Docker私有仓库镜像

2.1  环境配置

主机操作系统IP地址软件
serverCentOS7.6192.168.111.20docker、docker-compose、harbor-offline-v1.1.2

2.2  部署Harbor服务

Harbor 被部署为多个 Docker 容器,因此可以部署在任何支持 Docker 的 Linux 发行版 上。
服务端主机需要安装 Python、Docker 和 Docker Compose。

安装包:harbor-offline-installer-v1.2.2.tgz
提取码:k7o8

compose链接:docker-compose
提取码:y7c6

2.2.1  上传dock-compose,并设置权限

cd /usr/local
rz docker-compose
chmod +x docker-compose
mv docker-compose /usr/bin

2.2.2  安装harbor-offline-installer-v1.2.2

rz harbor-offline-installer-v1.2.2.tgz
tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/

2.2.3  配置Harbo参数文件

[root@harbor local]# vim /usr/local/harbor/harbor.cfg 

#修改第五行
hostname = 192.168.111.20

2.2.4  启动Harbor

sh /usr/local/harbor/install.sh

2.3  查看Harbor启动镜像和容器

2.3.1  查看镜像 

docker images

2.3.2  检查服务容器是否开启

cd /usr/local/harbor/
docker-compose ps

查看整体的运行状态

2.4  在UI界面创建项目

浏览器访问访问http://192.168.111.20,默认的管理员用户名和密码是 admin/Harbor12345。

192.168.111.20
用户名:admin
密码:Harbor12345

  添加项目并填写项目名称

2.5  在本地测试仓库功能

此时可使用Docker命令在本地通过127.0.0.1来登录和推送镜像。默认情况下,Register服务器在端口80上侦听。

#登陆
docker login -u admin -p Harbor12345 http://127.0.0.1

#下载镜像进行测试
docker pull tomcat

#镜像打标签
docker tag tomcat 127.0.0.1/public/tomcat:v1

#上传镜像到Harbor
docker push 127.0.0.1/public/tomcat:v1

查看图形化界面 

2.6  在客户端上,上传镜像

上述操作都是在Harbor服务器本地操作。如果其他客户端上传镜像到Harbor,就会报如下错误。出现这问题的原因Docker Registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交互时出现以下错误。

2.6.1 错误现象

docker login -u admin -p Harbor12345 http://192.168.111.40

2.6.2   解决方法

vim /usr/lib/systemd/system/docker.service
#修改内容地方
......
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.111.20 --containerd=/run/containerd/containerd.sock
......
 
#重启服务
systemctl daemon-reload
systemctl restart docker
 
#再次登录
docker login -u admin -p Harbor12345 http://192.168.111.20

扩展:错误集

2.6.3  上传镜像

docker pull nginx
docker tag nginx:latest 192.168.111.20/public/nginx:v1
docker push 192.168.111.20/public/nginx:v1

图形界面查看

 2.7  维护管理Harbor

Harbor可以使用docker-compose来管理Harbor。一些有用的命令如下所示,必须在与docker-compose.yml相同的目录中运行。

修改Harbor.cfg配置文件所需选项的步骤:要更改Harbour的配置文件时,请先停止现有的Harbor实例并更新Harbor.cfg;然后运行prepare脚本来填充配置;最后重新创建并启动Harbour的实例

2.7.1 停止现有的 Harbor 实例

cd /usr/local/harbor/
docker-compose down -v

2.7.2  修改配置文件 Harbor.cfg

cd /usr/local/harbor/
vim harbor.cfg

2.7.3  运行prepare脚本来填充配置

cd /usr/local/harbor/
./prepare

2.7.4  重启服务

cd /usr/local/harbor/
docker-compose up -d

三、创建Harbor用户

3.1  新建用户

   

3.2  在客户端上操作,删除之前打标签的镜像

docker logout 192.168.111.20
docker login 192.168.111.20
lisi
Lisi12345

docker images
docker rmi  192.168.111.20/public/nginx:v1
docker pull   192.168.111.20/public/nginx:v1

图形化界面访问 

3.3  移除 Harbor 服务容器同时保留镜像数据/数据库

移除Harbor服务容器同时保留镜像数据/数据库

1) 在Harbor服务器上操作

cd /usr/local/harbor/
docker-compose down -v

2)  把项目中的镜像数据进行打包

持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的/var/log/Harbor/目录下

ls /data/registry/docker/registry/v2/repositories/myproject-sk 
cd /data/registry/docker/registry/v2/repositories/myproject-sk 
tar zcvf sk-registry.tar.gz ./*

3) 如需重新部署,需要移除Harbor服务容器全部数据,持久数据,如镜像。

#持久数据,如镜像,数据库等在宿主机的/data目录下,日志在宿主机的/var/log/Harbor目录下
rm -rf /data/database
rm -rf /data/registry

四、关于Harbor.cfg 配置文件中有两类参数:所需参数和可选参数

4.1  所需参数

这些参数需要在配置文件Harbor.cfg 中设置。如果用户更新它们并运行install.sh 脚本重新安装Harbour,参数将生效。具体参数如下:

      参数                                                     说明
hostname用于访问用户界面和register 服务。它应该是目标机器的IP地址或完全限定的域名(FQDN),例如192.168.111.20 或hub.sk.cn。 不要使用localhost 或127.0.0.1 为主机名。
ui_url_ protocol(http 或https, 默认为http) 用于访问UI和令牌/通知服务的协议。如果公证处于启用状态,则此参数必须为https。
max_ job_workers镜像复制作业线程。
db_password用于db_auth 的MySQL数据库root用户的密码。
customize_crt该属性可设置为打开或关闭,默认打开。打开此属性时,准备脚本创建私钥和根证书,用于生成/验证注册表令牌。当由外部来源提供密钥和根证书时,将此属性设置为off。
ssl_certSSL证书的路径,仅当协议设置为https 时才应用。
secretkey_path

用于在复制策略中加密或解密远程register密码的密钥路径。

4.2  可选参数

这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动Harbor后在WebUI.上进行更新。如果进入Harbor.cfg,只会在第一次启动Harbor 时生效,随后对这些参数的更新,Harbor.cfg 将被忽略。
注意:如果选择通过UI设置这些参数,请确保在启动Harbor后立即执行此操作。具体来说,必须在注册或在Harbor中创建任何新用户之前设置所需的auth_mode。当系统中有用户时(除了默认的admin用户),auth_mode不能被修改。

        参数                                                       说明
EmailHarbor需要该参数才能向用户发送“密码重置"电子邮件,并且只有在需要该功能时才启用。请注意,在默认情况下SSL.连接时没有启用。如果SMTP服务器需要SSL, 但不支持STARTTLS, 那么应该通过设置启用SSL email_ssl = TRUE。
harbour_admin password管理员的初始密码,只在Harbour 第一次启动时生效。之后,此设置将被忽略,并且应在UI中设置管理员的密码。请注意,默认的用户名/密码是admin/Harbor12345。
auth_mode使用的认证类型,默认情况下,它是db_auth, 即凭据存储在数据库中。对于LDAP身份验证,请将其设置为ldap_auth。
self_registration启用/禁用用户注册功能。禁用时,新用户只能由Admin用户创建,只有管理员用户可以在Harbour中创建新用户。注意:当auth_mode设置为1dap_auth时,自注册功能将始终处于禁用状态,并且该标志被忽略。
Token_expiration由令牌服务创建的令牌的到期时间(分钟),默认为30分钟。
project_creation_restriction用于控制哪些用户有权创建项目的标志。默认情况下,每个人都可以创建一个项目。如果将其值设置为"adminonly", 那么只有admin 可以创建项目。
verify_remote_cert:打开或关闭,默认打开。此标志决定了当Harbor与远程register 实例通信时是否验证SSL/TLS 证书。将此属性设置为off 将绕过SSL/TLS验证,这在远程实例具有自签名或不可信证书时经常使用。

另外,默认情况下,Harbour将镜像存储在本地文件系统上。在生产环境中,可以考虑使用其他存储后端而不是本地文件系统,如S3、Openstack Swif、 Ceph等对象存储。但需要更新common/templates/registry/config.yml文件。

五、总结

harbor 核心组件

Harbor在架构上主要有Proxy、 Registry、 Core services、 Database ( Harbor-db)、Log collector ( Harbor-log)、Job services  六个组件。

hatbor工作原理

Docker Login

  1.  nginx代理在80端口收到client发来的请求,然后把该请求转发到后端的registry。
  2.  registry收到请求,因为registry是配置的token-based的认证,所以会直接返回一个401状态码,然后返回一个url,通知client去哪里获取token,也就是token service
  3. 当docker client收到这个url后,会对这个url发起请求,需要在请求头中植入用户名和密码。
  4. 当请求到达nginx反向代理后,nginx会把该请求转发至ui服务上,因为ui符合token服务在一个容器里面,token服务会解码请求头中用户名和密码
  5. 拿到用户名和密码后会和db中的进行对比,如果验证无误,则返回成功,在返回的http请求中包含一个私有key

Docker push

省略了proxy转发这一步

当你登录harbor成功后,docker push就可以使用了。

  1. docker client和registry交互,获取到token service的url
  2. 随后docker client和token service交互,告诉token需要进行push操作
  3. token服务查看db,该用户是否有相关的权限来push image,如果有相关权限,则返回一个私有的key
  4. docker client拿到token后,会对registry发起push请求,当registry收到请求后,会用自己的公钥解密token,如果验证token是合格的,则开始image传输过程 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值