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.组装原则: ①按“先小后大”“从里到外”的顺序进行,不遗漏每一环节,不“带病”进行下一环节。 ②合理使用工具器材,…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
