【Docker】Docker存储卷

文章目录

  • 一、什么是存储卷
  • 二、为什么需要存储卷
  • 三、存储卷分类
  • 四、管理卷Volume
    • 创建卷
      • 方式一:Volume 命令操作
      • 方式二:-v 或者--mount 指定
      • 方式三:Dockerfile 匿名卷
    • 操作案例
      • Docker 命令创建管理卷
      • Docker -v 创建管理卷
      • Docker mount 创建管理卷
      • Docker 卷生命周期
      • Docker 卷共享
  • 五、绑定卷bind mount
    • 创建卷
      • -v 参数创建卷
      • --mount 参数创建绑定卷
    • 操作案例
      • mount创建绑定卷
      • -v创建绑定卷
      • 绑定卷共享
  • 六、临时卷 tmpfs
    • 创建卷
      • 方式一:指定--tmpfs 创建
      • 方式二: --mount 指定参数创建
    • 操作案例
      • tmpfs 参数创建临时卷
      • mount 创建临时卷
      • tmpfs 失踪了
  • 七、综合实战-MySQL 灾难恢复
  • 八、扩展思考:存储卷在实际研发中带来了哪些问题?


一、什么是存储卷

存储卷 就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着,当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。在宿主机上的这个与容器形成绑定关系的目录被称作存储卷。卷的本质是文件或者目录,它可以绕过默认的联合文件系统,直接以文件或目录的形式存在于宿主机上。

宿主机的 /data/web 目录与容器中的 /container/data/web 目录绑定关系,然后容器中的进程向这个目录中写数据时,是直接写在宿主机的目录上的,绕过容器文件系统与宿主机的文件系统建立关联关系,使得可以在宿主机和容器内共享数据库内容,让容器直接访问宿主机中的内容,也可以宿主机向容器写入内容, 容器和宿主机的数据读写是同步的。

在这里插入图片描述

生活案例

存储卷就相当于租了个地下室,建立对应的映射就相当于有了这个地下室的钥匙,能够使用房子以外的空间。

在这里插入图片描述

如果有一天龙卷风来了,房子被吹毁了,但是地下室依然安然无恙,就相当于容器销毁了我们的这个地下室依然没有影响。

在这里插入图片描述


二、为什么需要存储卷

  1. 数据丢失问题
    容器按照业务类型,总体可以分为两类:
    • 无状态的(数据不需要被持久化)
    • 有状态的(数据需要被持久化)

显然,容器更擅长无状态应用。因为未持久化数据的容器根目录的生命周期与容器的生命周期一样,容器文件系统的本质是在镜像层上面创建的读写层,运行中的容器对任何文件的修改都存在于该读写层,当容器被删除时,容器中的读写层也会随之消失。

虽然容器希望所有的业务都尽量保持无状态,这样容器就可以开箱即用,并且可以任意调度,但实际业务总是有各种需要数据持久化的场景,比如 MySQL、 Kafka 等有状态的业务。因此为了解决有状态业务的需求, Docker 提出了 卷(Volume) 的概念。

  1. 性能问题
    UnionFS 对于修改删除等,一般效率非常低,如果对一于 I/O 要求比较高的应用,如redis 在实现持化存储时,是在底层存储时的性能要求比较高。
  2. 宿主机和容器互访不方便
    宿主机访问容器,或者容器访问要通过 docker cp 来完成,应用很难操作
  3. 容器和容器共享不方便

三、存储卷分类

目前 Docker 提供了三种方式将数据从宿主机挂载到容器中

  • volume docker 管理卷,默认映射到宿主机的 /var/lib/docker/volumes 目录下, 只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由容器引擎 daemon 自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系,这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定那些使用目录,临时存储比较适合。
  • bind mount 绑定数据卷,映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径, 在容器中也需要指定一个特定的路径, 两个已知的路径建立关联关系。
  • tmpfs mount 临时数据卷,映射到于宿主机内存中,一旦容器停止运行, tmpfs mounts 会被移除,数据就会丢失,用于高性能的临时数据存储。

在这里插入图片描述


四、管理卷Volume

创建卷

存储卷可以通过命令方式创建,也可以在创建容器的时候通过 -v and --mount 指定。

方式一:Volume 命令操作

命令清单如下:

在这里插入图片描述

docker volume create 创建存储卷

  • 语法
docker volume create [OPTIONS] [VOLUME]
  • 关键参数
    • -d, --driver: 指定驱动,默认是 local
    • --label: 指定元数据
  • 样例
  1. 创建匿名卷
# 创建匿名卷
docker volume create
# 遍历卷
docker volume ls
# 查看卷的详细信息
docker volume inspect 1a9eb041a8b3b0143b6a58e0470366dfaf6c67ef05715a6d907d00b24e059193

在这里插入图片描述

  1. 创建有名卷
docker volume create myvoltest1

在这里插入图片描述

docker volume create --label MYTEST=1 myvoltest2

在这里插入图片描述


docker volume inspect 查看卷详细信息

  • 功能
    查看卷的详细信息
  • 语法
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
  • 关键参数
    • -f :指定相应个格式,如json
  • 样例
docker volume inspect myvotest3 myvotest4

在这里插入图片描述


docker volume ls 列出卷

  • 语法
docker volume ls [OPTIONS]
  • 关键参数
    • --format: 指定相应个格式,如 json,table
    • --filter,-f: 过滤
    • -q: 仅显示名称
  • 样例
#列出所有存储卷
docker volume ls
#指定存储卷格式
docker volume ls --format json
#过滤存储卷
docker volume ls -f label=MYTEST
#仅显示存储卷名称
docker volume ls -q

在这里插入图片描述


docker volume rm 删除卷,需要容器不使用

  • 语法
docker volume rm [OPTIONS] VOLUME [VOLUME...]
  • 关键参数
    • -f,--force:强制删除
  • 样例
# 删除存储卷
docker volume rm myvotest7 myvotest8
#写文件到宿主机目录下
echo "123" > /data/var/lib/docker/volumes/myvotest7/_data/1.txt

在这里插入图片描述


docker volume prune 删除不使用的本地卷(匿名卷)

  • 语法
docker volume prune [OPTIONS]
  • 关键参数
    • --filter:过滤
    • -f, --force :不提示是否删除
  • 样例
docker volume prune

在这里插入图片描述


方式二:-v 或者–mount 指定

-v 和-mount 都可以完成管理卷的创建。

-v参数:完成目录映射

  • 语法
docker run -v name:directory[:options] .........
  • 参数
    • 第一个参数:卷名称
    • 第二个参数:卷映射到容器的目录
    • 第三个参数:选项,如 ro 表示 readonly
  • 样例
  1. 创建容器时指定参数
docker run -d --name myvolnginx1 -v volnginx1:/usr/share/nginx/html/ nginx:1.24.0

在这里插入图片描述

  1. 进入容器中做首页的删除
docker exec -it myvolnginx1 bash
cd /usr/share/nginx/html/
rm index.html

在这里插入图片描述

  1. 查看宿主机存储卷目录下的文件
ls /data/var/lib/docker/volumes/volnginx1/_data

在这里插入图片描述

如果指定ro选项,那么容器中的文件是不能删除的。

在这里插入图片描述


--mount 参数 完成目录映射

  • 语法
--mount '<key>=<value>,<key>=<value>'
  • 关键参数
    • type : 类型表示 bind, volume, or tmpfs
    • source , src :对于命名卷,这是卷的名称。对于匿名卷,省略此字段
    • destination, dst,target:文件或目录挂载在容器中的路径
    • ro,readonly: 只读方式挂载
  • 样例

💕 创建命名卷

docker run -d --name mynginxvol3 --mount 'src=nginxvol3,dst=/usr/share/nginx/html' nginx:1.24.0

在这里插入图片描述

💕 创建匿名卷

docker run -d --name mynginxvol4 --mount 'dst=/usr/share/nginx/html' nginx:1.24.0

在这里插入图片描述


方式三:Dockerfile 匿名卷

通过 Dockerfile 的 VOLUME 可以创建 docker 管理卷。这个我们后续在 Dockerfile中详细讲解。

我们也可以通过 dockerfileVOLUME 指令在镜像中创建 Data Volume,这样只要通过该镜像创建的容器都会存在挂载点,但值得注意的是通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,而是由 docker 随机生成的。


操作案例

Docker 命令创建管理卷

  1. 创建并绑定管理卷
docker volume create test1
docker run -d --name mynginx1 -p 8045:80 -v test1:/usr/share/nginx/html nginx:1.24.0

在这里插入图片描述

  1. 查看容器的具体绑定信息
docker inspect mynginx1

在这里插入图片描述

  1. 在宿主机上修改首页查看容器中的变化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


Docker -v 创建管理卷

  1. 创建并绑定管理卷
docker run -d --name mynginx2 -v test2:/usr/share/nginx/html/:ro -p 8046:80 nginx:1.24.0

在这里插入图片描述

  1. 进入容器中看能否修改首页
docker exec -it mynginx2 bash
cd /usr/share/nginx/html
echo "hello from -v" > index.html

在这里插入图片描述

  1. 进入宿主机看能否修改首页内容

在这里插入图片描述


Docker mount 创建管理卷

  1. 创建管理卷并绑定到容器首页所在的目录
docker run -d --name mynginx3 -p 8047:80 --mount src=test3,dst=/usr/share/nginx/html/ nginx:1.24.0

在这里插入图片描述

  1. 在宿主机中修改首页内容查看发生的变化

在这里插入图片描述


Docker 卷生命周期

  1. 创建管理卷并绑定到容器首页所在的目录
docker run -d --name mynginx3 -p 8047:80 --mount src=test3,dst=/usr/share/nginx/html/ nginx:1.24.0

在这里插入图片描述

  1. 删除掉容器,查看卷中的内容是否被删除掉
#删除存储卷
docker volume rm test3

在这里插入图片描述


Docker 卷共享

  1. 创建三个容器并绑定到同一个管理卷下
docker run -d --name mynginx51 -p 8052:80 -v test4:/usr/share/nginx/html/ nginx:1.24.0
docker run -d --name mynginx52 -p 8053:80 -v test4:/usr/share/nginx/html/ nginx:1.24.0
docker run -d --name mynginx53 -p 8054:80 -v test4:/usr/share/nginx/html/ nginx:1.24.0

在这里插入图片描述

  1. 进入宿主机中管理卷下查看首页内容
cd /data/var/lib/docker/volumes/test4/_data

在这里插入图片描述

  1. 在宿主机中修改管理卷下首页内容

在这里插入图片描述

同时,浏览器中也发生了改变。

在这里插入图片描述


五、绑定卷bind mount

创建卷

-v 参数创建卷

  • 功能
    完成卷映射
  • 语法
docker run -v name:directory[:options] .........
  • 参数
    • 第一个参数: 宿主机目录,这个和管理卷是不一样的
    • 第二个参数:卷映射到容器的目录
    • 第三个参数:选项,如 ro 表示 readonly
  • 样例
docker run -d --name mynginx6 -v /data/cjl/testbind:/usr/share/nginx/html/ nginx:1.24.0
docker inspect mynginx6

在这里插入图片描述

在宿主机上进行修改看容器中是否会发生改变

在这里插入图片描述


–mount 参数创建绑定卷

  • 功能
    完成目录映射
  • 语法
--mount '<key>=<value>,<key>=<value>'
  • 关键参数
    • type : 类型表示 bind, volume, or tmpfs
    • source , src : 宿主机目录,这个和管理卷是不一样的。
    • destination, dst,target:文件或目录挂载在容器中的路径
    • ro,readonly: 只读方式挂载
  • 样例
docker run -d --name mynginx7 --mount type=bind,src=/data/cjl/testmymountbind,dst=/usr/share/nginx/html/ nginx:1.24.0

在这里插入图片描述

在容器中创建文件,看是否会同步到宿主机中。

docker exec -it mynginx7 bash
echo "Hello bind by mount!" > index.html

在这里插入图片描述


操作案例

mount创建绑定卷

宿主机中目录不存在时,绑定卷会失败。

docker run -d --name mynginx8 --mount type=bind,src=/data/cjl/testbindmount1/,dst=/usr/share/nginx/html nginx:1.24.0

在这里插入图片描述

宿主机中目录存在时,绑定卷成功。

docker run -d --name mynginx8 --mount type=bind,src=/data/cjl/testbindmount2/,dst=/usr/share/nginx/html nginx:1.24.0

在这里插入图片描述


-v创建绑定卷

如果宿主机中目录不存在,-v方式可以创建

docker run -d --name mynginx9 -v /data/cjl/testbindmount3:/usr/share/nginx/html/ nginx:1.24.0

在这里插入图片描述

如果宿主机和容器中有同样名称的文件,会以宿主机中为主

echo "test -v volume" > index.html
docker run -d --name mynginx10 -v /data/cjl/testbindmount4:/usr/share/nginx/html/ nginx:1.24.0

在这里插入图片描述


绑定卷共享

启动两个nginx容器,并绑定到同一个宿主机目录下

docker run -d -p 8061:80 --name mynginx11 -v /data/cjl/testbindmount5/:/usr/share/nginx/html nginx:1.24.0

在这里插入图片描述

docker run -d -p 8062:80 --name mynginx12 -v /data/cjl/testbindmount5/:/usr/share/nginx/html nginx:1.24.0

在这里插入图片描述


六、临时卷 tmpfs

临时卷数据位于内存中,在容器和宿主机之外。

tmpfs 局限性

  • 不同于卷和绑定挂载,不能在容器之间共享 tmpfs 挂载。
  • 这个功能只有在 Linux 上运行 Docker 时才可用。

创建卷

方式一:指定–tmpfs 创建

  • 功能
    完成临时卷映射
  • 语法
--tmpfs /app
  • 样例
docker run -d --name mynginx15 --tmpfs /test1 nginx:1.24.0

在这里插入图片描述


方式二: --mount 指定参数创建

  • 功能
    完成目录映射
  • 语法
--mount '<key>=<value>,<key>=<value>'
  • 关键参数
    • type : 类型表示 bind, volume, or tmpfs
    • destination, dst,target:挂载在容器中的路径
    • tmpfs-size: tmpfs 挂载的大小(以字节为单位)。默认无限制。
    • tmpfs-mode: tmpfs 的八进制文件模式。例如, 700 或 0770。默认为 1777或全局可写。
  • 样例
docker run -d --name mynginx16 --mount type=tmpfs,dst=/test2 nginx:1.24.0

在这里插入图片描述


操作案例

tmpfs 参数创建临时卷

docker run -d --name mynginx17 -p 8078:80 --tmpfs /usr/share/nginx/html/ nginx:1.24.0

在这里插入图片描述

重启容器后,nginx首页文件将不存在

在这里插入图片描述


mount 创建临时卷

docker run -d --name mynginx18 -p 8092:80 --mount type=tmpfs,dst=/usr/share/nginx/html/,tmpfs-size=1m nginx:1.24.0

在这里插入图片描述

当我们创建临时卷时指定挂载的大小时,如果有超过该大小的文件拷贝进入容器中不被允许。

在这里插入图片描述


tmpfs 失踪了

该案例主要要求我们掌握临时卷的创建方式,了解临时卷的特殊存储方式

运行一个容器,并在容器中创建一个文件,回到宿主机查找该文件,可以找到并且和容器中的一模一样。

docker run -d --name mynginx19 nginx:1.24.0

在这里插入图片描述

创建容器并绑定临时卷,在容器中对应的目录下创建标记文件,发现在宿主机中找不到该文件

docker run -d --name mynginx20 --mount type=tmpfs,dst=/test/ nginx:1.24.0

在这里插入图片描述


七、综合实战-MySQL 灾难恢复

💕 实战目的

掌握挂载卷的使用,将 mysql 的业务数据存储到外部

💕 实战步骤

使用 MySQL 5.7 的镜像创建容器并创建一个普通数据卷 mysql-data 用来保存容器中产生的数据。需要在容器中连接 MySQL 服务, 并创建数据库 test, 并在在该数据库中创建一个简单的表并插入一些数据进来。

  1. 启动mysql容器并绑定到宿主机的指定目录
docker run --name mysql2 -v /data/cjl/mysql2test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
#在容器中登录mysql
mysql -h localhost -uroot -p

在这里插入图片描述
在这里插入图片描述

  1. 不小心删除掉mysql容器

在这里插入图片描述

  1. 启动一个新的容器,绑定到宿主机原来的目录
docker run --name mysql2new -v /data/cjl/mysql2test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

在这里插入图片描述

  1. 进入新的容器,检查数据究竟是否还在

在这里插入图片描述

因此,存储卷只要我们不是人工删除,它在容器删除后也不会自动销毁。


八、扩展思考:存储卷在实际研发中带来了哪些问题?

  1. 跨主机使用
    docker 存储卷是使用其所在的宿主机上的本地文件系统目录,也就是宿主机有一块磁盘,这块磁盘并没有共享给其他的 docker 主机,容器在这宿主机上停止或删除,是可以重新再创建的,但是不能调度到其他的主机上,这也是 docker 本身没有解决的问题,所以 docker 存储卷默认就是 docker 所在主机的本地,但是自己搭建一个共享的 NFS 来存储 docker 存储的数据,也可以实现, 但是这个过程强依赖于运维人员的能力。
    所以未来应用的存储和数据往往分离,越来越多的分布式存储方案出现,如 s3 系列,nfs 等。
  2. ** 启动参数未知**
    容器有一个问题,一般与进程的启动不太一样,就是容器启动时选项比较多,如果下次再启动时,很容器会忘记它启动时的选项,所以最好有一个文件来保存容器的启动,这就是容器编排工具的作用。
    一般情况下,是使用命令来启动操作 docker,但是可以通过文件来读,也就读文件来启动,读所需要的存储卷等,但是它也只是操作一个容器,如果要几十上百个容器操作,就需要专业的容器编排工具
    这种一般像开源的 k8s,各个云厂商也有自己的企业版编排软件。
  3. 复杂场景仍然需要运维
    对于有状态要持久的集群化组件,如 mysql 的主从。部署维护一个 Mysql 主从需要运维知识、经验整合进去才能实现所谓的部署,扩展或缩容,出现问题后修复,必须要了解集群的规模有多大,有多少个主节点,有多少个从节点,主节点上有多少个库,这些都要一清二楚,才能修复故障,这些就强依赖于运维经验
    这种复杂的场景往往还是需要人力,很难有完美的工具出现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js-Vue Router 中的方法,父A-子B-子C依次返回,无法返回到A,BC中形成循环跳转解决

1.常用的方法 在 Vue Router 中&#xff0c;有一些常用的方法用于实现路由导航和管理。以下是一些常见的 Vue Router 方法及其作用&#xff1a; push: router.push(location, onComplete, onAbort) 作用&#xff1a;向路由历史记录中添加一个新条目&#xff0c;并导航到指定的路…

电脑文件误删除如何恢复?2024最新三种恢复方法

我们在使用电脑的过程中&#xff0c;随着时间的不断推移&#xff0c;渐渐的我们会发现C盘内存空间不足了。这是因为我们很多文件都默认存储在C盘&#xff0c;所以导致C盘空间不足&#xff0c;电脑运行越来越慢。那么电脑哪些文件可以删除&#xff0c;电脑删除的东西怎么恢复&am…

Istio复习总结:xDS协议、Istio Pilot源码、Istio落地问题总结

1、xDS协议 1&#xff09;、xDS是什么 xDS是一类发现服务的总称&#xff0c;包含LDS、RDS、CDS、EDS以及SDS。Envoy通过xDS API可以动态获取Listener&#xff08;监听器&#xff09;、Route&#xff08;路由&#xff09;、Cluster&#xff08;集群&#xff09;、Endpoint&…

openai公司的chatgpt-3.5参数库内还未增加sora的语料信息

openai公司的chatgpt-3.5参数库内还未增加sora的语料信息&#xff01;我想通过openai公司的chatgpt3.5来了解一下关于sora的技术信息&#xff0c;结果呢&#xff0c;它竟然回答不知道sora是什么。看来&#xff0c;sora的语料库信息还未来得及加入chatgpt3.5的训练模型中。 如图…

Linux——网络通信TCP通信常用的接口和tcp服务demo

文章目录 TCP通信所需要的套接字socket()bind()listen()acceptconnect() 封装TCP socket TCP通信所需要的套接字 socket() socket()函数主要作用是返回一个描述符&#xff0c;他的作用就是打开一个网络通讯端口&#xff0c;返回的这个描述符其实就可以理解为一个文件描述符&a…

外包干了3个多月,技术退步明显。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

ElasticSearch高级功能

目录 ES数据预处理 Ingest Node Ingest Node VS Logstash Ingest Pipeline Painless Script ES文档建模 Elasticsearch中处理关联关系 对象类型 嵌套对象(Nested Object) 父子关联关系(Parent / Child ) ES数据预处理 Ingest Node Elasticsearch 5.0后&#xff0c;…

从可靠性的角度理解 tcp

可靠性是 tcp 最大的特点。常见的用户层协议&#xff0c;比如 http, ftp, ssh, telnet 均是使用的 tcp 协议。可靠性&#xff0c;即从用户的角度来看是可靠的&#xff0c;只要用户调用系统调用返回成功之后&#xff0c;tcp 协议栈保证将报文发送到对端。引起不可靠的表现主要有…

频段划分学习射频知识的意义

一、射频电路设计与低频电路设计的不同点 随着频率提高&#xff0c;相应电磁波的波长与变得可与分立电路元件的尺寸相比拟时&#xff0c;电阻、电容和电感这些元件的电响应&#xff0c;将偏离他们的理想频率特性。以 WIFI 2.4G 频段为例&#xff0c;当频率为 2437MHz&#xff0…

【QT】QFile读取.txt文本文件时,中文乱码问题(已解决)

目录 0.背景 1.修改方法 0.背景 项目读取一个【.txt】文本文件&#xff0c;显示到下拉框中&#xff0c;其中含有中文&#xff0c;在读取中文相关字段时会出现乱码&#xff0c;代码和显示如下 .txt文本内容如下&#xff08;显示到下拉框时&#xff0c;我做了分割处理&#xff…

代码随想录 Leetcode509. 斐波那契数

题目&#xff1a; 代码&#xff08;首刷自解 2024年2月19日&#xff09;&#xff1a; class Solution { public:int fib(int n) {if (n < 2) return n;/*三个数表示加法算式里的 加数 加数 和*//*初始化*/int leftVal 0;int rightVal 1;int sum 0;for (int i 2; i <…

智慧城市的新宠儿:会“思考”的井盖

在城市化飞速发展的今天&#xff0c;我们或许未曾过多地关注那些平凡却至关重要的井盖。它们无声地矗立在城市的每个角落&#xff0c;守护着深藏于地下的城市生命线&#xff0c;然而&#xff0c;这些井盖并未满足于传统的角色&#xff0c;它们正逐步融入智慧城市的宏大画卷中&a…

【Go语言】Go语言的数据类型

GO 语言的数据类型 Go 语言内置对以下这些基本数据类型的支持&#xff1a; 布尔类型&#xff1a;bool 整型&#xff1a;int8、byte、int16、int、uint、uintptr 等 浮点类型&#xff1a;float32、float64 复数类型&#xff1a;complex64、complex128 字符串&#xff1a;st…

Git基本操作(1)

Git基本操作&#xff08;1&#xff09; 初始化git本地仓库git本地仓库配置git config user.name 和git config user.emailgit config --unset user.name和git config --unset user.emailgit config --global 认识工作区&#xff0c;暂存区&#xff0c;版本库更深层次理解 git a…

Leetcoder Day15| 二叉树 part04

语言&#xff1a;Java/C 110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 输入&#xff1a;root [3,9,20,null,null,15,…

使用LangChain结合通义千问API基于自建知识库的多轮对话和流式输出

使用LangChain结合通义千问API基于自建知识库的多轮对话和流式输出 本文章的第三弹&#xff0c;由于LangChain本文不支持直接使用通义千问API进行多轮对话和流式输出&#xff0c;但是自建知识库呢&#xff0c;还需要LangChain,因此我尝试了一下&#xff0c;自建知识库用LangCh…

OpenAI最新Sora视频学习与生成的技术分析与最新体验渠道

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

Unity之闪电侠大战蓝毒兽(简陋的战斗系统)

目录 &#x1f3a8;一、创建地形 &#x1f3ae;二、创建角色 &#x1f3c3;2.1 动画 &#x1f3c3;2.2 拖尾 &#x1f3c3;2.3 角色控制 ​&#x1f3c3;2.4 技能释放 &#x1f3c3;2.5 准星 &#x1f4f1;三、创建敌人 &#x1f432;3.1 选择模型 &#x1f432;3.…

UI美化stylesheet

一、网上找到自己喜欢的图标 大家可以每个图标类型找出三种不同的颜色&#xff0c;方便后续美化效果&#xff0c;这里我每种只找了一个。&#xff08;随便找的&#xff0c;最后效果不好看&#xff09; 将这个文件夹复制到项目的文件夹中。 然后右键Add New…选择QT&#xff0c…

小迪安全27WEB 攻防-通用漏洞SQL 注入Tamper 脚本Base64Jsonmd5 等

#知识点&#xff1a; 1、数据表现格式类型注入 2、字符转义绕过-宽字节注入 3、数字&字符&搜索&编码&加密等 #参考资料&#xff1a; https://www.cnblogs.com/bmjoker/p/9326258.html 扫描&#xff0c;利用工具等都不会自动判断数据类型&#xff0c…