第四阶段
时 间:2023年8月7日
参加人:全班人员
内 容:
Harbor企业镜像仓库部署
目录
(三)Core services 这是 Harbor 的核心功能,
一、案例概述
Docker 官方镜像仓库是用于管理公共镜像的地方,大家可以在上面找到想要的镜像,也可以把自己的镜像推送上去。但是有时候服务器无法访问互联网,或者不希望将自己的镜像放到互联网上,那么就需要用到 Docker Registry 私有仓库,它可以用来存储和管理自己的镜像。最近公司将项目全部打包成镜像有部署私有仓库服务的需求,经过几轮商讨,最终选择 Docker Harbor,Docker Harbor 有可视化的 Web 管理界面可以方便管理Docker 镜像操作也很方便简单,又提供了多个项目的镜像权限管理控制功能等。
二、什么是 Harbor
Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 仓库服务。它以Docker公司开源的Registry为基础,提供了管理 UI。
基于角色的访问控制(Role Based AccessControl)、AD/LDAP集成、以及审计日志 (Auditlogging) 等企业用户需求的功能。通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。
作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全,以提升用户使用 Registry 构建和运行环境传输镜像的效率。
(一)Harbor 的优势
基于角色控制:用户和仓库都是基于项目进行组织的,而用户基于项目可以拥有不同的权限。
基于镜像的复制策略: 镜像可以在多个 Harbor 实例之间进行复制(同步)。适用于负载平衡、高可用性、多数据中心、混合和多云场景。
支持 LDAP / AD:Harbor 与现有的企业 LDAP / ADA 集成,用于用户认证和管理。
图像删除和垃圾收集:镜像可以被删除,也可以回收镜像占用的空间。
图形 UI:用户可以轻松浏览、搜索镜像仓库以及对项目进行管理。
审计: 对存储库的所有操作都进行记录。
RESTful API:用于大多数管理操作的 RESTful API,易于与外部系统集成。
(二)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(Harbor-ui):提供图形化界面,帮助用户管理 Registry 上的镜像(image), 并对用户进行授权。
Webhook:为了及时获取 registry 上image状态变化的情况,在Registry上配置webhook,把状态变化传递给UI模块。
Token 服务:负责根据用户权限给每个Docker push/pull命令签发token.Docker客户端向 Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向 Registry进行请求。
Database(Harbor-db):为 core services 提供数据库服务,负责储存用户权限、审计日志、Docker image 分组信息等数据。
Log collector(Harbor-log):为了帮助监控 Harbor 运行,负责收集其他组件的log,供日后进行分析。
Harbor的每个组件都是以Docker容器的形式构建的,因此,使用Docker Compose 来 对它进行部署。在源代码中(https://github.com/vmware/Harbor), 用于部署Harbor的Docker Compose 模板位于 Harbor/make/docker-compose.tpl。
三、安装部署haabor仓库
角色 | 主机名 | IP地址 | 软件 |
主库 | huyang1 | 192.168.100.131 | docker-ce docker-compose Harbor-offline |
从库 | huyang2 | 192.168.100.132 | docker-ce docker-compose Harbor-offline |
Docker客户端 | huyang3 | 192.168.100.133 | docker-ce |
(一)部署harbor环境
1、关闭防火墙
[root@huyang2 ~]# systemctl stop firewalld
[root@huyang2 ~]# iptables -F
[root@huyang2 ~]# setenforce 0
2、安装docker-ce(所有主机)
[root@huyang2 ~]# wget -O
/etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@huyang2 ~]# yum -y install yum-utils
device-mapper-persistent-data lvm2
[root@huyang2 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@huyang2 ~]# ls /etc/yum.repos.d/
backup Centos-aliyun.repo CentOS-Media.repo docker-ce.repo
[root@huyang2 ~]# yum -y install docker-ce
[root@huyang2 ~]# systemctl start docker
[root@huyang2 ~]# systemctl enable docker
3、配置阿里云镜像加速器
[root@huyang2 ~]# cat << END > /etc/docker/daemon.json
{
"registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]
}
END
[root@huyang2 ~]# systemctl daemon-reload
[root@huyang2 ~]# systemctl restart docker
[root@huyang2 ~]# docker version
4、部署Docker Compose 服务
下载最新 Docker-Compose(两台harbor主机)
[root@huyang2 ~]# curl -L \
https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@huyang2 ~]# chmod +x /usr/local/bin/docker-compose
查看 Docker-Compose 版本判断安装是否成功
[root@huyang2 ~]# docker-compose --version
5、部署 Harbor 服务
Harbor 被部署为多个 Docker 容器,因此可以部署在任何支持 Docker 的 Linux 发行版上。目标主机需要安装 Python、Docker 和 Docker Compose。
6、下载 Harbor 安装程序(两台harbor主机)
[root@huyang1 ~]# wget
http://harbor.orientsoft.cn/harbor-v1.5.0/harbor-offline-installer-v1.6.0.tgz
[root@huyang1 ~]# tar xf
harbor-offline-installer-v1.6.0.tgz
7、配置 Harbor 参数文件
配置参数位于文件/usr/local/harbor/harbor.cfg 中。安装之前需要修改IP地址。
[root@huyang1 ~]# vim /usr/local/harbor/harbor.cfg
备注:在此只需修改hostname为当前主仓库的ip地址就行,其他默认设置!
关于 Harbor.cfg 配置文件中有两类参数,所需参数和可选参数。
所需参数:这些参数需要在配置文件 Harbor.cfg 中设置。如果用户更新它们并运行 install.sh 脚本重新安装 Harbor,参数将生效。具体参数如下:
hostname:用于访问用户界面和 register 服务。它应该是目标机器的 IP 地址或完全限定的域名(FQDN),例如 192.168.200.111或 www.crushlinux.com。不要使用 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_cert:SSL 证书的路径,仅当协议设置为 https 时才应用。
ssl_cert_key:SSL 密钥的路径,仅当协议设置为 https 时才应用。
secretkey_path:用于在复制策略中加密或解密远程 register 密码的密钥路径。
可选参数:这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动时生效,随后对这些参数的更新,Harbor.cfg 将被忽略。
注意:如果选择通过 UI 设置这些参数,请确保在启动 Harbour 后立即执行此操作。具体来说,必须在注册或在 Harbor 中创建任何新用户之前设置所需的 auth_mode。当系统中有用户时(除了默认的 admin 用户), auth_mode 不能被修改。具体参数如下:
电子邮件设置:Harbor 需要这些参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能时才需要。请注意,在默认情况下 SSL 连接时没有启用。如果SMTP 服务器需要 SSL,但不支持 STARTTLS,那么应该通过设置启用 SSL email_ssl = TRUE。
harbor_admin_password:管理员的初始密码,只在 Harbour 第一次启动时生效。之后,此设置将被忽略,并且应在 UI 中设置管理员的密码。请注意,默认的用户名/密码是 admin/Harbor12345。
auth_mode:使用的认证类型,默认情况下,它是 db_auth,即凭据存储在数据库中。对于 LDAP 身份验证,请将其设置为 ldap_auth。
self_registration:( 打开或关闭,默认打开)启用/禁用用户注册功能。禁用时,新用户只能由 Admin 用户创建,只有管理员用户可以在 Harbour 中创建新用户。注意:当 auth_mode 设置为 ldap_auth 时,自注册功能将始终处于禁用状态,并且该标志被忽略。
token_expiration:由令牌服务创建的令牌的到期时间(分钟),默认为 30 分钟。
project_creation_restriction:用于控制哪些用户有权创建项目的标志。默认情况下,每个人都可以创建一个项目。如果将其值设置为“adminonly”,那么只有admin 可以创建项目。
verify_remote_cert:打开或关闭,默认打开。此标志决定了当 Harbour 与远程register 实例通信时是否验证 SSL/TLS 证书。将此属性设置为 off 将绕过 SSL/TLS验证,这在远程实例具有自签名或不可信证书时经常使用。
另外,默认情况下Harbor 将镜像存储在本地文件系统上。在生产环境中,可以考虑使用其他存储后端而不是本地文件系统,如 S3、Openstack Swif、Ceph 等。需要更新 common/templates/registry/config.yml 文件。
配置完成就可以启动 Harbor 了,如下操作:
[root@huyang1 ~]# sh /usr/local/harbor/install.sh
9、查看 Harbor 启动镜像
[root@huyang1 ~]# docker-compose ps
如果一切都正常,应该可以打开浏览器访问 http://192.168.100.131的管理页面,默认的管理员用户名和密码是 admin/Harbor12345。
至此, Harbor已经搭建完成,具体在WEB UI下面操作也是非常的简单,只有几个选项。
四、harbor常规操作
(一)创建一个新项目
1、输入用户名和密码登录界面后可以创建一个新项目。点击“+项目”按钮。
2、填写项目名称为“2304”
3、点击“确定”按钮,成功创建
4、可以使用 Docker 命令在Harbor本地通过 127.0.0.1 来登录和推送镜像了。默认情况下, Register 服务器在端口 80 上侦听。
5、登录 Harbor。
[root@hhuyang1 ~]# docker login -u admin -p Harbor12345 http://127.0.0.1
6、下载体积小点的镜像进行测试。
[root@huyang1 ~]# docker pull busybox
7、镜像打 tag
[root@huyang1 ~]# docker tag busybox
127.0.0.1/2304/busybox:test1
8)上传镜像到 Harbor
[root@huyang1 ~]# docker push
127.0.0.1/2304/busybox:test1
9、在 Harbor 界面 2304目录下就可以看见这个镜像,以及这个镜像的一些信息。
(二)客户端上传镜像
以上操作都是在 harbor01 服务器本地操作,如果其他客户端上传镜像到 Harbor,就会报如下错误。出现这问题的原因是 Docker 自从 1.3.X 之后 Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以下错误。
[root@huyang2 ~]# docker login -u admin -p Harbor12345 http://192.168.100.131
1、在 Docker 客户端配置操作如下:
解决办法是:在 Docker server 启动的时候,增加启动参数,默认使用 HTTP 访问
[root@huyang2 ~]# vim
/usr/lib/systemd/system/docker.service
2、重启 Docker,再次登录
[root@huyang2 ~]# systemctl daemon-reload
[root@huyang2 ~]# systemctl restart docker
3、再次登录 Harbor
[root@huyang2 ~]# docker login -u admin -p Harbor12345 192.168.100.131
4、下载体积小一点的镜像进行测试
[root@huyang2 ~]# docker pull busybox
5、镜像打标签及上传到 myproject-crushlinux 项目里面
[root@huyang2 ~]# docker tag busybox 192.168.100.131/2304/busybox:test2
[root@huyang2 ~]# docker push 192.168.100.131/2304/busybox:test2
6、查看 Harbor 的 web 管理界面,myproject-crushlinux 项目里面有两个镜像。
(三)Harbor 日常操作管理
点击“+项目”时按规范填写项目名称。项目级别:私有即不勾选(勾选后会变为"公开")。如果设置为公共仓库,则所有人对此项目下的镜像拥有读权限,命令行中不需要执行"Docker login"即可下载镜像,镜像操作与Docker hub 一致。
2、创建 Harbor 用户
1)创建用户并分配权限
系统管理->用户管理->创建用户,填写用户名为“OP---Ada”,邮箱为 13363571949@163.com,全名为“Ada”,密码为“Hy584540”,注释为“管理员”。
点击“”确定“按钮后,可将上述创建的用户设置为管理员角色或进行删除操作。
取消管理员:
2)添加项目成员
项目-> 2304->成员->+成员,填写上述创建的用户并分配角色为“项目管理员”。
新建成员:
可对成员角色进行变更或者删除操作。
3)在客户端上用普通账户镜像操作
(1)删除上述打标签的本地镜像.
[root@huyang2 ~]# docker rmi 192.168.100.121/2304/busybox:test2
[root@huyang2 ~]# docker images
备注:Harbor没有发生变化!
(2)首先退出当前用户,然后使用上述创建的账户OP---Ada登录。
[root@huyang2 ~]# docker logout 192.168.100.131
[root@huyang2 ~]# docker login 192.168.100.131
(3)下载 192.168.100.131/2304/busybox 标签为 test1 的镜像。
[root@huyang2 ~]# docker pull 192.168.100.131/2304/busybox:test1
[root@huyang2 ~]# docker images
(4)查看日志
Web 界面日志,操作日志按时间顺序记录用户相关操作。
3、管理 Harbor
可以使用 docker-compose来管理Harbor。一些有用的命令如下所示(必须在与docker-compose.yml 相同的目录中运行)。
1)停止/启动/重启 Harbor
[root@huyang1 ~]# cd /usr/local/harbor/
[root@huyang1 ~]# docker-compose stop | start | restart
2)修改 Harbor.cfg 配置文件
要更改 Harbor 的配置文件时,请先停止现有的 Harbor 实例并更新 harbor.cfg;然后运行 prepare 脚本来填充配置;最后重新创建并启动 Harbour 的实例。
[root@harbor harbor]# docker-compose down -v
[root@harbor harbor]# vi harbor.cfg
[root@harbor harbor]# ./prepare
[root@harbor harbor]# docker-compose up -d
3)移除 Harbor 服务容器同时保留镜像数据/数据库
[root@harbor harbor]# docker-compose down -v
4)移除 Harbor 服务容器全部数据(重新部署时采用)
持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的 /var/log/Harbor/目录下:
[root@huyang1 ~]# rm -r /data/database
[root@huyang1 ~]# rm -r /data/registry
五、Harbor安全设置
(一)为Harbor配置https
1、创建自己的CA证书
[root@huyang1 ~]# yum -y install openssl
[root@huyang1 ~]# mkdir -p /data/ssl
[root@huyang1 ~]# cd /data/ssl/
[root@huyang1 ssl]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
配置如下:
2、生成证书签名请求
[root@huyang1 ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout www.jx.com.key -out www.jx.com.csr
3、生成注册表主机的证书
[root@huyang1 ssl]# openssl x509 -req -days 365 -in www.jx.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out www.jx.com.crt
4、查看证书情况
[root@huyang1 ssl]# ls -l
5、信任自签发的域名证书
由于CA证书是我们自己签发的,Linux操作系统是不信任的,因此我们需要把证书加入到系统的信任证书里。
1)将自签ca证书添加到系统信任
[root@huyang1 ~]# cp www.jx.com.crt /etc/pki/ca-trust/source/anchors/
2)让系统ca信任设置立刻生效
[root@huyang1 ~]# update-ca-trust extract
[root@huyang1 ~]# update-ca-trust enable
3)创建harbor的证书目录,并复制
[root@huyang1 ~]# mkdir -p /etc/ssl/harbor
[root@huyang1 ~]# cp /data/ssl/www.jx.com.key /etc/ssl/harbor/
[root@huyang1 ~]# cp /data/ssl/www.jx.com.crt /etc/ssl/harbor/
[root@huyang1 ~]# ll /etc/ssl/harbor/
6、关闭现有harbor
[root@huyang1 ~]# cd /usr/local/harbor/
[root@huyang1 harbor]# docker-compose stop
[root@huyang1 harbor]# docker rm -f $(docker ps -aq)
7、修改harbor.cfg配置文件
[root@huyang1 harbor]# vim harbor.cfg
配置如下:
7 hostname = www.jx.com
11 ui_url_protocol = https
23 ssl_cert = /etc/ssl/harbor/www.jx.com.crt
24 ssl_cert_key = /etc/ssl/harbor/www.jx.com.key
8、重新安装harbor私有镜像仓库
[root@huyang1 harbor]# ./install.sh --with-notary --with-clair
备注:##--with-notary启用镜像签名;
--with-clair启用漏洞扫描
9、浏览器进行访问测试 https://192.168.100.131
拓展:常用的一些设置
1、配置安全模式
项目创建:设定为仅管理员(企业中不会让注册用户随便创建),不允许自动创建