目录
[(一)什么是 Harbor](#(一)什么是 Harbor)
[三、部署 Harbor服务](#三、部署 Harbor服务)
[7. 在其他客户端上传镜像](#7. 在其他客户端上传镜像)
[(一)通过 Harbor Web 创建项目](#(一)通过 Harbor Web 创建项目)
[1.移除 Harbor 服务容器](#1.移除 Harbor 服务容器)
引言
随着容器化技术的普及,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.修改配置文件
cs
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文件
cs
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 镜像并启动容器
cs
[root@harbor harbor]#./prepare
......
[root@harbor harbor]#./install.sh
......
4.查看Harbor启动的镜像
cs
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
cs
[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 下载镜像
cs
[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
cs
[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
cs
[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访问,就会出现连接拒绝的问题。
cs
[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 访问
cs
[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文件
cs
[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也能绕过默认的安全检查,
继续与其进行不安全的数据传输
注释:以上两种解决办法取其一种进行操作
cs
[root@docker ~]#systemctl daemon-reload
[root@docker ~]#systemctl restart docker.service
#加载后重启服务
再次进行登录尝试
cs
[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
cs
[root@docker ~]#cat ~/.docker/config.json
{
"auths": {
"192.168.83.30": {
"auth": "YWRtaW46SGFyYm9yMTIzNDU="
}
}
}
7.2 客户端测试
7.2.1 下载harbor仓库中的镜像
cs
[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仓库
cs
[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.创建公共仓库
创建公共仓库并上传镜像文件
cs
[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.客户端下载镜像
cs
[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.登录用户操作
cs
[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 相同的目录中运行
cs
[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服务,避免在迁移过程中产生数据不一致
cs
[root@harbor harbor]# cd /usr/local/harbor
[root@harbor harbor]# docker-compose down -v
2.备份迁移
cs
[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 服务容器全部数据
cs
[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