Docker registry镜像仓库,私有仓库及harbor管理详解
目录
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 -s
和uname -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.41.31/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服务容器的全部数据,包括数据库和镜像数据。请确保在执行这些操作之前备份了重要的数据,并且在重新部署之前已经做好了必要的准备工作。
相关文章:

Docker registry镜像仓库,私有仓库及harbor管理详解
目录 registry镜像仓库概述 Docker 镜像仓库(Docker Registry): registry 容器: 私有仓库概述 搭建本地私有仓库示例 Harbor概述 harbor架构 详解构成 Harbor由容器构成 Harbor部署示例 环境准备 部署Docker-Compose服…...

用 Rust 过程宏魔法简化 SQL 函数实现
#[function("length(varchar) -> int4")] pub fn char_length(s: &str) -> i32 {s.chars().count() as i32 }这是 RisingWave 中一个 SQL 函数的实现。只需短短几行代码,通过在 Rust 函数上加一行过程宏,我们就把它包装成了一个 SQL…...

OpenSource - 基于 DFA 算法实现的高性能 java 敏感词过滤工具框架
文章目录 sensitive-word创作目的特性变更日志更多资料敏感词控台敏感词标签文件 快速开始准备Maven 引入核心方法判断是否包含敏感词返回第一个敏感词返回所有敏感词默认的替换策略指定替换的内容自定义替换策略 IWordResultHandler 结果处理类使用实例 更多特性样式处理忽略大…...

端杂七杂八系列篇四-Java8篇
后端杂七杂八系列篇四-Java8篇 ① Lombok插件① RequiredArgsConstructor② SneakyThrows③ UtilityClass④ Cleanup ② Lambda 4个常用的内置函数① Function<T, R> - 接受一个输入参数并返回一个结果② Consumer - 接受一个输入参数,并执行某种操作…...

操作系统一些面试
你这个请求队列是属于一写多读对吧,怎么解决冲突的? 可以采用双buffer或者说双缓冲区,一个缓冲区用来写,一个缓冲区用来读,采用交换指针的方法来进行缓存区的交换,这样交换效率是O(1)的,但是交…...

大语言模型
概念 大语言模型(Large Language Model,简称LLM)是一种基于人工智能技术的自然语言处理模型,是指在大量数据上训练的高级人工智能算法,以自上文推理词语概率为核心任务。它通过在海量文本数据上进行训练,学…...

php反序列化之pop链构造(基于重庆橙子科技靶场)
常见魔术方法的触发 __construct() //创建类对象时调用 __destruct() //对象被销毁时触发 __call() //在对象中调用不可访问的方法时触发 __callStatic() //在静态方式中调用不可访问的方法时触发 __get() //调用类中不存在变量时触发(找有连续箭头的…...

k8s---对外服务 ingress
目录 目录 目录 ingress与service ingress的组成 ingress-controller: ingress暴露服务的方式 2.方式二:DaemonSethostnetworknodeSelector DaemonSethostnetworknodeSelector如何实现 3.deploymentNodePort: 虚拟主机的方式实现http代…...

最优解-最长公共子序列
问题描述 最长公共子序列(Longest Common Subsequence,LCS)即求两个序列最长的公共子序列(可以不连续)。比如3 2 1 4 5和1 2 3 4 5两个序列,最长公共子序列为2 4 5 长度为3。解决这个问题必然要使用动态规划。既然要用到动态规划,就要知道状…...

el-tree获取当前选中节点及其所有父节点的id(包含半选中父节点的id)
如下图,我们现在全勾中的有表格管理及其下的子级,而半勾中的有工作台和任务管理及其子级 现在点击保存按钮后,需要将勾中的节点id及该节点对应的父节点,祖先节点的id(包含半选中父节点的id)也都一并传给后端,那这个例子里就应该共传入9个id,我们可以直接将getCheckedK…...

新上线一个IT公司微信小程序
项目介绍 项目背景: 一家IT公司,业务包含以下六大块: 1、IT设备回收 2、IT设备租赁 3、IT设备销售 4、IT设备维修 5、IT外包 6、IT软件开发 通过小程序,提供在线下单,在线制单,在线销售,业务介绍,推广,会员 项目目的: 业务介绍: 包含企业业务介绍 客户需…...

MCAL配置-PWM(EB23.0)
PWM配置项的介绍 一、General 1、PwmDeInitApi 从代码中添加/删除Pwm_17_GtmCcu6_Delnit() API。 TRUE:Pwm_17_GtmCcu6_Delnit() API可供用户使用。 FALSE:Pwm_17_GtmCcu6_Delnit() API对用户不可用。 注意:默认情况下禁用Pwm_17_GtmCcu6_Delnit() …...

v-if和v-for哪个优先级更高?
v-if和v-for哪个优先级更高? 结论: vue2输出的渲染函数是先执行循环,在看条件判断,如果将v-if和v-for写在一个标签内,哪怕只渲染列表中的一小部分,也要重新遍历整个列表,无形造成资源浪费。vu…...

Mapstruct 常用案例(持续更新.).
将A转换为B Mapper(componentModel "spring") public interface DemoConvert {B A2B(A a); }将List转换为List 注意:以下两个都不可缺少,需要先声明单个和集合的同时生命才可 Mapper(componentModel "spring") public interface …...

QT基础篇(10)QT5网络与通信
QT5网络与通信是指在QT5开发环境中使用网络进行数据传输和通信的相关功能和技术。 QT5提供了一套完善的网络模块,包括了TCP、UDP、HTTP等协议的支持,可以方便地在QT应用程序中进行网络通信。通过QT5的网络模块,开发者可以实现客户端和服务器…...

【Leetcode】269.火星词典(Hard)
一、题目 1、题目描述 现有一种使用英语字母的火星语言,这门语言的字母顺序与英语顺序不同。 给你一个字符串列表 words ,作为这门语言的词典,words 中的字符串已经 按这门新语言的字母顺序进行了排序 。 请你根据该词典还原出此语言中已知的字母顺序,并 按字母递增顺序…...

opencv_模型训练
文件夹 opencv训练文件 xml negdataposdata 说明 negdata目录: 放负样本的目录 posdata目录: 放正样本的目录 xml目录: 新建的一个目录,为之后存放分类器文件使用 neg.txt: 负样本路径列表 pos.txt: 正样本路径列表 pos.vec: 后续自动生成…...

python PyQt5的学习
一、安装与配置 1、环境: python3.7 2、相关模块 pip install pyqt5 pyqt5-tools pyqt5designer 可以加个镜像 -i https://pypi.tuna.tsinghua.edu.cn/simple3、配置设计器 python的pyqt5提供了一个设计器,便于ui的设计 界面是这样的:…...

3.goLand基础语法
目录 概述语法for常量与变量数组切片 slice切片问题问题1问题2 Make 和 New结构体和指针结构体标签 结束 概述 从 java 转来学 go ,在此记录,方便以后翻阅。 语法 for package mainimport "fmt"func main() {for i : 0; i < 3; i {fmt.…...

计算机硬件 5.2组装整机
第二节 组装整机 一、准备工作 1.常用工具:中号十字螺丝刀、尖嘴钳、软毛刷、防静电手环等。 2.组装原则: ①按“先小后大”“从里到外”的顺序进行,不遗漏每一环节,不“带病”进行下一环节。 ②合理使用工具器材,…...

Docker搭建MySQL主从数据库-亲测有效
1、测试环境概述 1、使用MySQL5.7.35版本 2、使用Centos7操作系统 3、使用Docker20版本 案例中描述了整个测试的详细过程 2、安装Docker 2.1、如果已经安装docker,可以先卸载 yum remove -y docker \ docker-client \ docker-client-latest \ docker-common \ docker-l…...
PyTorch 中的距离函数深度解析:掌握向量间的距离和相似度计算
目录 Pytorch中Distance functions详解 pairwise_distance 用途 用法 参数 数学理论公式 示例代码 cosine_similarity 用途 用法 参数 数学理论 示例代码 输出结果 pdist 用途 用法 参数 数学理论 示例代码 总结 Pytorch中Distance functions详解 pair…...

【Vue技巧】vue3中不支持.sync语法糖的解决方案
海鲸AI-ChatGPT4.0国内站点,支持设计稿转代码:https://www.atalk-ai.com 在 Vue 3 中,.sync 修饰符已经被移除。在 Vue 2 中,.sync 修饰符是一个语法糖,用于简化子组件和父组件之间的双向数据绑定。在 Vue 3 中&#x…...

设计模式⑦ :简单化
文章目录 一、前言二、Facade 模式1. 介绍2. 应用3. 总结 三、Mediator 模式1. 介绍2. 应用3. 总结 一、前言 有时候不想动脑子,就懒得看源码又不像浪费时间所以会看看书,但是又记不住,所以决定开始写"抄书"系列。本系列大部分内容…...

Java:选择哪个Java IDE好?
Java:选择哪个Java IDE好? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!&…...

unity打包apk后网络请求提示unknown error处理
近期同事的一个比较老的版本的unity项目在电脑上运行都正常,但是打包成android后安装到手机上就提示unknown error 让我帮他排查一下问题。由于是涉密项目不能发图就简单介绍下处理过程吧! 一、故障原因 请求的地址ssl证书过期了。 二、处理过程 更改请…...

力扣 | 11. 盛最多水的容器
双指针解法–对撞指针 暴力解法public int maxArea1(int[] height) {int n height.length;int ans 0;for (int i 0; i < n; i) {for (int j i 1; j < n; j) {int area Math.min(height[i], height[j]) * (j - i);ans Math.max(ans, area);}}return ans;}双指针解法…...

史上最全EasyExcel
一、EasyExcel介绍 1、数据导入:减轻录入工作量 2、数据导出:统计信息归档 3、数据传输:异构系统之间数据传输 二、EasyExcel特点 Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内…...

MySQL---事务的四大特性详解(高频面试题)
在MySQL中,事务具有以下四个基本特性: 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这些特性通常被称为ACID特性。 一…...

为 OpenCV 编写文档(二)
常用命令 这里通过简短的示例描述了最常用的 doxygen 命令。有关可用命令的完整列表和详细说明,请访问命令参考。 基本命令 brief - 带有简要实体描述的段落 param - 函数参数的描述。 多个相邻语句合并到一个列表中。如果在实际函数签名中找不到具有此名称的参数…...