Docker registry镜像仓库,私有仓库及harbor管理详解

news2024/11/27 18:51:15

目录

registry镜像仓库概述

Docker 镜像仓库(Docker Registry):

registry 容器:

私有仓库概述

搭建本地私有仓库示例

Harbor概述

harbor架构

详解构成

Harbor由容器构成

Harbor部署示例

环境准备

部署Docker-Compose服务

部署 Harbor 服务

启动Harbor

查看 Harbor 启动镜像

创建一个新项目

在其他客户端上传镜像

维护管理Harbor

通过Harbor Web创建项目

创建 Harbor 用户

查看日志

修改 Harbor.cfg 配置文件

移除 Harbor 服务容器同时保留镜像数据/数据库,并进行迁移


registry镜像仓库概述

Docker 镜像仓库(Docker Registry)是一个用于存储和管理 Docker 镜像的中央仓库。registry 容器就是运行 Docker 镜像仓库服务的容器。

Docker 镜像仓库(Docker Registry):

定义: Docker 镜像仓库是一个集中存储和管理 Docker 镜像的服务。它允许用户上传、下载和分享 Docker 镜像。最常见的 Docker Registry 是 Docker 官方提供的公共注册表(Docker Hub),但用户也可以搭建私有 Docker 镜像仓库,以在本地或私有网络中管理镜像。

功能:

  • 存储镜像: 提供一个集中的地方存储 Docker 镜像。

  • 版本控制: 允许同一镜像的不同版本存在。

  • 访问控制: 可以配置访问权限,使镜像仓库可以是公开的或私有的。

  • 镜像标签: 镜像可以用标签来区分不同版本或变体。

  • 安全审计: 提供审计功能,追踪谁上传或下载了哪些镜像。

常见的 Docker 镜像仓库:

  • Docker Hub: 官方的公共 Docker 镜像仓库。

  • Quay: 一个高性能、可扩展的 Docker 镜像 registry 服务,提供强大的镜像管理和访问控制。

  • Harbor: 一个开源的企业级 Docker Registry,支持安全、可靠的镜像管理。

registry 容器:

定义: registry 容器是运行 Docker 镜像仓库服务的 Docker 容器。它使用 registry 镜像,通过在容器内提供 registry 服务,允许用户在本地或私有网络中搭建自己的 Docker 镜像仓库。

运行 registry 容器的步骤:

  • 拉取 registry 镜像:
docker pull registry
  • 运行 registry 容器:
docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
  • -itd: 在容器中打开一个伪终端进行交互操作,并在后台运行。

  • -v: 将宿主机的 /data/registry 目录挂载到容器的 /var/lib/registry 目录,实现数据的持久化。

  • -p: 映射端口,使得可以通过宿主机的 5000 端口访问 registry 容器的服务。

  • --restart=always: 容器退出时总是重启容器,确保服务的持续性。

  • --name registry: 为容器命名为 registry。

  • registry:latest: 使用最新版本的 registry 镜像。

功能:

  • 提供镜像服务: 允许上传、下载和管理 Docker 镜像。

  • 数据持久化: 使用 -v 参数将宿主机目录挂载到容器,确保数据的持久化。

  • 端口映射: 使用 -p 参数映射宿主机端口,方便外部访问 registry 服务。

  • 自动重启: 使用 --restart=always 参数,保证容器在退出时自动重启。

通过搭建 registry 容器,用户可以在本地或私有网络中建立自己的 Docker 镜像仓库,方便镜像的管理和共享。

私有仓库概述

        Docker私有仓库是指企业内部使用的仓库,用于存放自身开发的企业级应用的镜像。私有仓库的主要优点包括节省网络带宽和提供镜像资源的有效利用。通过搭建本地私有仓库,企业可以在内部网络中快速下载和上传镜像,不受外网带宽等因素的影响。此外,私有仓库还可以配置仓库认证功能,以确保只有授权的人员可以访问和使用其中的镜像。

搭建本地私有仓库示例

下载 registry 镜像:

docker pull registry

配置 daemon.json 文件:/etc/docker/daemon.json 文件中添加私有镜像仓库地址,同时配置其他参数

vim /etc/docker/daemon.json

{
  "insecure-registries": ["192.168.41.31:5000"],
  "registry-mirrors": ["https://ae3f5qei.mirror.aliyuncs.com"]
}

重启 Docker 服务:

systemctl restart docker.service

Docker 容器的重启策略的解析:

  • no:

    • 默认策略。

    • 当容器退出时,不会自动重启容器。

  • on-failure:

    • 在容器非正常退出时(退出状态非0),才会触发容器的自动重启。

  • on-failure:3:

    • 在容器非正常退出时自动重启容器,最多重启3次。

    • 限制了容器的最大重启次数。

  • always:

    • 在容器退出时总是自动重启容器,不考虑退出的原因。

  • unless-stopped:

    • 在容器退出时总是自动重启容器。

    • 不考虑在 Docker 守护进程启动时就已经停止了的容器,即使在 Docker 守护进程启动时手动停止容器,也会被重启。

        这些重启策略提供了对容器生命周期的不同控制选项,以满足不同场景下的需求。选择适当的重启策略可以确保容器服务的可用性和稳定性。

运行 registry 容器:

docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest

解释:

  • -itd: 在容器中打开一个伪终端进行交互操作,并在后台运行。

  • -v: 将宿主机的 /data/registry 目录绑定到容器的 /var/lib/registry 目录,实现数据的持久化。/var/lib/registry目录是registry容器中存放镜像文件的目录

  • -p: 映射端口,访问宿主机的 5000 端口即可访问 registry 容器的服务。

  • --restart=always: 容器退出时总是重启容器。

  • --name registry: 创建容器并命名为 registry。

  • registry:latest: 使用最新版本的 registry 镜像。

为镜像打标签:

docker tag centos:7 192.168.41.31:5000/centos:v1

上传到私有仓库:

docker push 192.168.41.31:5000/centos:v1

列出私有仓库的所有镜像:

curl http://192.168.41.31:5000/v2/_catalog

查看私有仓库的 centos 镜像有哪些 tag:

curl http://192.168.41.31:5000/v2/centos/tags/list

删除原有的 centos 镜像,然后从私有仓库下载:

docker rmi -f 8652b9f0cb4c
docker pull 192.168.41.31:5000/centos:v1

Harbor概述

        Harbor是一个由VMware公司开源的企业级Docker Registry项目。它的目标是帮助用户快速搭建一个企业级的Docker Registry服务。

        Harbor基于Docker公司开源的Registry,并提供了一些企业用户需求的功能,如图形管理界面、基于角色的访问控制(Role Based Access Control)、AD/LDAP集成以及审计日志等。此外,Harbor还原生地支持中文。

        Harbor的每个组件都以Docker容器的形式构建,并使用docker-compose来进行部署。用于部署Harbor的docker-compose模板可以在harbor/docker-compose.yml中找到。

harbor架构

Harbor的整体架构由以下几个组件组成:

  • 代理层(Proxy Layer):代理层实质上是一个Nginx反向代理,负责接收不同类型的客户端请求,包括浏览器、用户脚本、Docker等,并根据请求类型和URI转发给不同的后端服务进行处理。

  • 功能层(Functional Layer):

    • Portal:基于Angular的前端应用,提供Harbor用户访问的界面。

    • Core:Harbor的核心组件,封装了大部分的业务逻辑。

    • JobService:异步任务组件,负责处理Harbor中一些耗时的功能,如Artifact复制、扫描、垃圾回收等。

  • 数据层(Data Layer):

    • Redis:主要作为缓存服务,存储一些生命周期较短的数据,并为JobService提供类似队列的功能。

    • PostgreSQL:存储Harbor的应用数据,包括项目信息、用户与项目的关系、管理策略、配置信息、Artifact的元数据等。

详解构成

Harbor 在架构上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六个组件。

  • Proxy(代理):使用Nginx作为前端代理,Harbor 的 Registry、UI、Token 服务等组件,都处在 nginx 反向代理后边。会将来自浏览器和Docker客户端的请求转发给后端的不同服务。

  • Registry(注册表):负责存储Docker镜像,并处理Docker push/pull命令。由于要对用户进行访问控制,即不同用户对 Docker 镜像 有不同的读写权限,Registry 会指向一个 Token 服务,强制用户的每次 Docker pull/push 请求都要携带一个合法的 Token, Registry 会通过公钥对 Token 进行解密验证。

    认证方式

    • 基于令牌(Token-based)认证:这是Registry的默认认证方式。用户在进行Docker push/pull等操作时,需要提供有效的访问令牌(Token)。Registry会验证令牌的有效性和权限,并根据用户的权限控制对镜像的访问。

    • 基于用户名和密码(Username and Password)认证:用户可以使用用户名和密码进行认证,以获取访问Registry的权限。这种方式需要在Registry中配置用户账户和密码,并在进行操作时提供正确的用户名和密码。

    • 基于TLS/SSL证书(TLS/SSL Certificate)认证:Registry可以配置使用TLS/SSL证书进行认证和加密通信。客户端需要提供有效的证书来与Registry建立安全连接,并进行认证和授权。

    • 基于OAuth认证:Registry可以与OAuth身份验证提供者集成,以实现更强大的身份验证和授权机制。用户可以使用OAuth提供者颁发的令牌来访问Registry,并根据OAuth提供者的权限进行控制。

  • Core services(核心服务):

    • UI(harbor-ui):提供图形化界面,帮助用户管理Registry上的镜像,并进行授权管理。

    • WebHook:用于及时获取Registry上镜像状态的变化,并将其传递给UI模块。

    • Token服务:根据用户权限为每个Docker push/pull命令签发Token。如果请求不包含Token,将被重定向到Token服务获取Token后再向Registry发起请求。

  • Database(harbor-db):为Core services提供数据库服务,存储用户权限、审计日志、Docker镜像分组等数据。

  • Job services(作业服务):用于镜像复制,可以将本地镜像同步到远程Harbor实例。

  • Log collector(日志收集器):负责收集其他组件的日志到一个统一的地方。

  • 此外,还有一个名为harbor-adminserver的组件,作为后端的配置数据管理中心,负责管理Harbor的配置数据,而不具备其他功能。

Harbor由容器构成

Harbor的每个组件都以Docker容器的形式构建,并可以使用Docker Compose进行部署。在Harbor的docker-compose.yml文件所在的目录中执行docker-compose ps命令可以查看正在运行的容器。

总共有7个容器在运行,它们的名称分别是:

  • nginx:作为前端代理,接收来自浏览器和Docker客户端的请求,并将其转发给后端的不同服务。

  • harbor-jobservice:用于处理Harbor中的作业任务,例如镜像复制等。

  • harbor-ui:提供图形化界面,允许用户管理Registry上的镜像,并进行授权管理。

  • harbor-db:为Harbor的核心服务提供数据库服务,存储用户权限、审计日志、Docker镜像分组等数据。

  • harbor-adminserver:作为后端的配置数据管理中心,负责管理Harbor的配置数据,但没有太多其他功能。

  • registry:Harbor的核心组件,负责存储和管理Docker镜像。

  • harbor-log:用于收集其他组件的日志,并将其集中存储在一个地方。

需要注意的是,harbor-adminserver充当了数据配置管理中心,harbor-ui通过它来操作和管理所有的数据。这种架构使得数据的管理更加集中和统一。

通过使用Docker Compose进行部署,可以方便地管理和启动这些容器,确保Harbor的各个组件正常运行。


Harbor部署示例

环境准备

  • Harbor服务器是一个用于管理和存储Docker镜像的私有仓库。它安装了docker-ce(Docker的社区版)、docker-compose(用于管理多个Docker容器的工具)和harbor-offline-v1.2.2(Harbor的离线版本1.2.2)。

  • 客户端服务器是一个使用Docker的服务器,它安装了docker-ce。它可以通过网络连接到Harbor服务器,并使用Harbor提供的功能来管理和获取Docker镜像。

  • 这个架构允许在Harbor服务器上集中管理和存储Docker镜像,并通过客户端服务器来访问和使用这些镜像。

部署Docker-Compose服务

下载或上传Docker-Compose:

        使用curl命令下载Docker-Compose二进制文件。该命令会从GitHub上的docker/compose仓库下载特定版本的Docker-Compose。请注意,uname -suname -m是用于获取操作系统和机器架构的命令。

curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

赋予执行权限:

        使用chmod命令为下载的Docker-Compose二进制文件赋予执行权限。

chmod +x /usr/local/bin/docker-compose

验证安装:

        使用docker-compose命令验证Docker-Compose的安装是否成功。

docker-compose --version

以上步骤将下载或上传Docker-Compose二进制文件,并将其安装到/usr/local/bin/docker-compose路径下。然后,通过运行docker-compose --version命令,可以验证安装是否成功。

部署 Harbor 服务

下载或上传Harbor安装程序:

        使用wget命令下载Harbor离线安装程序。该命令会从指定的URL下载Harbor离线安装程序的压缩包。

wget http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz

解压安装程序:

        使用tar命令解压下载的Harbor离线安装程序压缩包,并将其解压到/usr/local/目录下。

tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/

修改Harbor安装的配置文件:

  • 使用vim或其他文本编辑器打开Harbor的配置文件harbor.cfg。根据需要修改以下两个配置项:
vim /usr/local/harbor/harbor.cfg
  • 第5行:将"hostname"设置为Harbor服务器的IP地址或域名。
hostname = 192.168.41.31
  • 第59行:将"harboradminpassword"设置为管理员的初始密码。默认的用户名/密码是admin/Harbor12345。
harbor_admin_password = Harbor12345

保存并关闭文件。

        以上步骤将下载或上传Harbor安装程序,并将其解压到/usr/local/目录下。然后,可以通过修改配置文件来设置Harbor服务器的IP地址或域名以及管理员的初始密码。

启动Harbor

        在配置好了harbor.cfg文件之后,可以按照以下步骤启动Harbor:

切换到Harbor安装目录: 使用cd命令切换到Harbor的安装目录。

cd /usr/local/harbor/

执行prepare命令: 运行./prepare命令,为Harbor启动的容器生成必要的文件和环境。

./prepare

执行install.sh命令: 运行./install.sh命令,它将拉取Harbor镜像并启动容器。

./install.sh

        以上步骤将在配置好harbor.cfg文件后,为Harbor生成必要的文件和环境,并拉取Harbor镜像并启动容器。这样,就可以开始使用Harbor服务了。

查看 Harbor 启动镜像

        要查看Harbor启动的镜像,可以按照以下步骤进行:

切换到Harbor安装目录: 使用cd命令切换到Harbor的安装目录。

cd /usr/local/harbor/

执行docker-compose ps命令: 运行docker-compose ps命令,它将显示Harbor启动的容器及其相关信息,包括容器的名称、状态和所使用的镜像。

docker-compose ps

        以上步骤将在Harbor安装目录下执行docker-compose ps命令,以查看Harbor启动的容器及其相关信息,包括所使用的镜像。

创建一个新项目

创建一个新项目并上传镜像到Harbor

  • 在浏览器中访问Harbor的WEB UI界面: 使用http://192.168.41.31访问Harbor的WEB UI界面。默认的管理员用户名和密码是admin/Harbor12345。

  • 登录并创建新项目: 在登录界面输入管理员用户名和密码后,点击登录按钮。然后点击"+项目"按钮创建一个新项目。

  • 填写项目信息: 在创建新项目的界面中,填写项目名称为"myproject-kgc",然后点击"确定"按钮创建新项目。

  • 使用Docker命令登录并推送镜像: 使用以下Docker命令在本地登录Harbor并推送镜像。默认情况下,Registry服务器在端口80上监听。

  • 登录Harbor:

docker login [-u admin -p Harbor12345] http://127.0.0.1
  • 下载镜像进行测试:
docker pull nginx
  • 打标签:
docker tag nginx:latest 127.0.0.1/myproject-kgc/nginx:v1
  • 上传镜像到Harbor:
docker push 127.0.0.1/myproject-kgc/nginx:v1
  • 在Harbor界面查看镜像: 在Harbor的WEB UI界面中,导航到"myproject-kgc"目录下,将看到上传的镜像及其相关信息。

按照以上步骤,将能够在Harbor中创建一个新项目,并通过Docker命令登录和推送镜像到该项目中。然后,您可以在Harbor的WEB界面中查看该项目下的镜像及其相关信息。

在其他客户端上传镜像

        以上操作都是在 Harbor 服务器本地操作。如果其他客户端登录到 Harbor,就会报如下错误。出现这问题的原因为Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以下错误。

docker login -u admin -p Harbor12345 http://192.168.41.31
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get https://192.168.10.23/v2/: dial tcp 192.168.41.31:443: connect: connection refused

        要在其他客户端上传镜像到Harbor,解决办法是:在 Docker server 启动的时候,增加启动参数,默认使用 HTTP 访问。

在Docker客户端配置操作: 使用vim或其他文本编辑器打开Docker服务的配置文件docker.service。

vim /usr/lib/systemd/system/docker.service
  • 在第13行修改ExecStart参数,添加--insecure-registry选项并指定Harbor服务器的IP地址。
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.41.31 --containerd=/run/containerd/containerd.sock

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.41.31

保存并关闭文件。

重启Docker服务: 使用systemctl命令重新加载配置文件并重启Docker服务。

systemctl daemon-reload
systemctl restart docker

再次登录Harbor: 使用docker login命令登录Harbor。可以使用用户名和密码进行登录,但请注意使用--password-stdin选项更安全。

docker login -u admin -p Harbor12345 http://192.168.41.31

        登录成功后,凭据将被保存在/root/.docker/config.json文件中,以便下次登录时可以直接使用凭据登录Harbor。

下载和上传镜像: 使用docker pull命令下载镜像,并使用docker tag和docker push命令将镜像打标签并上传到Harbor。

docker pull 192.168.41.31/myproject-kgc/nginx:v1
docker pull cirros
docker tag cirros:latest 192.168.41.31/myproject-kgc/cirros:v2
docker push 192.168.41.31/myproject-kgc/cirros:v2

刷新Harbor的Web管理界面: 在Harbor的WEB UI界面中,导航到"myproject-kgc"项目下,将看到上传的镜像及其相关信息。

        按照以上步骤,将能够在其他客户端配置Docker以上传镜像到Harbor。首先,在Docker客户端的配置文件中添加--insecure-registry选项,并重启Docker服务。然后,使用docker login命令登录Harbor,并使用docker pull、docker tag和docker push命令下载、打标签和上传镜像。最后,在Harbor的WEB界面中刷新,将看到上传的镜像及其相关信息。


维护管理Harbor

通过Harbor Web创建项目

要通过Harbor Web创建项目,可以按照以下步骤进行操作:

  • 打开Harbor Web界面并登录。

  • 导航到仓库页面,通常位于导航栏的顶部或侧边栏中。

  • 在仓库页面上,将看到一个项目列表。单击列表上方的"+项目"按钮。

  • 在弹出的对话框中,填写项目的名称。

  • 如果你希望项目是私有的(只有特定用户或团队可以访问),请确保项目级别设置为"私有",并取消勾选相关选项。

  • 如果你希望项目是公共的(任何人都可以访问),请将项目级别设置为"公共仓库",并保持相关选项处于选中状态。

  • 单击"创建"按钮以创建项目。

  • 现在,就可以将镜像推送到该项目中。在推送之前,请确保已经在本地配置了正确的Docker客户端,并且已经登录到Harbor仓库(如果项目是私有的)。

  • 推送镜像后,其他用户将能够通过Harbor Web界面或命令行下载该项目下的镜像。

请注意,Harbor的镜像操作与Docker Hub类似,但具体细节可能会有所不同。根据具体情况和需求,可能需要进一步了解Harbor的文档或参考指南。

创建 Harbor 用户

创建Harbor用户并分配权限

  • 在Harbor的Web管理界面中,单击"系统管理",然后选择"用户管理"。

  • 在用户管理页面上,单击"+用户"按钮。

  • 填写用户名为"test-zhangsan",邮箱为"test-zhangsan@qq.com",全名为"zhangsan",密码为"Abc123456",并在注释中添加"管理员"(可选)。

  • 单击"创建"按钮以创建用户。如果需要将该用户设置为管理员角色或进行其他操作,可以单击左侧的"…"按钮进行相应设置。

添加项目成员

  • 导航到项目页面,找到你的项目(例如"myproject-test")并单击进入。

  • 在项目页面上,找到"成员"选项卡并单击。

  • 单击"+成员"按钮。

  • 填写之前创建的用户"test-zhangsan",并将角色设置为"开发人员"。

  • 单击"创建"按钮以添加项目成员。如果需要更改成员角色或进行其他操作,可以单击左侧的"…"按钮进行相应设置。

在客户端上使用普通账户操作镜像

  • 首先,删除本地已经打标签的镜像
docker rmi 192.168.41.31/myproject-test/cirros:v2
  • 退出当前用户,并使用之前创建的账户"test-zhangsan"进行登录:
docker logout 192.168.41.31
docker login 192.168.41.31

或者

docker login -u test-zhangsan -p Abc123456 http://192.168.41.31
  • 下载和上传镜像进行测试(示例中的命令是下载名为"192.168.41.31/myproject-test/cirros:v2"的镜像,然后将其重新打标签为"192.168.41.31/myproject-test/cirros:v3"并上传):
docker pull 192.168.41.31/myproject-test/cirros:v2
docker tag cirros:latest 192.168.41.31/myproject-test/cirros:v3
docker push 192.168.41.31/myproject-test/cirros:v3

查看日志

  • 登录到Harbor的Web管理界面。

  • 导航到"系统管理"或"管理"选项卡,通常位于导航栏的顶部或侧边栏中。

  • 在系统管理页面上,会找到一个名为"日志"、"日志管理"或类似的选项。单击该选项以进入日志管理页面。

  • 在日志管理页面上,可以选择查看不同类型的日志,例如系统日志、访问日志、操作日志等。选择"操作日志"选项以查看用户相关操作的日志。

  • 根据你的需求,可以按时间顺序浏览日志,也可以使用搜索功能来筛选特定的操作日志。

  • 如果需要导出日志,通常会有一个"导出"或"下载"按钮,可以使用该按钮将日志保存到本地。

  • 请注意,具体的界面和选项可能因Harbor的版本和配置而有所不同。根据具体情况,可能需要进一步查阅Harbor的文档或参考指南

修改 Harbor.cfg 配置文件

        要修改Harbor的配置文件harbor.cfg中的可选参数

停止现有的Harbor实例: 在Harbor安装目录中运行以下命令,停止并删除现有的Harbor容器和相关卷。

cd /usr/local/harbor
docker-compose down -v

编辑harbor.cfg文件: 使用vim或其他文本编辑器打开harbor.cfg文件,对其中的可选参数进行修改。

vim harbor.cfg

注意:只能修改harbor.cfg文件中的可选参数,不要修改其他部分。

运行prepare脚本: 运行./prepare命令,它将根据新的配置文件填充配置。

./prepare

重新创建并启动Harbor实例: 运行docker-compose up -d命令,它将重新创建并启动Harbor容器。

docker-compose up -d

如果遇到防火墙相关的报错,请确保firewalld服务已启动,并执行以下命令重启防火墙服务:

systemctl restart firewalld.service
docker-compose up -d

以上步骤将停止现有的Harbor实例,更新配置文件,填充配置,然后重新创建并启动Harbor的实例。请确保在修改配置文件之前备份原始的harbor.cfg文件,以防止意外情况发生。

移除 Harbor 服务容器同时保留镜像数据/数据库,并进行迁移

在Harbor服务器上操作:

切换到Harbor安装目录: 使用cd命令切换到Harbor的安装目录。

cd /usr/local/harbor

移除Harbor服务容器: 运行docker-compose down -v命令,它将停止并删除Harbor服务容器,并删除相关的卷。

docker-compose down -v

打包镜像数据: 如果你希望保留镜像数据,可以将镜像数据目录打包为一个压缩文件。

ls /data/registry/docker/registry/v2/repositories/myproject-test
cd /data/registry/docker/registry/v2/repositories/myproject-test
tar zcvf test-registry.tar.gz ./*

这将在当前目录下创建一个名为test-registry.tar.gz的压缩文件,其中包含myproject-test项目的镜像数据。

迁移Harbor服务:

如果需要重新部署Harbor并移除所有Harbor服务容器的数据,可以按照以下步骤进行操作:

  • 切换到Harbor安装目录: 使用cd命令切换到Harbor的安装目录。
cd /usr/local/harbor
  • 移除Harbor服务容器和数据: 运行docker-compose down -v命令,它将停止并删除Harbor服务容器,并删除相关的卷和数据。
docker-compose down -v
  • 删除数据库和镜像数据: 运行rm -r命令,删除Harbor的数据库和镜像数据目录。
rm -r /data/database
rm -r /data/registry

以上步骤将移除Harbor服务容器的全部数据,包括数据库和镜像数据。请确保在执行这些操作之前备份了重要的数据,并且在重新部署之前已经做好了必要的准备工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1392952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp中uview组件库的NoticeBar 滚动通知 使用方法

目录 #平台差异说明 #基本使用 #配置主题 #配置图标 #配置滚动速度 #控制滚动的开始和暂停 #事件回调 #API #Props #Events 该组件用于滚动通告场景,有多种模式可供选择 #平台差异说明 AppH5微信小程序支付宝小程序百度小程序头条小程序QQ小程序√√√√…

【不需要网络不需要显卡】本地部署GPT

【不需要网络/不需要显卡】本地部署GPT 大家好,我是老 J 我们都知道ChatGPT目前只有两种使用方式,一种是直接去官网访问,适合个人用户;另一种是API调用,适合企业或者网站使用。这两种方式的门槛都比较高,…

10个用于Android开发的有用的Kotlin库及示例

10个用于Android开发的有用的Kotlin库及示例 在Android开发领域,Kotlin已成为一门领先的语言,带来了现代语法和功能的浪潮。随着Kotlin的崛起,涌现出了许多专为其定制的库,进一步增强了开发体验。本文将深入介绍其中的10个库&…

【论文阅读】One For All: Toward Training One Graph Model for All Classification Tasks

目录 0、基本信息1、研究动机2、创新点——One For All :unique features3、准备4、具体实现4.1、用TAGs统一来自不同领域的图数据4.2、用NOI(NODES-OF-INTEREST)统一不同图任务4.2.1、NOI子图4.2.2、NOI提示结点 4.3、用于图的上下文学习&am…

Rust之构建命令行程序(三):重构改进模块化和错误处理

开发环境 Windows 10Rust 1.74.1 VS Code 1.85.1 项目工程 这次创建了新的工程minigrep. 重构改进模块化和错误处理 为了改进我们的程序,我们将修复与程序结构及其处理潜在错误的方式有关的四个问题。首先,我们的main函数现在执行两项任务:解析参数和…

Find My相机|苹果Find My技术与相机结合,智能防丢,全球定位

相机是一种利用光学成像原理形成影像并使用底片记录影像的设备,是用于摄影的光学器械。相机让我们能够记录下美丽的风景和珍贵的时刻。当我们到达一个迷人的地方,或者经历了一个特别难忘的时刻时,我们可以使用照相机来拍摄照片,记录下这些美好的回忆。照相机可以帮助…

最新 生成pdf文字和表格

生成pdf文字和表格 先看效果 介绍 java项目&#xff0c;使用apache的pdfbox工具&#xff0c;可分页&#xff0c;自定义列 依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.22<…

鸿蒙开发(四)UIAbility和Page交互

通过上一篇的学习&#xff0c;相信大家对UIAbility已经有了初步的认知。在上篇中&#xff0c;我们最后实现了一个小demo&#xff0c;从一个UIAbility调起了另外一个UIAbility。当时我提到过&#xff0c;暂不实现比如点击EntryAbility中的控件去触发跳转&#xff0c;而是在Entry…

Qt编程之仿gnome-terminal终端样式 +颜色文字显示

Qt仿linux 终端样式 颜色文字 1.说再多废话不如直接show code2.实现效果 本文采用QTextBrowser作为文本显示窗口&#xff0c;进行文本的显示。本文实例实现的效果并没有终端的输入效果&#xff0c;这里只是提供一些仿终端样式思路。 1.说再多废话不如直接show code 1.ui文件…

Openwrt 下动态路由协议(quagga-OSPF)配置与验证

文章目录 前言网络拓扑静态路由方式动态路由方式Openwrt下 Quagga 安装Quagga 配置R1路由器zebra配置R1路由器ospf配置R2路由器zebra配置R2路由器ospf配置OSPF协议分析REF本文将在两台openwrt系统上安装配置quagga, 搭建一套完整环境,来验证OSPF动态路由的基本功能和实际效果,…

关于变量在多个.C文件中使用(Undefined symbol tempbuff (referred from main.o).问题解决)

1、如图结构&#xff0c;想在multimenu.C和usart1.c中使用变量tempbuff 于是&#xff0c;就将使用的代码移动了过来&#xff0c;为SetTxData1_toLCD(0x00,0x01);和UserUart1Send( tempbuff1,sizeof(tempbuff1));&#xff0c;编译后提示错误如下&#xff1a; communication_prot…

从零开始学习Python基础语法:打开编程大门的钥匙

文章目录 一、引言1.1 Python作为一种流行的编程语言的介绍1.2 Python的应用领域和适用性 二、为什么选择Python2.1 Python的简洁性和易读性2.2 Python的跨平台特性 三、Python在数据科学和人工智能领域的应用3.1 第一个Python程序3.1.1 Hello, World!&#xff1a;编写并运行你…

XXL-Job的搭建接入Springboot项目(详细)

一、XXL-Job介绍 XXL-Job 是一款开源的分布式任务调度平台&#xff0c;由 Xuxueli&#xff08;徐雪里&#xff09;开发。它基于 Java 技术栈&#xff0c;提供了一套简单易用、高可靠性的任务调度解决方案。 XXL-Job 的主要作用是帮助开发者实现定时任务的调度和执行。它可以用…

安装脚手架Vue CLI详解!!!

Vue CLI基本介绍&#xff1a; Vue CLI是Vue官方提供的一个全局命令工具。可以帮助我们快速创建一个开发Vue项目的标准化基础架子【集成了webpack配置】 安装脚手架好处&#xff1a; 开箱即用&#xff0c;零配置&#xff1b;内置babel等工具&#xff1b;标准化 安装步骤&#…

vscode中关于python的一些常用配置

文章目录 python cv2 提示配置第一步 配置提示信息第二部 重启vs 可能还不行&#xff0c;那就重新安装以下opencv-python 配置pytest还是如上&#xff0c;将下入的位置打开编写测试用例 配置跨文件import在工作目录中新建一个.env文件输入内容如下打开.vscode中的setting.json …

react umi/max 封装页签组件

1. models/tabs // 全局共享数据示例 import { useState } from react;const useUser () > {const [items, setItems] useState<any[]>([]); // 页签的全局Item数据const [key, setKey] useState<string>(/home); // 页签的高亮Keyreturn {items,setItems…

leetcode热题100.路径总和 III

Problem: 437. 路径总和 III 文章目录 题目思路1复杂度1Code1思路2复杂度2Code2 题目 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶…

Leetcode:128. 最长连续序列

128. 最长连续序列 乍一看感觉很简单&#xff0c;一看要用O(n)??? 因为我觉得题目很难而且题目看起来很简单&#xff0c;感觉以后会用到&#x1f606;&#xff0c;做个记录 1.朴素做法 思路 答:任何一段连续的数都有一个左端点&#xff1a;比如&#xff08;1&#xff0c;…

TCP 拥塞控制对数据延迟的影响

哈喽大家好&#xff0c;我是咸鱼 今天分享一篇文章&#xff0c;是关于 TCP 拥塞控制对数据延迟产生的影响的。作者在服务延迟变高之后进行抓包分析&#xff0c;结果发现时间花在了 TCP 本身的机制上面&#xff1a;客户端并不是将请求一股脑发送给服务端&#xff0c;而是只发送…

web架构师编辑器内容-编辑器组件图层面板功能开发01-锁定隐藏功能的开发

我们这一部分主要是对最右侧图层面板功能进行剖析&#xff0c;完成对应的功能的开发: 每个图层都对应编辑器上面的元素&#xff0c;有多少个元素就对应多少个图层&#xff0c;主要的功能如下&#xff1a; 锁定功能&#xff1a;点击锁定&#xff0c;在编辑器中没法编辑对应的组…