目录
引言
一、本地私有仓库
(一)基本概述
(二)搭建本地私有仓库
1.下载registry镜像
2.启动容器
3.上传本地镜像
4.客户端下载镜像
二、Harbor简介
(一)什么是 Harbor
(二)核心特性
(三)Harbor组成部分
(四)Harbor私有仓库数据流向
三、部署 Harbor服务
(一)安装服务
1.Harbor安装服务
2.修改配置文件
3.启动服务
4.查看Harbor启动的镜像
5.登录Harbor
6.创建新项目
7. 在其他客户端上传镜像
四、维护管理Harbor
(一)通过 Harbor Web 创建项目
1.创建公共仓库
2.客户端下载镜像
(二)创建Harbor用户
1.创建用户
2.添加项目成员
3.登录用户操作
(三)查看日志
(四)修改Harbor.cfg配置文件
(五)迁移
1.移除 Harbor 服务容器
2.备份迁移
(六)重新部署
引言
随着容器化技术的普及,Docker已成为现代软件开发不可或缺的一部分。然而,当团队规模扩大,对镜像的安全管理、版本控制以及高效分发的需求日益凸显,公共Docker Hub可能无法满足企业级的安全与性能要求。这时,部署一个私有Docker镜像仓库变得至关重要。Harbor,作为由VMware开源的企业级Docker Registry管理平台,以其全面的安全特性、用户管理、以及镜像复制等功能,成为构建私有仓库的理想选择
一、本地私有仓库
(一)基本概述
搭建Docker本地私有仓库是一个实用的过程,通过将本地镜像进行上传,可以帮助组织或个人更高效、安全地管理Docker镜像,避免频繁从远程仓库拉取镜像带来的网络延迟和流量消耗,同时也便于内部镜像的共享和版本控制
(二)搭建本地私有仓库
1.下载registry镜像
[root@hy ~]#docker pull registry
Using default tag: latest
......
在daemon.jspn文件中添加私有镜像地址
2.启动容器
docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
docker run: 这个命令用于启动一个新的容器。
-itd: 参数组合,分别代表:
i:以交互模式运行容器,即使没有附加也保持STDIN打开。
t:为容器分配一个伪TTY,通常与i一起使用,提供一个更友好的终端交互体验。
d:以后台模式运行容器(守护进程模式)。
-v /data/registry:/var/lib/registry
这是一个volume映射,表示将主机上的/data/registry目录挂载到容器内的/var/lib/registry目录
这样做可以持久化存储从外部推送来的Docker镜像,即使容器重启或重建,镜像数据也不会丢失。
-p 5000:5000
端口映射,将主机的5000端口映射到容器的5000端口
--restart=always
设置容器的重启策略为总是重启。
当Docker守护进程启动或容器因某种原因退出时,Docker会自动重启这个容器,确保私有Registry服务始终可用。
--name registry
为运行的容器指定一个名字,这里是registry。命名容器便于后续管理和操作。
registry:latest
指定要启动的镜像名称及标签。这里使用的是官方的registry镜像的最新版本(latest标签)
3.上传本地镜像
[root@hy ~]#docker tag centos:7 192.168.83.100:5000/centos:server1
#给本地镜像设置标签
[root@hy ~]#docker push 192.168.83.100:5000/centos:server1
#上传镜像到私有仓库
The push refers to repository [192.168.83.100:5000/centos]
174f56854903: Pushed
server1: digest: sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f size: 529
[root@hy ~]#curl http://192.168.83.100:5000/v2/_catalog
{"repositories":["centos"]}
#列出私有仓库的所有镜像
4.客户端下载镜像
修改/etc/docker/daemon.json文件,添加下载地址
[root@test ~]#vim /etc/docker/daemon.json
[root@test ~]#cat /etc/docker/daemon.json
{
"insecure-registries" : ["192.168.83.100:5000"],
#添加镜像文件下载地址。注意,结尾
"registry-mirrors": ["https://gix2yhc1.mirror.aliyuncs.com"]
}
[root@test ~]#systemctl daemon-reload
[root@test ~]#systemctl restart docker.service
#重启docker服务
[root@test ~]#docker pull 192.168.83.100:5000/centos:server1
#下载本期镜像服务器提供的镜像
server1: Pulling from centos
2d473b07cdd5: Pull complete
Digest: sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f
Status: Downloaded newer image for 192.168.83.100:5000/centos:server1
192.168.83.100:5000/centos:server1
[root@test ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.83.100:5000/centos server1 eeb6ee3f44bd 2 years ago 204MB
二、Harbor简介
(一)什么是 Harbor
Harbor 是一个全面的容器镜像管理解决方案,它不仅提供了 Docker 官方 Registry 的所有功能,还额外集成了安全性、身份认证、权限管理以及镜像复制等功能,专为企业的私有部署而设计。自2014年开源以来,Harbor 已成为众多企业和组织构建其容器化平台的首选镜像仓库。
Harbor以 Docker 公司开源的 Registry 为基础,提供了图形管理 UI 、基于角色的访问控制(Role Based AccessControl) 、AD/LDAP 集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。
(二)核心特性
基于角色的访问控制 (RBAC): Harbor 允许管理员精细地控制用户对镜像仓库的访问权限。用户和仓库按项目组织,每个用户在项目内可以被赋予不同的角色,如管理员、开发者或访客,确保只有授权用户能访问特定资源。
镜像复制策略: Harbor 支持在多个实例间复制镜像,这使得跨数据中心或地理区域的镜像分发变得简单高效,有助于实现负载均衡和容灾备份。
安全特性: 包括镜像漏洞扫描,通过集成第三方工具自动检测镜像中的已知安全漏洞;镜像签名功能,确保镜像的完整性和来源可信。
LDAP/AD集成: 无缝对接企业现有的轻量目录访问协议(LDAP)或活动目录(AD),简化用户认证与权限管理流程,便于在大型企业环境中实施统一的身份认证。
LDAP(轻量级目录访问协议)和AD(Active Directory)集成是企业IT环境中常见的身份验证和授权策略,用于集中管理用户访问各种服务和系统的权限。当涉及到像Harbor这样的容器镜像仓库时,集成LDAP或AD能够让组织利用现有的用户目录服务,实现统一的身份认证和权限控制
审计日志: 记录详细的用户操作日志,包括镜像上传、下载、删除等,有助于合规性和问题排查。
可扩展性与自定义: Harbor 设计上支持模块化,可以根据需要扩展存储、认证和日志等组件,以适应不同规模和复杂度的部署场景。
用户友好的界面: 提供直观的Web UI,使用户无需深入了解底层技术就能执行日常的镜像管理任务,同时也支持命令行工具,满足自动化和脚本化需求。
镜像策略管理: 用户可以根据标签、命名规则等条件设定镜像的保留策略,自动清理过时或不再需要的镜像,节省存储空间。
(三)Harbor组成部分
1.Proxy (Nginx)
Harbor 使用 Nginx 作为前端代理服务器,负责接收所有客户端请求(包括浏览器和Docker客户端的请求),并将它们路由到后端的不同服务,比如UI、Registry等。它还处理SSL/TLS加密,确保通信安全。
2.Registry
这是存储Docker镜像的核心服务。Registry 负责处理镜像的上传(push)和下载(pull)请求。为了实施访问控制,Registry与token服务协同工作,要求每次镜像操作都必须携带有效的token进行权限验证。
认证方式有以下三种:
令牌认证: 这是最主要的方式,用户在与Registry交互前需获取一个临时的Token,这个Token包含访问权限信息,并在请求中携带以完成认证。
基本认证: 这种方式通常涉及用户名和密码,用户凭据会被Base64编码后随HTTP请求头部发送。虽然直接使用用户名密码不太安全,但在某些场景或旧版本的Registry中,可能会用到这种方式。不过,现代做法更倾向于使用Token机制来增加安全性。
SSL/TLS客户端证书认证: SSL/TLS不仅用于加密通信,还可以与客户端证书一起实现用户认证。客户端证书是一种数字证书,证明了客户端(如Docker引擎)的身份。这种方式下,Registry会要求客户端在建立连接时出示证书,从而验证客户端的身份。
3.Core services
Harbor的核心功能,主要提供以下3个服务:
UI (用户界面): 提供了一个图形化的管理界面,允许用户轻松地浏览、上传、下载和管理存储在Registry中的Docker镜像。同时,UI还支持用户权限管理、项目管理和镜像复制任务的配置
WebHook:为了及时获取Registry上image 状态变化的情况,在Registry 上配置 Webhook,把状态变化传递给 UI 模块。
Token 服务:负责根据用户权限给每个 Docker push/pull 命令签发 Token。Docker 客户端向 Registry 服务发起的请求, 如果不包含 Token,会被重定向到 Token 服务,获得 Token 后再重新向 Registry 进行请求
4.Database
存储用户权限信息、审计日志、Docker镜像分组信息等元数据。Harbor使用MySQL或其他兼容数据库来持久化这些信息。
5.JobService
负责镜像复制工作,支持在多个Registry节点间复制镜像。它从一个Registry拉取镜像,然后推送到另一个Registry,并记录操作日志,支持镜像的分发和备份策略。
6.Log Collector
负责收集Harbor各组件的日志信息,通常通过Docker的log-driver机制,将日志汇聚并记录到syslog或其他日志存储系统,便于日志管理和分析,提高系统监控与故障排查的效率。
7.AdminServer
系统的配置管理中心,负责管理Harbor的全局配置,包括存储用量检查、以及为UI和jobService提供配置信息。它是Harbor运行时的配置和管理后台。
这些组件共同协作,为用户提供了一个全方位的容器镜像管理解决方案,涵盖了安全、访问控制、镜像复制、日志记录等多个层面,满足企业对于私有容器镜像仓库的高级需求
Harbor 的每个组件都是以 Docker 容器的形式构建的,因此,使用 Docker Compose 来对它进行部署。
总共分为7个容器运行,通过在docker-compose.yml所在目录中执行 docker-compose ps 命令来查看, 名称分别为:nginx、harbor-jobservice、harbor-ui、harbor-db、harbor-adminserver、registry、harbor-log。
-
nginx:作为反向代理,处理所有进入Harbor的HTTP(S)请求,负责路由到各个服务,并且处理SSL证书。
-
harbor-jobservice:负责执行一些后台任务,比如镜像的复制、垃圾回收等。
-
harbor-ui:提供Web界面,用户可以通过UI与Harbor交互,进行镜像的浏览、搜索、上传、下载等操作。
-
harbor-db:存储Harbor的元数据,如用户、项目、标签信息等。通常使用PostgreSQL或MySQL数据库。
-
harbor-adminserver:这是一个关键组件,它作为配置管理和API服务,harbor-ui与之交互来获取或更新配置信息。它管理着系统的配置数据,比如用户权限、项目设置等。
-
registry:实际存储Docker镜像的组件,基于开源的Docker Registry项目,增加了额外的功能如镜像复制、访问控制等。
-
harbor-log:集中日志收集和管理服务,方便系统管理员查看和分析各个组件的日志
(四)Harbor私有仓库数据流向
1.客户端请求:
开始于客户端(开发者工作站、CI/CD管道等)发起对私有仓库的请求,比如拉取或推送镜像。
2.反向代理(Proxy)
所有请求首先到达反向代理层,它作为入口点,负责接收所有外部请求,并根据请求类型和内容将其转发给内部的相应服务。这层可以实现负载均衡、SSL终止等功能,增强安全性与性能。
3.核心服务(Core Services)
反向代理将请求转发给核心服务层,这一层包含多个子服务:
Webhook服务: 用于外部服务的通知机制,当仓库中的事件发生时(如镜像推送成功),自动触发预先设定的动作(如通知CI/CD系统)。
Token服务: 负责用户身份验证,生成和验证访问令牌,确保只有经过验证的用户可以执行敏感操作,如拉取或推送镜像。
UI: 提供Web界面,用户可以通过浏览器管理仓库、用户权限等。
4.镜像存储(Registry)
经过身份验证后,对于镜像的读写请求被转发给Registry服务。Registry负责实际存储和检索Docker镜像的二进制数据,是仓库的核心组件。
5.权限验证与操作
在用户尝试下载或上传镜像时,Registry与Token服务协同工作,确保操作符合用户的权限。例如,上传镜像前,需要通过Token服务验证用户的写权限。
6.日志与审计
每个操作(如下载、上传、删除镜像)都会生成操作日志,这些日志会被收集并存储到数据库中。日志不仅用于追踪和审计目的,也帮助监控系统状态和用户行为。
7.数据库(Database)
存储镜像的元数据(如镜像标签、大小、上传时间)、用户账户信息、角色、权限组配置等。数据库是整个系统权限管理和审计记录的基础。
三、部署 Harbor服务
服务类型 | IP地址 | 主机名 | 安装服务 |
Harbor服务器 | 192.168.83.30 | harbor | docker-ce、docker-compose、harbor-offline-v1.2.2 |
client服务器 | 192.168.83.40 | docker | docker-ce |
(一)安装服务
1.Harbor安装服务
1.1 安装docker服务
[root@harbor ~]#yum install -y yum-utils device-mapper-persistent-data lvm2
#安装依赖包
[root@harbor ~]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#获取阿里云镜像源
[root@harbor ~]#yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io
#安装Docker-CE(社区版)20.10.18版本
[root@harbor ~]#systemctl enable --now docker.service
#设置开机自启并立即启动docker服务
[root@harbor ~]#cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://gix2yhc1.mirror.aliyuncs.com"]
}
1.2 安装docker-compose
[root@harbor opt]#ls
containerd docker-compose-1.25.0 rh
#准备执行文件
[root@harbor opt]#chmod +x docker-compose-1.25.0
#添加执行权限
[root@harbor opt]#ls
containerd docker-compose-1.25.0 rh
[root@harbor opt]#mv docker-compose-1.25.0 /usr/bin/docker-compose
#移动到/usr/bin/并改名为docker-compose
[root@harbor opt]#docker-compose --version
docker-compose version 1.25.0-rc4, build 8f3c9c58
#查看版本信息
1.3 安装harbor-offline
[root@harbor opt]# wget http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz
#下载数据包,或者在官方网站下载完毕之后,上传到服务器当中
[root@harbor opt]# ls
harbor-offline-installer-v1.2.2.tgz
[root@harbor opt]# tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
2.修改配置文件
common
#包含通用配置或脚本的目录。
docker-compose.yml
#Docker Compose的主要配置文件,用于定义和配置多容器Docker应用,用于部署Harbor项目的核心服务
harbor.v1.2.2.tar.gz
#一个压缩包文件,根据命名推测,这应该是Harbor版本1.2.2的发行包,Harbor是一个开源的Docker镜像仓库。
NOTICE
#包含关于软件许可、版权或重要注意事项的文本文件。
docker-compose.clair.yml 和 docker-compose.notary.yml
#这两个文件可能是额外的Docker Compose配置文件,
#专门用于配置Harbor中与 Clair(漏洞扫描服务)和 Notary(内容信任服务)相关的服务
harbor.cfg
#Harbor的配置文件,用户可以根据自己的需求修改此文件中的配置项,如数据库、存储后端、HTTPS设置等
install.sh
#一个Shell脚本,用于自动部署和配置Harbor。通过运行这个脚本,可以快速安装和启动Harbor服务
LICENSE
#包含Harbor软件的许可信息。
prepare
#用于执行安装前的准备工作,比如检查系统依赖、创建必要的目录结构等。
upgrade
#包含升级Harbor的相关脚本或文档,用于指导用户如何从现有版本安全地升级到新版本
修改harbor.cfg文件
hostname = 192.168.83.30:Harbor服务的主机名或IP地址。
ui_url_protocol = http:Harbor Web UI 使用的协议,默认为HTTP,出于安全性考虑,生产环境建议使用HTTPS。
db_password = root123:Harbor内部数据库的密码。
max_job_workers = 3:Harbor处理镜像复制和其他后台任务的工作线程数。
customize_crt = on:指示是否使用自定义证书,默认关闭,如果开启,则需提供SSL证书和密钥。
ssl_cert = /data/cert/server.crt:HTTPS服务的证书文件路径。
ssl_cert_key = /data/cert/server.key:HTTPS服务的私钥文件路径。
secretkey_path = /data:用于加密敏感数据的秘密密钥存储路径。
admiral_url = NA:集成Admiral的服务URL,如果未使用Admiral,则留空。
clair_db_password = password: Clair(漏洞扫描服务)数据库的密码。
email_identity:发件人邮箱的身份标识,可选。
email_server = smtp.mydomain.com:SMTP服务器地址,用于发送邮件通知。
email_server_port = 25:SMTP服务器端口。
email_username = sample_admin@mydomain.com:用于发送邮件的用户名。
email_password = abc:SMTP服务器的认证密码。
email_from = admin sample_admin@mydomain.com:邮件发件人显示名称及邮箱地址。
email_ssl = false:是否使用SSL加密连接发送邮件,默认关闭。
harbor_admin_password = Harbor12345:Harbor管理员账户的初始密码。
auth_mode = db_auth:认证模式,这里设置为数据库认证,Harbor也支持LDAP等其他认证方式。
ldap_url = ldaps://ldap.mydomain.com:LDAP服务器的URL,用于LDAP认证。
ldap_basedn = ou=people,dc=mydomain,dc=com:LDAP的基DN,用于定位用户和组信息。
ldap_uid = uid:用于匹配用户的LDAP属性。
ldap_scope = 3:LDAP搜索范围,3代表搜索子树。
ldap_timeout = 5:LDAP查询超时时间(秒)。
self_registration = on:是否允许用户自我注册,默认开启。
token_expiration = 30:访问令牌的过期时间(天)。
project_creation_restriction = everyone:项目创建权限,everyone表示所有用户都可创建项目。
verify_remote_cert = on:是否验证远程HTTPS证书,默认开启,确保通信安全。
另外,默认情况下,Harbor 将镜像存储在本地文件系统上。在生产环境中,可以考虑 使用其他存储后端而不是本地文件系统,如 S3、Openstack Swif、Ceph 等对象存储。但需要更新 common/templates/registry/config.yml 文件。
Harbor的默认镜像存储路径在 /data/registry 目录下,映射到docker容器里面的 /storage 目录下。
这个参数是在 docker-compose.yml 中指定的,在 docker-compose up -d 运行之前修改。
如果希望将 Docker 镜像存储到其他的磁盘路径,可以修改这个参数
3.启动服务
在配置好了 harbor.cfg 之后,执行 ./prepare 命令,为 harbor 启动的容器生成一些必要的文件(环境),再执行命令 ./install.sh 以 pull 镜像并启动容器
[root@harbor harbor]#./prepare
......
[root@harbor harbor]#./install.sh
......
4.查看Harbor启动的镜像
harbor-adminserver
#这是Harbor的管理服务器,负责处理系统级别的管理任务,如用户管理、权限控制等。
#状态为Up,表明它正在运行。
harbor-db
#Harbor使用的数据库服务,用于存储用户信息、镜像元数据等。
#运行状态为Up,监听3306端口,表明数据库服务已启动并可以接受连接。
harbor-jobservice
#Harbor的作业服务,负责处理镜像复制、垃圾回收等后台任务
#状态Up意味着作业服务已经启动。
harbor-log
#日志收集服务,通常用于收集其他Harbor组件的日志并通过syslog协议转发
#监听本地的514端口,并且状态为Up。
harbor-ui
#Harbor的Web用户界面,用户通过这个界面与Harbor交互,比如推送、拉取镜像等。
#服务状态为Up,说明用户界面已经就绪。
nginx
#作为反向代理服务器,处理Harbor的HTTP和HTTPS请求,确保外部访问的安全性。
#它同时监听了80和443端口(HTTP和HTTPS的标准端口),以及可能的其他HTTPS相关端口(4443)
#所有状态均为Up,表明Nginx配置正确并正在运行。
registry
#Docker Registry服务,用于实际存储镜像层的组件。
#状态为Up,监听5000端口,意味着镜像仓库服务已经启动并可以接收镜像的推送和拉取请求。
5.登录Harbor
6.创建新项目
6.1 浏览器访问本机IP地址,登录 Harbor WEB UI 界面,默认的管理员用户名和密码是 admin/Harbor12345
6.2 输入用户名和密码登录界面后可以创建一个新项目。点击“+项目”按钮
6.3 填写自定义项目名称,点击“确定”按钮,创建新项目
6.4 使用 Docker 命令在本地通过 127.0.0.1 来登录和推送镜像。默认情况下,Registry 服务器在端口 80 上侦听。
6.4.1 使用命令登录 Harbor
docker login -u admin -p Harbor12345 http://127.0.0.1
[root@harbor harbor]#docker login -u admin -p Harbor12345 http://127.0.0.1
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
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
下载或使用dockerfile生成镜像,而后进行上传测试
6.4.2 下载镜像
[root@harbor harbor]#docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
6.4.3 将镜像打标签
格式:docker tag 镜像:标签 仓库IP/项目名称/镜像名:标签
docker tag nginx:latest 127.0.0.1/myharbor-01/nginx:harbor
[root@harbor harbor]#docker tag nginx:latest 127.0.0.1/myharbor-01/nginx:harbor
[root@harbor harbor]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
127.0.0.1/myharbor-01/nginx harbor 605c77e624dd 2 years ago 141MB
nginx latest 605c77e624dd 2 years ago 141MB
6.4.4 上传镜像到 Harbor
docker push 127.0.0.1/myharbor-01/nginx:harbor
[root@harbor harbor]#docker push 127.0.0.1/myharbor-01/nginx:harbor
The push refers to repository [127.0.0.1/myharbor-01/nginx]
d874fd2bc83b: Pushed
32ce5f6a5106: Pushed
f1db227348d0: Pushed
b8d6e692a25e: Pushed
e379e8aedd4d: Pushed
2edcec3590a4: Pushed
harbor: digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3 size: 1570
[root@harbor harbor]#
6.5 在 Harbor 界面myharbor-01目录下可看见此镜像及相关信息
7. 在其他客户端上传镜像
当使用客户端机器登录harbor时,harbor服务器会拒绝连接请求,这是因为Harbor未配置HTTPS。Harbor UI使用的协议是HTTP。如果Harbor实际配置中并未启用HTTPS,而Docker客户端默认尝试通过HTTPS访问,就会出现连接拒绝的问题。
[root@docker ~]#docker login -u admin -p Harbor12345 http://192.168.83.30
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://192.168.83.30/v2/": dial tcp 192.168.83.30:443: connect: connection refused
#第一段为警告信息,输入的密码为明文密码,容易造成外泄
#第二段为错误信息,目标服务器拒绝连接请求
7.1 解决方法
以下两种方法,均在客户端进行操作
7.1.1 在 Docker server 启动的时候,增加启动参数,默认使用 HTTP 访问
[root@docker ~]# vim /usr/lib/systemd/system/docker.service
13 ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.83.30 --containerd=/run/contain erd/containerd.sock
或
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.83.30
7.1.2 修改daemon.json文件
[root@docker ~]#vim /etc/docker/daemon.json
[root@docker ~]#cat /etc/docker/daemon.json
{
"insecure-registries" : ["192.168.83.30"],
#添加insecure-registries字段信息,绕过harbor服务器的安全检查
"registry-mirrors": ["https://gix2yhc1.mirror.aliyuncs.com"]
}
insecure-registries可以翻译为“不安全的注册表”,是Docker守护进程的一个配置项。
当需要Docker与那些未使用HTTPS加密协议的私有镜像仓库进行通讯时,就需要把这个仓库
地址添加到insecure-registries列表中。
这样一来,尽管这些仓库没有采用安全的HTTPS连接,Docker也能绕过默认的安全检查,
继续与其进行不安全的数据传输
注释:以上两种解决办法取其一种进行操作
[root@docker ~]#systemctl daemon-reload
[root@docker ~]#systemctl restart docker.service
#加载后重启服务
再次进行登录尝试
[root@docker ~]#docker login -u admin -p Harbor12345 http://192.168.83.30
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
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
登录之后,会在~/.docker/目录下生成config.json文件,这是一个登录凭据,下次登录时可直接使用凭据登录Harbor
[root@docker ~]#cat ~/.docker/config.json
{
"auths": {
"192.168.83.30": {
"auth": "YWRtaW46SGFyYm9yMTIzNDU="
}
}
}
7.2 客户端测试
7.2.1 下载harbor仓库中的镜像
[root@docker ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker ~]#docker pull 192.168.83.30/myharbor-01/nginx:harbor
harbor: Pulling from myharbor-01/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3
Status: Downloaded newer image for 192.168.83.30/myharbor-01/nginx:harbor
192.168.83.30/myharbor-01/nginx:harbor
[root@docker ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.83.30/myharbor-01/nginx harbor 605c77e624dd 2 years ago 141MB
7.2.2 上传镜像到harbor仓库
[root@docker ~]#docker pull httpd
#下载镜像
[root@docker ~]#docker tag httpd:latest 192.168.83.30/myharbor-01/httpd:harbor
#给镜像打上标签
[root@docker ~]#docker push 192.168.83.30/myharbor-01/httpd:harbor
#上传镜像到harbor仓库
在harbor仓库的web界面查看镜像信息
四、维护管理Harbor
(一)通过 Harbor Web 创建项目
在 Harbor 仓库中,任何镜像在被 push 到 regsitry 之前都必须有一个自己所属的项目。
单击“+项目”,填写项目名称,项目级别若设置为"私有",则不勾选。如果设置为公共仓库,则所有人对此项目下的镜像拥有读权限,命令行中不需要执行"Docker login"即可下载镜像,镜像操作与 Docker Hub 一致。
1.创建公共仓库
创建公共仓库并上传镜像文件
[root@harbor ~]#docker tag nginx:latest 127.0.0.1/myharbor-02/nginx:harbor02
[root@harbor ~]#docker push 127.0.0.1/myharbor-02/nginx:harbor02
#上传镜像到公有仓库(项目)
The push refers to repository [127.0.0.1/myharbor-02/nginx]
d874fd2bc83b: Mounted from myharbor-01/nginx
32ce5f6a5106: Mounted from myharbor-01/nginx
f1db227348d0: Mounted from myharbor-01/nginx
b8d6e692a25e: Mounted from myharbor-01/nginx
e379e8aedd4d: Mounted from myharbor-01/nginx
2edcec3590a4: Mounted from myharbor-01/nginx
harbor02: digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3 size: 1570
2.客户端下载镜像
[root@docker ~]#docker pull 192.168.83.30/myharbor-02/nginx:harbor02
harbor02: Pulling from myharbor-02/nginx
Digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3
Status: Downloaded newer image for 192.168.83.30/myharbor-02/nginx:harbor02
192.168.83.30/myharbor-02/nginx:harbor02
[root@docker ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.83.30/myharbor-01/nginx harbor 605c77e624dd 2 years ago 141MB
192.168.83.30/myharbor-02/nginx harbor02 605c77e624dd 2 years ago 141MB
(二)创建Harbor用户
1.创建用户
在 Web 管理界面中单击系统管理 -> 用户管理 -> +用户
创建完用户后,可对用户进行设置
2.添加项目成员
在 Web 管理界面中单击项目-->选择需要操作的项目-->选择成员-->点击+成员
3.登录用户操作
[root@harbor ~]#docker logout 127.0.0.1
#退出admin用户
[root@harbor ~]#docker login -u pla -p Abc123456 http://127.0.0.1
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
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
#登录新创建的用户
项目管理员权限:项目管理员拥有对项目内的镜像最为全面的控制权。这包括上传(push)、下载(pull)、删除(delete)镜像以及查看(view)镜像的权限。此外,项目管理员还可以管理项目内的成员,包括添加或删除用户以及分配用户角色,以及修改项目的设置。
开发人员权限:开发人员可以查看项目内的镜像列表,上传新的镜像版本,以及从项目中下载镜像到本地。这意味着他们有读(read)、写(write,即上传)和查看(pull,即下载)的权限,但通常不具备删除镜像的能力,除非该权限被特别授予。
访客权限:访客的权限较为有限,主要被限制在只读权限上。他们可以查看(view)项目中的镜像列表和标签,以及拉取(pull)镜像,但不允许上传(push)新的镜像到项目中或删除已有镜像。这意味着访客角色适合那些只需要访问和使用镜像,而不参与镜像管理和上传的用户。
(三)查看日志
可以查看harbor仓库的总体日志
也可以查看单独一个项目的日志信息
(四)修改Harbor.cfg配置文件
在 Harbor 服务器上操作
要更改 Harbor的配置文件中的可选参数时,请先停止现有的 Harbor实例并更新 Harbor.cfg;然后运行 prepare 脚本来填充配置; 最后重新创建并启动 Harbor 的实例。
使用 docker-compose 管理 Harbor 时,必须在与 docker-compose.yml 相同的目录中运行
[root@harbor harbor]# cd /usr/local/harbor
[root@harbor harbor]# docker-compose down -v
Stopping harbor-jobservice ... done
Stopping nginx ... done
Stopping harbor-ui ... done
Stopping harbor-db ... done
Stopping harbor-adminserver ... done
Stopping registry ... done
Stopping harbor-log ... done
Removing harbor-jobservice ... done
Removing nginx ... done
Removing harbor-ui ... done
Removing harbor-db ... done
Removing harbor-adminserver ... done
Removing registry ... done
Removing harbor-log ... done
Removing network harbor_harbor
[root@harbor harbor]# vim harbor.cfg # 只能修改可选参数
[root@harbor harbor]# ./prepare
[root@harbor harbor]# docker-compose up -d
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating registry ... done
Creating harbor-db ... done
Creating harbor-adminserver ... done
Creating harbor-ui ... done
Creating harbor-jobservice ... done
Creating nginx ... done
如果有以下报错,需要开启防火墙 firewalld 服务解决:
Creating network "harbor_harbor" with the default driver
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b53c314f45e8 -j RETURN: iptables: No chain/target/match by that name.
(exit status 1))
systemctl restart firewalld.service
docker-compose up -d
(五)迁移
移除 Harbor 服务容器同时保留镜像数据/数据库,并进行迁移
在 Harbor 服务器上操作
1.移除 Harbor 服务容器
首先,安全地停止Harbor服务,避免在迁移过程中产生数据不一致
[root@harbor harbor]# cd /usr/local/harbor
[root@harbor harbor]# docker-compose down -v
2.备份迁移
[root@harbor harbor]#ls /data/registry/docker/registry/v2/repositories/
myharbor-01 myharbor-02
#所有的项目文件,默认存储在此目录下
[root@harbor harbor]#cd /data/registry/docker/registry/v2/repositories/
[root@harbor repositories]#tar zcf registry.tar.gz ./*
[root@harbor repositories]#ls
myharbor-01 myharbor-02 registry.tar.gz
#进行打包压缩,而后移动到其它服务器上
注释:在迁移之前,可以先进行备份
(六)重新部署
如需重新部署,需要移除 Harbor 服务容器全部数据
[root@harbor repositories]#cd /usr/local/harbor
[root@harbor harbor]#docker-compose down -v
Removing network harbor_harbor
WARNING: Network harbor_harbor not found.
[root@harbor harbor]#rm -rf /data/database
[root@harbor harbor]#rm -rf /data/registry