Docker之私有仓库 RegistryHarbor

【Docker】Harbor构建—Linux系统运维与管理之Linux虚拟化 - 编程开发教程_CentOS - 虎课网

目录

一、Docker私有仓库(Registry)

1.1  Registry的介绍

 二、搭建本地私有仓库

2.1首先下载 registry 镜像

2.2在 daemon.json 文件中添加私有镜像仓库地址

 2.3运行 registry 容器

2.4Docker容器的重启策略

2.5为镜像打标签

2.6上传到私有仓库

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

2.8列创出私有仓库的 centos 镜像有哪些

2.8先删除原有的 centos 的镜像,再测试私有仓库下载

三、 Harbor 简介

3.1什么是Harbor

3.2Harbor的特性

3.3Harbor的构成

四。部署Harbor

4.1部署 Docker-Compose 服务

4.2部署 Harbor 服务

4.2.1下载或上传 Harbor 安装程序

4.2.2修改harbor安装的配置文件

4.3 Harbor.cfg 配置文件中有两类参数:所需参数和可选参数

4.3 .1所需参数

4.3 .2可选参数

4.4启动 Harbor

4.5查看 Harbor 启动镜像

4.6创建一个新项目

五、维护管理Harbor

5.1通过 Harbor Web 创建项目

5.2创建 Harbor 用户

(1)创建用户并分配权限

(2)添加项目成员

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

5.3查看日志

5.4修改 Harbor.cfg

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

(1)移除 Harbor 服务容器

(2)把项目中的镜像数据进行打包


一、Docker私有仓库(Registry)

1.1  Registry的介绍

关于Docker的仓库分为私有库和公有仓库,共有仓库只要在官方注册用户,登录即可使用。但对于仓库的使用,企业还是会有自己的专属镜像,所以私有库的搭建也是很有必要的存在。

对于原生的仓库,Docker提供了Registry,它能帮助我们组建属于自己的私有库,但是缺点也比较明显,就是难管理,无法进行复杂的操作
 

 二、搭建本地私有仓库

2.1首先下载 registry 镜像

docker pull registry

2.2在 daemon.json 文件中添加私有镜像仓库地址

vim /etc/docker/daemon.json
{"insecure-registries": ["192.168.237.21:5000"],                                              
}
systemctl restart docker.service

 2.3运行 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目录(这个目录是registry容器中            存放镜像文件的目录),来实现数据的持久化;

-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了

--restart=always:这是重启的策略,在容器退出时总是重启容器

--name registry:创建容器命名为registry

registry:latest:这个是刚才pull下来的镜像

2.4Docker容器的重启策略

no:默认策略,在容器退出时不重启容器

on-failure:在容器非正常退出时(退出状态非0),才会重启容器

on-failure:3 :在容器非正常退出时重启容器,最多重启3次 always:在容器退出时总是重启容器

unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

2.5为镜像打标签

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

2.6上传到私有仓库

docker push 192.168.237.21:5000/centos:v1

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

curl http://192.168.10.23:5000/v2/_catalog

2.8列创出私有仓库的 centos 镜像有哪些

​tag curl http://192.168.10.23:5000/v2/centos/tags/list

2.8先删除原有的 centos 的镜像,再测试私有仓库下载

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

三、 Harbor 简介

3.1什么是Harbor

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

Harbor以 Docker 公司开源的 Registry 为基础,提供了图形管理 UI 、基于角色的访问控制(Role Based AccessControl) 、AD/LDAP 集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。

Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 docker-compose 来对它进行部署。用于部署 Harbor 的 docker-compose 模板位于 harbor/docker-compose.yml。

3.2Harbor的特性

1、基于角色控制:用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不同的权限。

2、基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制(同步)。

3、支持 LDAP/AD:Harbor 可以集成企业内部已有的 AD/LDAP(类似数据库的一张表),用于对已经存在的用户认证和管理。

4、镜像删除和垃圾回收:镜像可以被删除,也可以回收镜像占用的空间。

5、图形化用户界面:用户可以通过浏览器来浏览,搜索镜像仓库以及对项目进行管理。

6、审计管理:所有针对镜 像仓库的操作都可以被记录追溯,用于审计管理。

7、支持 RESTful API:RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。

8、Harbor和docker registry的关系:Harbor实质上是对docker registry做了封装,扩展了自己的业务模板。

3.3Harbor的构成

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

 ocker Harbor私有仓库操作的过程

1.所有的请求或认为的操作都会首先交给proxy(反向代理)

2.proxy会先将请求转发给后端Core services,Core services 中包含

3.UI、token(身份验证服务)、webhook(网站的一些服务功能)

4.转发给registry(镜像存储),若需要下载镜像等权限操作,需要通过Core services中的token令牌的身份验证服务才行

5.每一次下载和上传都产生操作记录,生成日志,保存至database中

6.database记录保存镜像的元信息及用户与组的身份信息,通过验证授权才能允许相关操作

  •  Proxy: 是一个 nginx 的前端代理,Harbor 的 Registry、UI、Token 服务等组件,都处在 nginx 反向代理后边。 该代理将来自浏览器、docker clients 的请求转发到后端不同的服务上。
  • Registry: 负责储存 Docker 镜像,并处理 Docker push/pull 命令。由于要对用户进行访问控制,即不同用户对 Docker 镜像 有不同的读写权限,Registry 会指向一个 Token 服务,强制用户的每次 Docker pull/push 请求都要携带一个合法的 Token, Registry 会通过公钥对 Token 进行解密验证。 Core services: Harbor的核心功能,
    • 1)UI(harbor-ui): 提供图形化界面,帮助用户管理 Registry 上的镜像(image), 并对用户进行授权。
    • 2)WebHook:为了及时获取Registry上image 状态变化的情况,在Registry 上配置 Webhook,把状态变化传递给 UI 模块。
    • 3)Token 服务:负责根据用户权限给每个 Docker push/pull 命令签发 Token。Docker 客户端向 Registry 服务发起的请求, 如果不包含 Token,会被重定向到 Token 服务,获得 Token 后再重新向 Registry 进行请求。
  • Database(harbor-db):为core services提供数据库服务,负责储存用户权限、审计日志、Docker 镜像分组信息等数据。
  • Job services: 主要用于镜像复制,本地镜像可以被同步到远程 Harbor 实例上。
  • Log collector(harbor-log): 负责收集其他组件的日志到一个地方。

四。部署Harbor

Harbor服务器 192.168.237.21 docker-ce、docker-compose、harbor-offline-v1.2.2

client服务器 192.168.237.22    docker-ce

4.1部署 Docker-Compose 服务

下载或者上传 Docker-Compose

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 +x /usr/local/bin/docker-composedocker-compose --version

4.2部署 Harbor 服务

4.2.1下载或上传 Harbor 安装程序

2. wget http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgztar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/

4.2.2修改harbor安装的配置文件

vim /usr/local/harbor/harbor.cfg
--5行--修改,设置为Harbor服务器的IP地址或者域名
hostname = 192.168.10.23
--59行--指定管理员的初始密码,默认的用户名/密码是admin/Harbor12345
harbor_admin_password = Harbor12345

4.3 Harbor.cfg 配置文件中有两类参数:所需参数和可选参数

4.3 .1所需参数

这些参数需要在配置文件 Harbor.cfg 中设置。如果用户更新它们并运行 install.sh 脚本重新安装 Harbor, 参数将生效。具体参数如下:

●hostname:用于访问用户界面和 register 服务。它应该是目标机器的 IP 地址或完全限定的域名(FQDN),例如 192.168.10.23 或 hub.kgc.cn。不要使用 localhost 或 127.0.0.1 为主机名。

●ui_url_protocol:(http 或 https,默认为 http)用于访问 UI 和令牌/通知服务的协议。如果公证处于启用状态,则此参数必须为 https。

●max_job_workers:镜像复制作业线程。

●db_password:用于db_auth 的MySQL数据库root 用户的密码。

●customize_crt:该属性可设置为打开或关闭,默认打开。打开此属性时,准备脚本创建私钥和根证书,用于生成/验证注册表令牌。当由外部来源提供密钥和根证书时,将此属性设置为 off。

●ssl_cert:SSL 证书的路径,仅当协议设置为 https 时才应用。

●secretkey_path:用于在复制策略中加密或解密远程 register 密码的密钥路径

4.3 .2可选参数

这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动 Harbor 后在 Web UI 上进行更新。如果进入 Harbor.cfg,只会在第一次启动 Harbor 时生效,随后对这些参数的更新,Harbor.cfg 将被忽略。

注意:如果选择通过 UI 设置这些参数,请确保在启动 Harbor 后立即执行此操作。具体来说,必须在注册或在 Harbor 中创建任何新用户之前设置所需的 auth_mode。当系统中有用户时(除了默认的 admin 用户), auth_mode 不能被修改。 具体参数如下:

●Email:Harbor 需要该参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能时才启用。请注意,在默认情况下 SSL 连接时没有启用。如果 SMTP 服务器需要 SSL,但不支持 STARTTLS,那么应该通过设置启用 SSL email_ssl = TRUE。

●harbor_admin_password:管理员的初始密码,只在 Harbor 第一次启动时生效。之后, 此设置将被忽略,并且应在 UI 中设置管理员的密码。请注意,默认的用户名/密码是admin/Harbor12345。

●auth_mode:使用的认证类型,默认情况下,它是 db_auth,即凭据存储在数据库中。对于LDAP身份验证,请将其设置为 ldap_auth。

●self_registration:启用/禁用用户注册功能。禁用时,新用户只能由 Admin 用户创建,只有管理员用户可以在 Harbor 中创建新用户。注意:当 auth_mode 设置为 ldap_auth 时,自注册功能将始终处于禁用状态,并且该标志被忽略。

●Token_expiration:由令牌服务创建的令牌的到期时间(分钟),默认为 30 分钟。

●project_creation_restriction:用于控制哪些用户有权创建项目的标志。默认情况下,每个人都可以创建一个项目。 如果将其值设置为“adminonly”,那么只有 admin 可以创建项目。

●verify_remote_cert:打开或关闭,默认打开。此标志决定了当Harbor与远程 register 实例通信时是否验证 SSL/TLS 证书。 将此属性设置为 off 将绕过 SSL/TLS 验证,这在远程实例具有自签名或不可信证书时经常使用

另外,默认情况下,Harbor 将镜像存储在本地文件系统上。在生产环境中,可以考虑 使用其他存储后端而不是本地文件系统,如 S3、Openstack Swif、Ceph 等对象存储。但需要更新 common/templates/registry/config.yml 文件。 Harbor的默认镜像存储路径在 /data/registry 目录下,映射到docker容器里面的 /storage 目录下。 这个参数是在 docker-compose.yml 中指定的,在 docker-compose up -d 运行之前修改。

如果希望将 Docker 镜像存储到其他的磁盘路径,可以修改这个参数。

4.4启动 Harbor

cd /usr/local/harbor/

在配置好了 harbor.cfg 之后,执行 ./prepare 命令,为 harbor 启动的容器生成一些必要的文件(环境)

再执行命令 ./install.sh 以 pull 镜像并启动容器

4.5查看 Harbor 启动镜像

cd /usr/local/harbor/
docker-compose ps

4.6创建一个新项目

(1)浏览器访问:http://192.168.10.23 登录 Harbor WEB UI 界面,默认的管理员用户名和密码是 admin/Harbor12345

(2)输入用户名和密码登录界面后可以创建一个新项目。点击“+项目”按钮

(3)填写项目名称为“myproject-kgc”,点击“确定”按钮,创建新项目

(4)此时可使用 Docker 命令在本地通过 127.0.0.1 来登录和推送镜像。默认情况下,Registry 服务器在端口 80 上侦听。

//登录 Harbor
docker login [-u admin -p Harbor12345] http://127.0.0.1//下载镜像进行测试
docker pull nginx//将镜像打标签
格式:docker tag 镜像:标签  仓库IP/项目名称/镜像名:标签
docker tag nginx:latest 127.0.0.1/myproject-kgc/nginx:v1//上传镜像到 Harbor
docker push 127.0.0.1/myproject-kgc/nginx:v1

(5)  在 Harbor 界面 myproject-kgc 目录下可看见此镜像及相关信息

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

​
docker login -u admin -p Harbor12345 http://192.168.10.23WARNING! 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.10.23:443: connect: connection refused​

(1)在 Docker 客户端配置操作

​
//解决办法是:在 Docker server 启动的时候,增加启动参数,默认使用 HTTP 访问。vim /usr/lib/systemd/system/docker.service--13行--修改ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.10.23 --containerd=/run/containerd/containerd.sock 
或 
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.10.23//重启 Docker,再次登录 s
ystemctl daemon-reloadsystemctl restart docker//再次登录 Harbor 
docker login -u admin -p Harbor12345 http://192.168.10.23WARNING! Using --password via the CLI is insecure. Use --password-stdin. 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Login Succeeded 
//将自动保存凭据到/root/.docker/config.json,下次登录时可直接使用凭据登录 Harbor//下载镜像进行测试 
docker pull 192.168.10.23/myproject-kgc/nginx:v1//上传镜像进行测试 
docker pull cirros 
docker tag cirros:latest 192.168.10.23/myproject-kgc/cirros:v2
docker push 192.168.10.23/myproject-kgc/cirros:v2

(2)刷新 Harbor 的 Web 管理界面进行查看,会发现 myproject-kgc 项目里面有两个镜像

五、维护管理Harbor

5.1通过 Harbor Web 创建项目

在 Harbor 仓库中,任何镜像在被 push 到 regsitry 之前都必须有一个自己所属的项目。 单击“+项目”,填写项目名称,项目级别若设置为"私有",则不勾选。如果设置为公共仓库,则所有人对此项目下的镜像拥有读权限,命令行中不需要执行"Docker login"即可下载镜像,镜像操作与 Docker Hub 一致。

5.2创建 Harbor 用户

(1)创建用户并分配权限

在 Web 管理界面中单击系统管理 -> 用户管理 -> +用户,

填写用户名为“kgc-zhangsan”,邮箱为“kgc-zhangsan@kgc.com”,全名为“zhangsan”,密码为“Abc123456”,注释为“管理员”(可省略)。

附:用户创建成功后,单击左侧“...”按钮可将上述创建的用户设置为管理员角色或进行删除操作,本例不作任何设置。

(2)添加项目成员

单击项目 -> myproject-kgc-> 成员 -> + 成员,填写上述创建的用户 kgc-zhangsan 并分配角色为“开发人员”。

附:此时单击左侧“...”按钮仍然可对成员角色进行变更或者删除操作

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

//删除上述打标签的本地镜像

docker rmi 192.168.10.23/myproject-kgc/cirros:v2

//先退出当前用户,然后使用上述创建的账户 kgc-zhangsan 登录

​
docker logout 192.168.10.23docker login 192.168.10.23或docker login -u kgc-zhangsan -p Abc123456 http://192.168.10.23

//下载和上传镜像进行测试

docker pull 192.168.10.23/myproject-kgc/cirros:v2docker tag cirros:latest 192.168.10.23/myproject-kgc/cirros:v3 docker push 192.168.10.23/myproject-kgc/cirros:v3

5.3查看日志

Web 界面日志,操作日志按时间顺序记录用户相关操作

5.4修改 Harbor.cfg

配置文件 要更改 Harbor的配置文件中的可选参数时,请先停止现有的 Harbor实例并更新 Harbor.cfg;然后运行 prepare 脚本来填充配置; 最后重新创建并启动 Harbor 的实例。

使用 docker-compose 管理 Harbor 时,必须在与 docker-compose.yml 相同的目录中运行。

cd /usr/local/harbor docker-compose down -vvim harbor.cfg #只能修改可选参数./preparedocker-compose up -d//如果有以下报错,需要开启防火墙 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

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

//在Harbor服务器上操作

(1)移除 Harbor 服务容器

cd /usr/local/harbordocker-compose down -v

(2)把项目中的镜像数据进行打包

//持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的/var/log/Harbor/目录下 ls

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

5.6如需重新部署,需要移除 Harbor 服务容器全部数据

cd /usr/local/harbordocker-compose down -vrm -r /data/database

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm的内存区域

JVM 内存分为线程私有区和线程共享区,其中方法区和堆是线程共享区,虚拟机栈、本地方法栈和程序计数器是线程隔离的数据区。 1)程序计数器 程序计数器(Program Counter Register)也被称为 PC 寄存器,是一块…

基于Echarts的大数据可视化模板:大数据医疗服务平台

目录 引言大数据在医疗领域的应用ECharts在医疗服务中的作用医疗大数据的应用方向临床决策支持药物研发与安全性监测健康管理与预防流行病监测与公共卫生基因组学与个性化医疗医疗保险与费用管理Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所…

只考一门数据结构,计算机学硕复录比1:1的山东双非学校考情分析

青岛理工大学 考研难度(☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1420字,预计阅读:3分钟 2023考情概况 青岛理工…

redis缓存雪崩、穿透、击穿解决方案

redis缓存雪崩、穿透、击穿解决方案 背景缓存雪崩缓存击穿缓存穿透总结背景 关于缓存异常,我们常见的有三个问题:缓存雪崩、缓存击穿、缓存穿透。这三个问题一旦发生,会导致大量请求直接落到数据库层面。如果请求的并发量很大,会影响数据库的运行,严重的会导致数据库宕机…

openGauss学习笔记-54 openGauss 高级特性-MOT

文章目录 openGauss学习笔记-54 openGauss 高级特性-MOT54.1 MOT特性及价值54.2 MOT关键技术54.3 MOT应用场景54.4 不支持的数据类型54.5 使用MOT54.6 将磁盘表转换为MOT openGauss学习笔记-54 openGauss 高级特性-MOT openGauss引入了MOT(Memory-Optimized Table&…

如何高效地设计测试用例并评审

编写出好的测试用例是每一个测试工程师的职责,但在实际工作中大家写的测试用例往往需要不断地修改才能使用,这不仅浪费了时间,还容易让测试工程师产生自我否定的情绪,甚至在团队中产生各种矛盾。 那如何高效地设计测试用例呢&…

可直接运营的餐饮外卖点餐自提单多门店小程序开发演示

适合鲜花店、蛋糕店、奶茶店、餐饮店、便利店等门店商家的小程序。 小程序系统支持外卖和自提两种模式,帮助商家打造自己的私域流量池,减少对美团和饿了么的依赖,提升用户点餐、就餐体验。 支持会员签到获取积分的功能,积分可用…

jwt安全问题

文章目录 jwt安全问题jwt简介jwt组成headerpayloadsignature 潜在漏洞空加密算法web346 密钥爆破web348 敏感信息泄露web349 **修改算法RS256为HS256**web350 jwt安全问题 jwt简介 JWT的全称是Json Web Token,遵循JSON格式,跨域认证解决方案&#xff0…

【93】PCI Expansion ROM

1、Expansion ROM PCIe、PCI设备可以提供Expansion ROM,Expansion ROM中存在设备初始化或者system boot的code。SystemBIOS在POST(Power-on Self Test)阶段,会枚举PCI设备,并判断有设备是否支持Expansion ROM&#xff…

Python爬虫武汉市二手房价格数据采集分析:Linear Regression、XGBoost和LightGBM|代码分享...

全文链接:http://tecdat.cn/?p31958 分析师:Yan Liu 我国有大量的资金都流入了房地产行业,同时与其他行业有着千丝万缕的联系,可以说房地产行业对推动我国深化改革、经济发展、工业化和城市化具有不可磨灭的作用(点击…

WebSocket详解以及应用

😜作 者:是江迪呀✒️本文关键词:websocket、网络、长连接、前端☀️每日 一言:任何一个你不喜欢而又离不开的地方,任何一种你不喜欢而又无法摆脱的生活,都是监狱! 一、前言 我们在…

基于Spring Gateway路由判断器实现各种灰度发布场景

文章目录 1、灰度发布实现1.1 按随机用户的流量百分比实现灰度1.2 按人群划分实现的灰度1.2.1 通过Header信息实现灰度1.2.2 通过Query信息实现灰度1.2.3 通过RemoteAdd判断来源IP实现灰度 2、路由判断器2.1. After2.2. Before2.3. Between2.4. Cookie2.5. Header2.6. Host2.7.…

GEE/PIE遥感大数据处理与典型案例丨数据整合Reduce、云端数据可视化、数据导入导出及资产管理、机器学习算法等

目录 ​专题一:初识GEE和PIE遥感云平台 专题二:GEE和PIE影像大数据处理基础 专题三:数据整合Reduce 专题四:云端数据可视化 专题五:数据导入导出及资产管理 专题六:机器学习算法 专题七:…

2023-8-30 Dijkstra 求最短路(一)

题目链接&#xff1a;Dijkstra求最短路 I #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 510;int n, m; int g[N][N]; int dist[N]; bool st[N];int dijkstra() {memset(dist, 0x3f, sizeof dist);dist[1…

Leetcode每日一题:1448. 统计二叉树中好节点的数目

原题 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,3,null,1,5] 输出&#xff1a;4 解…

C语言网络编程:实现自己的高性能网络框架

一般生产环境中最耗时的其实是业务逻辑处理。所以&#xff0c;是不是可以将处理业务逻辑的代码给拆出来丢到线程池中去执行。 比如像下面这样&#xff1a; ​我们事先创建好一堆worker线程&#xff0c;主线程accepter拿到一个连接上来的套接字&#xff0c;就从线程池中取出一个…

开始MySQL之路——MySQL的DataGrip图形化界面

下载DataGrip 下载地址&#xff1a;Download DataGrip: Cross-Platform IDE for Databases & SQL 安装DataGrip 准备好一个文件夹&#xff0c;不要中文和空格 C:\Develop\DataGrip 激活DataGrip 激活码&#xff1a; VPQ9LWBJ0Z-eyJsaWNlbnNlSWQiOiJWUFE5TFdCSjBaIiwibGl…

python+django+mysql旅游景点推荐系统-前后端分离(源码+文档)

系统主要采用Python开发技术和MySQL数据库开发技术以及基于OpenCV的图像识别。系统主要包括系统首页、个人中心、用户管理、景点信息管理、景点类型管理、景点门票管理、在线反馈、系统管理等功能&#xff0c;从而实现智能化的旅游景点推荐方式&#xff0c;提高旅游景点推荐的效…

MinIO框架安装使用+实现上传需求

MinIO框架 什么是MinIO框架如何安装&#xff08;Docker版&#xff09;安装步骤1. 查询MinIO的服务版本2. 拉取MinIO3.启动报错在docker中没有操作文件的权限 4. 访问 简单配置1.找到创建用户界面2. 设置用户信息3. 创建一个桶 使用MinIO依赖搭建MinIO的初始化API存储桶的基本操…

SaaS多租户系统架构设计

前言&#xff1a;多租户是SaaS&#xff08;Software-as-a-Service&#xff09;下的一个概念&#xff0c;意思为软件即服务&#xff0c;即通过网络提供软件服务。SaaS平台供应商将应用软件统一部署在自己的服务器上&#xff0c;客户可以根据工作的实际需求&#xff0c;通过互联网…