六、Docker仓库之Harbor搭建(三)

news2024/7/6 19:02:08

Harbor搭建

一、Harbor简介

1.Harbor介绍
Harbor是一个用于存储Docker镜像的企业级镜像服务器,通过添加一些企业必需的功能特性,如安全、标识和管理等,大大扩展其功能。作为一个企业级私有镜像服务器,Harbor提供了更好的性能和安全。提升用户使用镜像构建和运行环境传输镜像的效率。Harbor支持安装在多个镜像 节点的镜像资源复制,镜像全部保存在私有镜像中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

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

3.Harbor组件
Harbor在架构上主要由6个组件构成:
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,供日后进行分析。

各个组件之间的关系如下图所示:
在这里插入图片描述

4.Harbor实现
Harbor的每个组件都是以Docker容器的形式运行的,官方也是使用Docker Compose来对它进行部署。用于部署Harbor的Docker Compose模板位于 harbor/docker-compose.yml,打开这个模板文件,发现Harbor是由7个容器组成的,大致介绍每个容器的作用,后面具体查看 。

nginx:nginx负责流量转发和安全验证,对外提供的流量都是从nginx中转,所以开放https的443端口,它将流量分发到后端的ui和存储镜像的docker registry。

harbor-jobservice:harbor-jobservice 是harbor的job管理模块,job在harbor里面主要是为了镜像仓库之前同步使用的;

harbor-ui:harbor-ui是web管理页面,主要是前端的页面和后端CURD的接口;

registry:registry就是docker原生的仓库,负责保存镜像。

harbor-adminserver:harbor-adminserver是harbor系统管理接口,可以修改系统配置以及获取系统信息。

这几个容器通过Docker link的形式连接在一起,在容器之间通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。

harbor-db:harbor-db是harbor的数据库,这里保存了系统的job以及项目、人员权限管理。由于本harbor的认证也是通过数据,在生产环节可以对接到企业的ldap中;

harbor-log:harbor-log是harbor的日志服务,统一管理harbor的日志。通过inspect可以看出容器统一将日志输出的syslog。
这几个容器通过Docker link的形式连接在一起,这样,在容器之间可以通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。

5.harbor和registry的区别
Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry起的容器的私有仓库中。企业可以根据自己的需求,使用Dokcerfile生成自己的镜像,并推到私有仓库中,这样可以大大提高拉取镜像的效率。
区别:

1)提供分层传输机制,优化网络传输
Docker镜像是是分层的,而如果每次传输都使用全量文件,显然太浪费资源。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。
2)提供WEB界面,优化用户体验
用户可以通过web界面对镜像镜像管理,特别是对不太熟悉命令行的人非常友好。
3)支持水平扩展集群
当有用户对镜像的上传下载操作集中在某台服务器时,压力可能会比较大,有时候需要需要对访问分散
4)良好的安全机制
企业中有很多不同的职位,对于不同的职位人员,分配不同的权限,对服务具有更好的安全性。
5)Harbor提供了基于角色的访问控制机制,并通过项目对镜像进行组织和访问权限的控制。

二、安装和配置Harbor

1.环境说明
系统版本:CentOS Linux release 7.6.1810 (Core)
docker:19.03
docker-compose:1.18.0
Harbor:v2.8.1
官方参考(里面有说明环境要求啥的,更多harbor版本可自行选择):https://github.com/goharbor/harbor/tree/v2.8.1

2.首先安装docker和docker-compose(略)

3.下载Harbor安装包
安装方式分为在线安装和离线安装两种方式,我这里选择的是在线安装。区别,离线安装压缩包有所需镜像,而在线安装包里面的镜像需要临时拉取。
在线安装:
wget -P /usr/loca/src/ https://github.com/goharbor/harbor/releases/download/v2.8.1/harbor-online-installer-v2.8.1.tgz (包很小,容易直接下载下来)
内网环境也可以选择离线安装:
wget -P /usr/loca/src/ https://github.com/goharbor/harbor/releases/download/v2.8.1/harbor-offline-installer-v2.8.1.tgz
不过这个文件比较大,不容易下载成功

[root@k8s-m1 src]wget -P /usr/local/src/     https://github.com/goharbor/harbor/releases/download/v2.8.1/harbor-online-installer-v2.8.1.tgz 
[root@k8s-m1 src]cd /usr/local/src/
[root@k8s-m1 src]# tar  -xvf harbor-online-installer-v2.8.1.tgz  -C /usr/local/
[root@k8s-m1 src]cd /usr/local/harbor/

4、修改配置文件
先拷贝一份初始配置文件
cp harbor.yml.tmpl harbor.yml
修改配置文件:
1)hostname:访问地址,配置成IP或者域名都可以,域名需要配置DNS
2)先注释https的相关配置,先使用http的方式
在这里插入图片描述
5、运行
第一次需要在线安装需要拉取相应的镜像,稍作等待。
[root@k8s-m1 harbor]sh /usr/local/harbor/install.sh
Creating nginx … done
Creating redis …
Creating registry …
Creating registryctl …
Creating harbor-db …
Creating harbor-portal …
Creating harbor-core …
Creating harbor-jobservice …
Creating nginx …
✔ ----Harbor has been installed and started successfully.

6、Harbor启动和停止
Harbor 的日常运维管理是通过docker-compose来完成的,Harbor本身有多个服务进程,都放在docker容器之中运行,我们可以通过docker ps命令查看或者docker-compose的相关命令来查看。

[root@k8s-m1 harbor]# docker ps
[root@k8s-m1 harbor]# docker-compose ps
[root@k8s-m1 harbor]# docker-compose start
[root@k8s-m1 harbor]# docker-compose stop
[root@k8s-m1 harbor]# docker-compose restart

7、访问测试

配置好本地hosts,就可以通过web界面访问管理自己的私有仓库啦。
在这里插入图片描述
默认账号密码: admin / Harbor12345 登录后可修改密码

三、Harbor的使用

1、配置基本信息
登陆到harbor的web界面后,可以添加一些新项目和用户。其他看自己需要,或者慢慢研究其深入使用。
在这里插入图片描述
2、发布镜像到Harbor

1)修改docker配置
对于发布到harbor的镜像有名称的要求,必须满足: harbor地址/项目名/镜像名:版本
对于非安全的端口的镜像库,要使用需要在相应的服务器修改insecure-registry,然后才能登陆,因为默认都会转到https的端口,如下:
修改daemon.json
该文件中配置支持的Docker仓库,然后重启Docker:

[root@k8s-m1 ~]# vim /etc/docker/daemon.json 
{
  "insecure-registries":["docker.harbor.com"]  # harbor仓库
}
[root@k8s-m1 ~]#systemctl restart docker

2)、登录harbor
然后需要在服务器上登录到harbor,这样才能进行推送镜像的操作:

复制代码

[root@k8s-m1 ~]# vim /etc/hosts
[root@k8s-m1 ~]# docker login docker.margu.com   #注意要先配置本地hosts
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-store

Login Succeeded

3)、可以进行镜像的推送拉取(略)

四、带证书的Harbor安装

上面对Harbor的配置都是使用的http协议访问,但是我们工作中一般都不会去单独配置insecure-registry且重启docker服务,所以我们需要配置https访问。所以下面我们进行对Harbor进行https的相关配置。

1、创建 CA 私钥

[root@k8s-m1 ~]# openssl genrsa -out "root-ca.key" 2048
Generating RSA private key, 2048 bit long modulus

2、利用私钥创建 CA 根证书请求文件

[root@k8s-m1 ~]# openssl req  -new -key "root-ca.key"  -out "root-ca.csr" -sha256  -subj '/C=CN/ST=sichuang/L=chengdu/O=margu/CN=docker.margu.com'
[root@k8s-m1 ~]# ll root-ca.csr 
-rw-r--r-- 1 root root 989 May 22 21:54 root-ca.csr

以上命令中 -subj 参数里的 /C 表示国家,如 CN;/ST 表示省;/L 表示城市或者地区;/O 表示组织名;/CN 通用名称。

3、配置 CA 根证书,新建 root-ca.cnf

[root@k8s-m1 ~]#vim root-ca.cnf
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash

4、签发根证书

[root@k8s-m1 ~]# openssl x509 -req  -days 3650  -in "root-ca.csr"  -signkey "root-ca.key" -sha256 -out "root-ca.crt" -extfile "root-ca.cnf" -extensions root_ca
Signature ok
subject=/C=CN/ST=sichuang/L=chengdu/O=margu/CN=docker.margu.com
Getting Private key

5、生成站点 SSL 私钥

[root@k8s-m1 ~]#  openssl genrsa -out "docker.margu.com.key" 2048
Generating RSA private key, 2048 bit long modulus
.....................................................................................................................+++
.........................................................+++
e is 65537 (0x10001)

6、使用私钥生成证书请求文件

[root@k8s-m1 ~]# openssl req -new -key "docker.margu.com.key" -out "site.csr" -sha256  -subj '/C=CN/ST=sichuan/L=chengdu/O=margu/CN=docker.margu.com'

7、配置证书,新建 site.cnf 文件

[root@k8s-m1 ~]#vim site.cnf
[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:docker.domain.com, IP:192.168.2.140
subjectKeyIdentifier=hash

8、签署站点 SSL 证书

[root@k8s-m1 ~]# openssl x509 -req -days 750 -in "site.csr" -sha256     -CA "root-ca.crt" -CAkey "root-ca.key"  -CAcreateserial     -out "docker.margu.com.crt" -extfile "site.cnf" -extensions server
Signature ok
subject=/C=CN/ST=sichuan/L=chengdu/O=margu/CN=docker.margu.com
Getting CA Private Key

这样已经拥有了 docker.domain.com 的网站 SSL 私钥 docker.domain.com.key 和 SSL 证书 docker.domain.com.crt 及 CA 根证书 root-ca.crt。
新建/usr/local/harbor/certs文件夹并将 docker.domain.com.key docker.domain.com.crt root-ca.crt 这三个文件移入,其他文件也可以移进去。
[root@k8s-m1 ~]# mkdir -p /usr/local/harbor/certs
[root@k8s-m1 ~]# mv docker.margu.com.key docker.margu.com.crt root-ca.crt /usr/local/harbor/certs

9、修改Harbor配置文件

因为Harbor默认使用http协议访问,所以我们这里在配置文件中,配置好域名,开启https配置;
在这里插入图片描述

10、开始安装Harbor
[root@k8s-m1 harbor]# sh install.sh

由于自行签发的 CA 根证书不被系统信任,所以我们还是需要将 CA 根证书 root-ca.crt 移入 /etc/docker/certs.d/docker.margu.com 文件夹中,其他服务器也需要该文件(很麻烦),所以通用证书就很方便, 可以不用自己制作证书。

[root@k8s-m1 ~]# mkdir -p /etc/docker/certs.d/docker.margu.com

[root@k8s-m1 ~]#cp /root/registry/ssl/root-ca.crt /etc/docker/certs.d/docker.margu.com/ca.crt
[root@k8s-m1 harbor]# docker login docker.margu.com   #不用加insecure-registry的相关配置了
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-store

Login Succeeded

PS:如果过程不通,请指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/574265.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Modern CSV:大型 CSV 文件编辑器/查看器 Crack

Modern CSV用于快速查看大型 CSV 文件 适用于 Windows、Mac 和 Linux 的复杂 CSV 编辑器/查看器 被使用 电子商务运营商。数据科学家。会计师。 IT 专业人员。学生。医学研究人员。数字营销人员。生物学家。工程师。 现代 CSV 是适用于 Windows、Mac 和 Linux 的功能强大的表格…

SSM 如何使用 TCC 机制实现分布式事务?

SSM 如何使用 TCC 机制实现分布式事务? 分布式事务是现代分布式系统中必不可少的一部分,而 TCC 机制(Try-Confirm-Cancel)是一种常用的分布式事务处理方式。在 SSM 框架中,我们可以使用 TCC 机制来管理分布式事务。本…

RabbitMQ系列-概念及安装

1. 消息队列 消息队列是指利用队列这种数据结构进行消息发送、缓存、接收,使得进程间能相互通信,是点对点的通信 而消息代理是对消息队列的扩展,支持对消息的路由,是发布-订阅模式的通信,消息的发送者并不清楚消息的…

Spring源码解析

Idea导入Spring源码 下载 下载gradle 因为Spring源码里没有使用Maven依赖,而是使用gradle依赖,所以我们需要在本地下载安装并配置gradle环境。注意,这里下载安装的gradle版本应与Spring源码中的gradle版本对应。这里推荐下载我的&#xff…

Linux网络服务:部署YUM仓库与NFS服务

目录 一、理论 1.部署YUM仓库服务 2.NFS共享存储服务 二、实验 1.通过httpd服务建立yum仓库 2.通过vsftpd服务建立yum仓库 3.搭建NFS实现2台或3台服务器共享一个目录 一、理论 1.部署YUM仓库服务 (1) YUM简介 YUM的前身是YUP,借助于YUM软件仓库&#xff0c…

关于原型链

1-__proto__([[Prototype]])和prototype 每个对象都有一个隐式原型,这个隐式原型可以通过 obj.__proto__ Object.getPrototypeOf(obj)这两种方式获取; 我们都知道对象是通过构造函数构造的,new关键字构造的, 构造函数上有一个显…

如何在华为OD机试中获得满分?Java实现【最佳对手】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 游戏里面,队伍通过匹配…

native层函数没有导出时,如何获得相应函数地址?

前言 每次App重新运行后native函数加载的绝对地址是会变化的,唯一不变的是函数相对于基地址的偏移,因此我们可以在获取模块的基地址后加上固定的偏移地址获取相应函数的地址,Frida中也正好提供了这种方式:先通过Module.findBaseA…

SQL教程1

SQL 是用于访问和处理数据库的标准的计算机语言。 在本教程中,您将学到如何使用 SQL 访问和处理数据系统中的数据,这类数据库包括:MySQL、SQL Server、Access、Oracle、Sybase、DB2 等等。 SQL 简介 SQL (Structured Query Language:结构化…

OSPF协议

OSPF:开放式最短路径优先协议 无类别IGP协议;链路状态型;基于LSA收敛,故更新量较大,为在中大型网络正常工作,需要进行结构化的部署 --- 区域划分、ip地址规划 组播更新 --- 224.0.0.5 224.0.0.6 支持等开销…

shell变量的使用 rhce(25)

目录 1.总结变量的类型及含义? 2.实现课堂案例计算长方形面积?(6种方式) 3.定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/103568815(通过多种方法实现) (1&#xff0…

Redis的数据过期策略

数据淘汰策略-使用建议 1.优先使用allkeys-lru策略。充分利用LRU算法的优势,把最近最常访问的数据留在缓存中。如果业务有明显的冷热数据区分,建议使用。 2.如果业务中数据访问频率差别不大,没有明显冷热数据区分,建议使用allkeys…

【AUTOSAR】 AUTOSAR整体开发流程(六)---- ISOLAR与Simuink

ISOLAR与Simuink交互 8.1 AutoSar的几种开发流程 8.2 Simulink 到ISOLAR Simulink生成SWC arxml SWC arxml放到ISOLAR文件夹 F5即可显示 8.3 ISOLAR到Simulink 1、Matlab的几个命令 1)importer Call the constructor arxml.importer to create an importer obj…

Nomad 会替代 Kubernetes 吗?对比一下,两者如何选择?

概 述 根据市场状况,Kubernetes(又称“K8s”)已经成为容器编排之王,超越了Docker Swarm和Mesos等竞争对手。但是,在K8s(2014)出现的同时,还有另一个编排项目HashiCorp的Nomad&…

同城跑腿系统源码,点对点配送,帮你省时省力

随着互联网的发展,越来越多的人开始依赖网络来解决生活中的各种问题。而同城跑腿系统就是其中一个受欢迎的解决方案。 ​同城跑腿系统是指一种基于互联网的服务,通过在线平台将用户和服务提供者连接起来,以便用户可以轻松地安排他们的日常任务…

Selenium Grid- 让自动化分布式执行变得可能

什么是 Selenium Grid? Selenium Grid 是 Selenium 的三大组件之一,允许用户同时在不同的机器和系统上测试不同浏览器。 也就是说 Selenium Grid 支持分布式的测试执行。它可以让你的测试用例在一个分布式的执行环境中运行。 由上图可见,测试…

Python之并发编程二多进程理论

一、什么是进程 进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。 二、进程与程序的区别 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。 三、并发与并行 无论是并行还是并发,在用户看来都是’同时’运行的&am…

从实际案例聊聊Java应用的GC优化

概 述 当Java程序的性能无法达到预期目标时,开发人员通常需要借助GC优化来进一步提高性能。然而,GC算法复杂,影响GC性能的参数众多,且参数调整又依赖于应用各自的特点,这些因素大大增加了GC优化的难度。不过&#xf…

GitLab 目录遍历漏洞复现(CVE-2023-2825)

0x01 产品简介 Gitlab是目前被广泛使用的基于git的开源代码管理平台, 基于Ruby on Rails构建, 主要针对软件开发过程中产生的代码和文档进行管理,同时可以搭建Web服务。 0x02 漏洞概述 GitLab 存在目录遍历漏洞,当嵌套在至少五个组中的公共项目中存在附…

demlia机器人建模与装配

1 可以用catia中的模型或其他三维建模软件中的模型转化为step格式即可 2 在demlia中打开 3 打开单个零件保存为cgr格式 对机械臂所有零件都做同样的转化 4 新建装配设计,并导入带有坐标的零件 将转化后的零件都选中导入即是装配好的 5 将模式修改为device buildin…