Docker与Harbor:构建企业级私有Docker镜像仓库

目录

引言

一、本地私有仓库

(一)基本概述

(二)搭建本地私有仓库

1.下载registry镜像

2.启动容器

3.上传本地镜像

4.客户端下载镜像

二、Harbor简介

[(一)什么是 Harbor](#(一)什么是 Harbor)

(二)核心特性

(三)Harbor组成部分

(四)Harbor私有仓库数据流向

[三、部署 Harbor服务](#三、部署 Harbor服务)

(一)安装服务

1.Harbor安装服务

2.修改配置文件

3.启动服务

4.查看Harbor启动的镜像

5.登录Harbor

6.创建新项目

[7. 在其他客户端上传镜像](#7. 在其他客户端上传镜像)

四、维护管理Harbor

[(一)通过 Harbor Web 创建项目](#(一)通过 Harbor Web 创建项目)

1.创建公共仓库

2.客户端下载镜像

(二)创建Harbor用户

1.创建用户

2.添加项目成员

3.登录用户操作

(三)查看日志

(四)修改Harbor.cfg配置文件

(五)迁移

[1.移除 Harbor 服务容器](#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。

  1. nginx:作为反向代理,处理所有进入Harbor的HTTP(S)请求,负责路由到各个服务,并且处理SSL证书。

  2. harbor-jobservice:负责执行一些后台任务,比如镜像的复制、垃圾回收等。

  3. harbor-ui:提供Web界面,用户可以通过UI与Harbor交互,进行镜像的浏览、搜索、上传、下载等操作。

  4. harbor-db:存储Harbor的元数据,如用户、项目、标签信息等。通常使用PostgreSQL或MySQL数据库。

  5. harbor-adminserver:这是一个关键组件,它作为配置管理和API服务,harbor-ui与之交互来获取或更新配置信息。它管理着系统的配置数据,比如用户权限、项目设置等。

  6. registry:实际存储Docker镜像的组件,基于开源的Docker Registry项目,增加了额外的功能如镜像复制、访问控制等。

  7. 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
相关推荐
Karoku06627 分钟前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix
为什么这亚子30 分钟前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
布值倒区什么name1 小时前
bug日常记录responded with a status of 413 (Request Entity Too Large)
运维·服务器·bug
阿尔帕兹1 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
。puppy2 小时前
HCIP--3实验- 链路聚合,VLAN间通讯,Super VLAN,MSTP,VRRPip配置,OSPF(静态路由,环回,缺省,空接口),NAT
运维·服务器
颇有几分姿色2 小时前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器
光芒再现dev2 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
AndyFrank2 小时前
mac crontab 不能使用问题简记
linux·运维·macos
ZHOU西口2 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
成都古河云3 小时前
智慧场馆:安全、节能与智能化管理的未来
大数据·运维·人工智能·安全·智慧城市