当前位置: 首页 > news >正文

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

目录

引言

一、本地私有仓库

(一)基本概述

(二)搭建本地私有仓库

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:latestdocker 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.30harbordocker-ce、docker-compose、harbor-offline-v1.2.2
client服务器192.168.83.40dockerdocker-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-storeLogin 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.service13 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-storeLogin 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-storeLogin 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

相关文章:

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

目录 引言 一、本地私有仓库 (一)基本概述 (二)搭建本地私有仓库 1.下载registry镜像 2.启动容器 3.上传本地镜像 4.客户端下载镜像 二、Harbor简介 (一)什么是 Harbor (二&#xff…...

推荐几个傻瓜式短视频去水印在线网站

在数字化时代,短视频已成为信息传播的重要方式之一。随着TikTok、Instagram Reels、抖音等平台的流行,短视频的制作和分享成为了日常生活的一部分。然而,在分享或编辑这些短视频时,去除水印成为了一项不可或缺的需求。水印是视频原…...

大模型LLM之SFT微调总结

一. SFT微调是什么 在大模型的加持下现有的语义理解系统的效果有一个质的飞跃;相对于之前的有监督的Pre-Train模型;大模型在某些特定的任务中碾压式的超过传统nlp效果;由于常见的大模型参数量巨大;在实际工作中很难直接对大模型训…...

【RocketMQ问题总结-2】

RocketMQ 消息持久化 Broker通过底层的Netty服务器获取到一条消息后,会把这条消息的内容写入到一个CommitLog文件里去(一个Broker进程就只有一个CommitLog文件,也就是说这个Broker上所有Topic的消息都会写入这个文件)。 同时&…...

掌握Android Fragment开发之魂:Fragment的深度解析(上)

Fragment是Android开发中用于构建动态和灵活界面的基石。它不仅提升了应用的模块化程度,还增强了用户界面的动态性和交互性,允许开发者将应用界面划分为多个独立、可重用的部分,每个部分都可以独立于其他部分进行操作。本文将从以下几个方面深…...

深度解读DreamFusion:一站式AI解决方案

DreamFusion是一款备受瞩目的人工智能解决方案,它整合了多种AI技术,为用户提供了一站式的解决方案。本文将全面解读DreamFusion,探讨其特点、功能和应用场景,助您深入了解这一创新工具。 1. 特点概述 DreamFusion具备以下显著特…...

JVM-02

字节码文件是一种特殊的文件格式,它包含了将源代码转换为机器可执行代码所需的指令集。字节码文件通常是由编译器将源代码编译为字节码的中间表示形式。 在Java中,字节码文件的扩展名为.class,它存储了编译后的Java代码。这些字节码文件可以在…...

【一起深度学习——NIN】

NIN神经网络 原理图:代码实现:输出结果: 原理图: 代码实现: import torch from torch import nn from d2l import torch as d2ldef nin_block(in_channels, out_channels, kernel_size, strides, padding):return nn.…...

数字工厂管理系统如何助力企业数据采集与分析

随着科技的不断进步,数字化已成为企业发展的重要趋势。在制造业领域,数字工厂管理系统的应用日益广泛,它不仅提升了生产效率,更在数据采集与分析方面发挥着举足轻重的作用。本文旨在探讨数字工厂管理系统如何助力企业数据采集与分…...

uniap之微信公众号支付

近来用uniapp开发H5的时候,需要接入支付,原来都是基于后端框架来做的,所以可谓是一路坑中过,今天整理下大致流程分享给大家。 先封装util.js,便于后面调用 const isWechat function(){return String(navigator.userA…...

Django知识点总结

因为最近在搞一个Python项目,使用的Django框架。所以快速学习了一下这个web框架。并做一些总结。 Django官网的介绍:Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. Built by experience…...

算法(C++

题目:螺旋矩阵(59. 螺旋矩阵 II - 力扣(LeetCode)) 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入&am…...

Python专题:六、循环语句(1)

补充知识 代码的注释 #描述性文字 阅读代码的人更好的理解代码 while循环语句 x<100条件控制语句&#xff0c;Totalx,Total自增加x&#xff0c;x1&#xff0c;x自增加1&#xff0c;x<100此条件满足时&#xff0c;执行while循环&#xff0c;当x101时&#xff0c;x101条…...

力扣2105---给植物浇水II(Java、模拟、双指针)

题目描述&#xff1a; Alice 和 Bob 打算给花园里的 n 株植物浇水。植物排成一行&#xff0c;从左到右进行标记&#xff0c;编号从 0 到 n - 1 。其中&#xff0c;第 i 株植物的位置是 x i 。 每一株植物都需要浇特定量的水。Alice 和 Bob 每人有一个水罐&#xff0c;最初是…...

Windows设置Redis为开机自启动

前言 Redis作为当前最常用的当前缓存技术&#xff0c;基本上Web应用中都有使用。所以&#xff0c;每次我们在本地启动项目前&#xff0c;都必须将Redis服务端启动。但是&#xff0c;每次都要去启动Redis就很麻烦&#xff0c;有没有办法做到开机自动启动Redis呢&#xff1f;这当…...

行业早报5.10

1.鸿蒙智行 4 月交付 29632 辆蝉联中国新势力月销冠&#xff0c;问界 M9 超 13000 辆&#xff1b; 2.三星收购胎儿超声 AI 软件公司 Sonio&#xff0c;巩固尖端医疗设备领域的领先地位&#xff1b; 3.蔚来汽车 4 月交付 15620 辆新车&#xff0c;同比增长 134.6%&#xff1b; 4…...

Java+SpringBoot+JSP实现在线心理评测与咨询系统

前言介绍 随着互联网技术的高速发展&#xff0c;人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门就可以通过网络进行系统管理&#xff0c;交易等&#xff0c;而且过程简单、快捷。同样的&#xff0c;在人们的工作生活中&#xff0c;也就…...

机器学习算法应用——K近邻分类器(KNN)

K近邻分类器&#xff08;KNN&#xff09;&#xff08;4-2&#xff09; K近邻分类器&#xff08;K-Nearest Neighbor&#xff0c;简称KNN&#xff09;是一种基本的机器学习分类算法。它的工作原理是&#xff1a;在特征空间中&#xff0c;如果一个样本在特征空间中的K个最相邻的样…...

python数据分析——数据的选择和运算

数据的选择和运算 前言一、数据选择NumPy的数据选择一维数组元素提取示例 多维数组行列选择、区域选择示例 花式索引与布尔值索引布尔索引示例一示例二 花式索引示例一示例二 Pandas数据选择Series数据获取DataFrame数据获取列索引取值示例一示例二 取行方式示例loc() 方法示例…...

《CKA/CKAD应试指南/从docker到kubernetes 完全攻略》学习笔记 第8章 deployment

目录 前言 8.1创建和删除deployment 8.1.1通过yaml文件的方式创建deployment 8.1.2 deployment 健壮性测试...

步态识别论文(6)GaitDAN: Cross-view Gait Recognition via Adversarial Domain Adaptation

摘要: 视角变化导致步态外观存在显着差异。因此&#xff0c;识别跨视图场景中的步态是非常具有挑战性的。最近的方法要么在进行识别之前将步态从原始视图转换为目标视图&#xff0c;要么通过蛮力学习或解耦学习提取与相机视图无关的步态特征。然而&#xff0c;这些方法有许多约…...

K8S中的弹性云服务如何搭建,可能遇到的问题,如何解决!(稳啦!!!!全都稳啦!!!)

首先我们先来了解一下这玩意儿~~~ 啥是弹性云服务&#xff08;Elastic Cloud Service&#xff09;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 弹性云服务&#xff08;ECS&#xff09;是一种基于云计算技术的虚拟服务器&#xff0c;由vCPU、内存、磁盘等组成的获取方便…...

新增分类——后端

实现功能&#xff1a; 代码开发逻辑&#xff1a; 页面发送ajax请求&#xff0c;将新增分类窗口输入的数据以json形式提交到服务端服务端Controller接收页面提交的数据并调用Service将数据进行保存Service调用Mapper操作数据库&#xff0c;保存数据 代码实现&#xff1a; Con…...

20232801 2023-2024-2 《网络攻防实践》实践九报告

20232801 2023-2024-2 《网络攻防实践》实践九报告 1.实践内容 &#xff08;1&#xff09;手工修改可执行文件&#xff0c;改变程序执行流程&#xff0c;直接跳转到getShell函数。 &#xff08;2&#xff09;利用foo函数的Bof漏洞&#xff0c;构造一个攻击输入字符串&#xf…...

类和对象--this引用原理

看如下代码 public class Date {public int year;public int month;public int day;public void setDate(int y, int m, int d) {year y;month m;day d;}public void printDate(){System.out.println(year "年" month "月" day "日");}…...

力扣:416. 分割等和子集(Java,动态规划:01背包问题)

目录 题目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#…...

Vue进阶之Vue项目实战(一)

Vue项目实战 项目搭建初始化eslint版本约束版本约束eslint配置 stylelintcspellcz-githusky给拦截举个例子 zx 项目搭建 node版本&#xff1a;20.11.1 pnpm版本&#xff1a;9.0.4 初始化 vue3最新的脚手架 pnpm create vite byelide-demo --template vue-ts pnpm i pnpm dev…...

预告 | 飞凌嵌入式邀您共聚2024上海充换电展

第三届上海国际充电桩及换电站展览会&#xff08;CPSE&#xff09;&#xff0c;即将于5月22日~24日在上海汽车会展中心举行。届时&#xff0c;飞凌嵌入式将带来多款嵌入式核心板、开发板、充电桩TCU以及储能EMS网关产品&#xff0c;与来自全国的客户朋友及行业伙伴一同交流分享…...

vite 打包配置并部署到 nginx

添加配置 base&#xff1a;指项目在服务器上的相对路径&#xff0c;比如项目部署在 http://demo.dev/admin/ 上&#xff0c;那么你的基础路径就是 /admin/ 打包后生成的文件 部署到 nginx 访问部署地址&#xff0c;页面加载成功 参考文章&#xff1a;如何使用Vite打包和…...

ResponseHttp

文章目录 HTTP响应详解使用抓包查看响应报文协议内容 Response对象Response继承体系Response设置响应数据功能介绍Response请求重定向概述实现方式重定向特点 请求重定向和请求转发比较路径问题Response响应字符数据步骤实现 Response响应字节数据步骤实现 HTTP响应详解 使用抓…...