当前位置: 首页 > news >正文

docker的数据卷、docker数据持久化

目录

    • 前言
    • docker数据持久化的2种方式
    • 数据卷 bind mount ,即-v参数
    • 匿名数据卷 docker manager volume
    • -v参数和匿名卷的区别
    • docker volume 命令的使用
    • 数据卷容器
    • 孤儿volume
    • 总结

前言

环境:centos7.9 docker version 20.10.14
本篇我们来介绍docker的数据卷,数据卷是用于实现docker数据的持久化。

docker数据持久化的2种方式

使用docker过程中,我们需要持久化容器中产生的数据,以及容器与容器之间、容器与主机之前进行数据共享、备份等操作,这里就需要到容器的数据持久化管理。 docker的数据持久化管理目前提供如下两种方式:

1、数据卷 data volumes
2、数据卷容器 data volumes containers

数据卷 bind mount ,即-v参数

数据卷:数据卷其实就是一个目录或文件,类似linux下对目录或文件进行mount挂载操作,即在宿主机和容器之间建立一个或多个目录(文件亦可)来相互映射文件,其具有如下特点:
(1) 数据卷可以在容器之间进行共享和重用,即多个容器可以挂载同一个目录
(2)对数据卷的更改会立即生效,即对宿主机目录下的文件的修改会立即反应到容器的挂载点目录文件
(3)对数据卷的更新不会影响到镜像 (镜像只读)
(4)卷会一直存在,即使容器被删除,即宿主机目录不会因为容器的删除而删除宿主机目录

注意:
(1)删除容器的时候,数据卷不会删除。如果要删除容器的时候同时删除数据卷,需加上-v参数。比如: docker rm os456 -v /homedata
(2)默认数据卷挂载以后文件的权限为rw,如需单独设置,可以容器数据卷后边设置:ro只读

docker run -v参数语法:

-v <host_path>:<container_path>[:rw/ro]
<host_path>是宿主机的目录或单个文件
<container_path>是容器的目录或单个文件
rw/ro 表示挂载后容器的数据读写权限,rw表示读写,ro表示数据只读,不写默认就是rw读写权限

演示示例:

#使用数据卷挂载宿主机目录到容器中去
mkdir /root/nginx/html -p
docker run -d --name nginx -p 8081:80 -v /root/nginx/html:/usr/share/nginx/html nginx:latest#使用数据卷挂载但个文件到容器中去
docker run -d --name nginx -p 8081:80 -v /root/nginx/html/index.html:/usr/share/nginx/html/index.html nginx:latest
#综合案例
mkdir -p /root/nginx/html && echo "good" >> /root/nginx/html/index.html
mkdir -p /root/nginx/logs -p 
docker run -d --name nginx2 -p 8081:80 -v /root/nginx/html/index.html:/usr/share/nginx/html/index.html nginx:latestdocker inspect nginx"Mounts": [{"Type": "bind",		#可以看到类型是bind,所以没有产生volume"Source": "/root/nginx/html","Destination": "/usr/share/nginx/html","Mode": "","RW": true,"Propagation": "rprivate"}],

匿名数据卷 docker manager volume

使用-v参数时可以不指定<host_path>部分,只需指定容器的挂载点即可,如:-v <container_path> ,container_path必须是一个容器目录,不能是单个文件了,数据权限不能设置,均为读写权限。这时docker会自动创建一个匿名的数据卷,这个匿名数据卷的名字是自动生成的一个很长串的字符。使用docker volume ls命令可以看到这个数据卷的名称,我们称这种卷为匿名数据卷。

演示示例:

使用-v挂载匿名卷,docker会默认给我们在宿主机上找一个目录进行挂载
docker run -d --name nginx2 -p 8081:80 -v /usr/share/nginx/html -v /var/log/nginx  nginx:latest#查看容器的详细信息就可以发现docker将我们的卷挂载到哪里了
[root@docker ~]# docker inspect  nginx2
"Mounts": [{"Type": "volume",	#类型是volume"Name": "8d1d766c65d3b3cddafd20f25d","Source": "/var/lib/docker/volumes/8d1d766c65d3b3cddafd20f25d/_data", #上面一行,可见,docker将卷挂到了这里,这个很长串的ID其实就是数据卷的名称"Destination": "/usr/share/nginx/html","Driver": "local","Mode": "","RW": true,"Propagation": ""},{"Type": "volume", #类型是volume"Name": "ef17aa81669f4ef7704182061164bce","Source": "/var/lib/docker/volumes/ef17aa81669f4ef7704182061164bce/_data","Destination": "/var/log/nginx","Driver": "local","Mode": "","RW": true,"Propagation": ""}],
[root@docker ~]# ls -l /var/lib/docker/volumes/8d1d766c65d3b3cddafd20f25d/_data/
total 8
-rw-r--r--. 1 root root 497 Dec 28  2021 50x.html
-rw-r--r--. 1 root root 615 Dec 28  2021 index.html
# 所以我们修改/var/lib/docker/volumes/8d1d766c65d3b3cddafd20f25d/_data/下的index.html文件就能实现容器的nginx页面的变更

-v参数和匿名卷的区别

不同点bind mountdocker manager volume
volume位置可挂载宿主机任意位置的目录或文件仅挂载宿主机固定位置的目录,目录一般为/var/lib/docker/volumes/xxx/_data/
对容器挂载点影响挂载后容器内的挂载点目录会被覆盖,如果此时宿主机目录上没有文件,那么容器的挂载点也没有文件使用匿名数据卷时,如果volume是空的而container中的目录有内容,那么docker会将container目录中的内容拷贝到volume中,但是如果volume中已经有内容,则会将container中的目录覆盖
是否支持单文件支持挂载目录或单文件仅支持挂载目录
权限控制权限默认rw,可设置为ro只能默认rw
移植性移植性弱,与宿主机路径绑定移植性强,无需指定宿主机目录

匿名数据卷 docker manager volume
使用-v参数时不指定<host_path>部分,只需指定容器的挂载点即可,如:-v <container_path> ,这是docker默认会创建目录,如/var/lib/docker/volumes/8d1d766c65d3b3cddafd20f25dcaf304a96b9c89d005d30226a7b815a6b5ecbf/_data/目录,这个目录就是容器持久化数据的目录,这一串很长的ID就是卷名,docker自动帮我们生成的,通过docker volume ls命令可以查看卷。

注意:
使用数据卷 bind mount ,即-v参数,挂载后容器内的挂载点目录会被覆盖,如果此时宿主机目录上没有文件,那么容器的挂载点也没有文件;
使用匿名数据卷时,如果volume是空的而container中的目录有内容,那么docker会将container目录中的内容拷贝到volume中,但是如果volume中已经有内容,则会将container中的目录覆盖。

docker volume 命令的使用

[root@docker ~]#  docker volume --help
Usage:  docker volume COMMAND
Manage volumes
Commands:create      Create a volumeinspect     Display detailed information on one or more volumesls          List volumesprune       Remove all unused local volumesrm          Remove one or more volumes#列出全部的volume
docker volume ls
#查看指定名字的volume的详细信息
docker volume inspect a0dc63aae530f4070bb34e1c5331319c93a97f3727e6cf60415b7847010dcaf8
#移除全部未使用的本地volume
docker volume  prune
#删除指定的volume
docker volume  rm a0dc63aae530f4070bb34e1c5331319c93a97f3727e6cf60415b7847010dcaf8示例:
#创建一个数据卷,名称叫做nginx
[root@docker ~]# docker volume create nginx
nginx
[root@docker ~]# docker volume ls | grep nginx
local     nginx
[root@docker ~]# docker volume inspect  nginx
[{"CreatedAt": "2023-08-27T14:40:43+08:00","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/nginx/_data","Name": "nginx","Options": {},"Scope": "local"}
]#容器使用数据卷,-v参数时加上卷名即可
[root@docker ~]# docker run -d --name nginx -p 8081:80 -v nginx:/usr/share/nginx/html  nginx:latest
57022b423ec03bdb1a7a178544d422b262daa1b2861ba8a509a20962ed3051cf
[root@docker ~]# docker inspect nginx "Mounts": [{"Type": "volume","Name": "nginx","Source": "/var/lib/docker/volumes/nginx/_data","Destination": "/usr/share/nginx/html","Driver": "local","Mode": "z","RW": true,"Propagation": ""}
#可以看到,nginx已经使用了nginx数据卷
#注意
#使用数据卷 bind mount ,-v参数,不会产生volume,如下:
docker run -d --name nginx -p 8081:80 -v /root/nginx/html:/usr/share/nginx/html  nginx:latest
docker inspect nginx"Mounts": [{"Type": "bind",		#可以看到类型是bind,所以没有产生volume"Source": "/root/nginx/html","Destination": "/usr/share/nginx/html","Mode": "","RW": true,"Propagation": "rprivate"}],

数据卷容器

所谓数据卷容器,其实就是一个为其他容器提供volume的容器,即包含数据的容器,然后其他多个容器可以通过--volumes-from 数据卷容器名参数来挂载数据卷容器,从而实现多个容器共享同一份数据。

1、不使用数据卷容器之前,多个容器共享相同的数据,只需使用-v参数挂载同一个宿主机目录即可,如下实现:

docker run -d --name nginx1 -p 8081:80 -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
docker run -d --name nginx2 -p 8082:80 -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
docker run -d --name nginx3 -p 8083:80 -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
echo "good" >>/root/nginx/html/index.html
curl  127.0.0.1:8081
good
curl  127.0.0.1:8082
good
curl  127.0.0.1:8083
good#以上使用的是bind mount的形式挂载,当然也可以手动创建一个volume,如下:
docker volume create nginx
docker volume inspect  nginx
[{"CreatedAt": "2023-08-27T14:40:43+08:00","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/nginx/_data","Name": "nginx","Options": {},"Scope": "local"}
]echo "good" >>/var/lib/docker/volumes/nginx/_data/index.html
docker run -d --name nginx11 -p 8001:80 -v nginx:/usr/share/nginx/html nginx:latest
docker run -d --name nginx12 -p 8002:80 -v nginx:/usr/share/nginx/html nginx:latest
docker run -d --name nginx13 -p 8003:80 -v nginx:/usr/share/nginx/html nginx:latest
curl  127.0.0.1:8001
I am good
curl  127.0.0.1:8002
I am good
curl  127.0.0.1:8003
I am good#以上就说明多个容器共享了相同的数据
#注意:不能使用匿名卷,匿名卷会自动创建volume,那么多个容器都各自创建自己的匿名卷这样做不到数据共享了

2、使用数据卷容器之后,多个容器共享相同的数据,如下实现:

#创建一个数据卷容器,名称叫做nginx-data,数据卷容器可以不用run,其只是提供数据而已
echo "I am good man" >/root/nginx/html/index.html
docker create   --name nginx-data   -v /root/nginx/html/:/usr/share/nginx/html  nginx:latest
#使用volume亦可,docker create   --name nginx-data   -v nginx:/usr/share/nginx/html  nginx:latest
#其他nginx容器共享数据卷容器数据
#nginx容器的挂载和数据卷容器的挂载是一样的
docker run -d --name nginx1 -p 8001:80 --volumes-from nginx-data nginx:latest
docker run -d --name nginx2 -p 8002:80 --volumes-from nginx-data nginx:latest
docker run -d --name nginx3 -p 8003:80 --volumes-from nginx-data nginx:latest
curl  127.0.0.1:8001
I am good man
curl  127.0.0.1:8002
I am good mancurl  127.0.0.1:8003
I am good man#删除数据卷容器
docker rm  nginx-data 
# nginx3 容器依然可以访问
curl  127.0.0.1:8003
I am good man
#查看nginx3 的挂载目录"Mounts": [{"Type": "bind",			#bind类型,因为nginx-data数据卷容器就是使用bind类型"Source": "/root/nginx/html",		#宿主机目录"Destination": "/usr/share/nginx/html","Mode": "","RW": true,"Propagation": "rprivate"}],
#我们可以看到,即使数据卷容器被删除了,使用数据卷容器的其他nginx容器依然能正常持久化数据
#这说明,其他nginx容器其实本质上还是挂载宿主机上的目录,这其实和多个容器使用相同的-v /root/nginx/html/:/usr/share/nginx/html 没说
#明区别
#以上只演示了使用bind mount 类型的卷,其实手动创建一个数据卷docker volume create nginx-data,然后,多个容器都使用该nginx-data数据
# 卷亦可以共享数据,或者数据卷容器挂载的是nginx-data数据卷,然后多个容器都使用该nginx-data数据卷也是可以的.

孤儿volume

所谓孤儿volume是指没有被任何容器使用的volume。
删除volume:
1、对于直接使用-v /root/nginx/html/:/usr/share/nginx/html指定宿主机目录挂载的,当删除容器时,宿主机上的目录并不会被删除,这也是数据持久化的含义,所以如果需要永久删除宿主机目录,可以在确认数据不再需要后删除宿主机目录即可。
2、对于使用docker manager volume管理的,如果是匿名卷,在删除容器的时候加上-v可以直接删除容器和匿名卷,docker rm命令如下:

[root@docker ~]# docker rm --help
Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]
Remove one or more containers
Options:-f, --force     Force the removal of a running container (uses SIGKILL)-l, --link      Remove the specified link-v, --volumes   Remove anonymous volumes associated with the container	#-v参数删除分配给容器的匿名卷
#删除容器的同时删除容器的匿名卷
docker rm  nginx1 -v -f

3、对于不管是匿名卷还是有名卷,都可以使用docker volume rm 命令删除卷。
4、孤儿volume是指没有被任何容器使用的volume。在确定volume不再使用后,可以使用docker volume rm 命令删除卷。

总结

docker容器实现数据持久化一般有以下几种方式:

1、-v参数,以bind mount方式挂载宿主机目录或文件到容器
docker run -v参数语法:
-v <host_path>:<container_path>[:rw/ro]
<host_path>是宿主机的目录或单个文件
<container_path>是容器的目录或单个文件
rw/ro 表示挂载后容器的数据读写权限,rw表示读写,ro表示数据只读,不写默认就是rw读写权限示例:
mkdir /root/nginx/html -p
docker run -d --name nginx1 -p 8081:80 -v /root/nginx/html:/usr/share/nginx/html nginx:latest
docker run -d --name nginx2 -p 8082:80 -v /root/nginx/html/index.html:/usr/share/nginx/html/index.html nginx:latest
docker inspect nginx1 "Mounts": [{"Type": "bind",		#类型是bind"Source": "/root/nginx/html","Destination": "/usr/share/nginx/html","Mode": "","RW": true,"Propagation": "rprivate"}],
2、-v 不指定<host_path>部分时,docker默认使用匿名卷,docker manager volume
使用-v参数时可以不指定<host_path>部分,只需指定容器的挂载点即可,如:-v  <container_path>,container_path必须是一个容器目录,不
能是单个文件了,数据权限不能设置,均为读写权限。因为没写<host_path>部分,这时docker会自动创建一个数据卷,这个数据卷的名字是自动生成
的一个很长串的字符,所以叫匿名卷。
docker run -d --name nginx -p 8082:80 -v /usr/share/nginx/html  nginx:latest 
docker inspect nginx
"Mounts": [{"Type": "volume",		#类型是volume"Name": "58b3689c8256a8d33d9114c52b","Source": "/var/lib/docker/volumes/58b3689c8256a8d33d9114c52b/_data","Destination": "/usr/share/nginx/html","Driver": "local","Mode": "","RW": true,"Propagation": ""}],
[root@docker ~]# docker volume list | grep   58b3689c8256a8d33d9114c52b
local     58b3689c8256a8d33d9114c52b
[root@docker ~]# 
3、使用创建好的数据卷
#docker volume命令用于管理数据卷
#创建一个数据卷,名称叫做nginx
[root@docker ~]# docker volume create nginx
nginx
[root@docker ~]# docker volume ls | grep nginx
local     nginx
[root@docker ~]# docker volume inspect  nginx
[{"CreatedAt": "2023-08-27T14:40:43+08:00","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/nginx/_data","Name": "nginx","Options": {},"Scope": "local"}
]
#创建一个容器并使用名称叫做nginx的volume卷,使用-v参数时指定volume卷名即可
[root@docker ~]# docker run -d --name nginx -p 8081:80 -v nginx:/usr/share/nginx/html  nginx:latest
57022b423ec03bdb1a7a178544d422b262daa1b2861ba8a509a20962ed3051cf
[root@docker ~]# docker inspect nginx "Mounts": [{"Type": "volume",		#类型是volume"Name": "nginx",		#卷的名称"Source": "/var/lib/docker/volumes/nginx/_data","Destination": "/usr/share/nginx/html","Driver": "local","Mode": "z","RW": true,"Propagation": ""}
#列出全部的volume
docker volume ls
#查看指定名字的volume的详细信息
docker volume inspect a0dc63aae530f4070bb34e1c5331319c93a97f3727e6cf60415b7847010dcaf8
#移除全部未使用的本地volume
docker volume  prune
#删除指定的volume
docker volume  rm a0dc63aae530f4070bb34e1c5331319c93a97f3727e6cf60415b7847010dcaf8

4、数据卷容器

1、不使用数据卷容器之前,多个容器共享相同的数据,只需使用-v参数挂载同一个宿主机目录即可,如下实现:
docker run -d --name nginx1 -p 8081:80 -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
docker run -d --name nginx2 -p 8082:80 -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
docker run -d --name nginx3 -p 8083:80 -v /root/nginx/html/:/usr/share/nginx/html nginx:latest
echo "good" >>/root/nginx/html/index.html
#以上使用的是bind mount的形式挂载,当然也可以手动创建一个volume,如下:
docker volume create nginx
docker volume inspect  nginx
[    {......."Mountpoint": "/var/lib/docker/volumes/nginx/_data","Name": "nginx",......}
]
echo "good" >>/var/lib/docker/volumes/nginx/_data/index.html
docker run -d --name nginx11 -p 8001:80 -v nginx:/usr/share/nginx/html nginx:latest
docker run -d --name nginx12 -p 8002:80 -v nginx:/usr/share/nginx/html nginx:latest
docker run -d --name nginx13 -p 8003:80 -v nginx:/usr/share/nginx/html nginx:latest#以上就说明多个容器共享了相同的数据
#注意:不能使用匿名卷,匿名卷会自动创建volume,那么多个容器都各自创建自己的匿名卷这样做不到数据共享了2、使用数据卷容器之后,多个容器共享相同的数据,如下实现:
#创建一个数据卷容器,名称叫做nginx-data,数据卷容器可以不用run,其只是提供数据而已
echo "I am good man" >/root/nginx/html/index.html
docker create   --name nginx-data   -v /root/nginx/html/:/usr/share/nginx/html  nginx:latest
#使用volume亦可,docker create   --name nginx-data   -v nginx:/usr/share/nginx/html  nginx:latest
#其他nginx容器共享数据卷容器数据,使用--volumes-from指定数据卷容器
#nginx容器的挂载和数据卷容器的挂载是一样的
docker run -d --name nginx1 -p 8001:80 --volumes-from nginx-data nginx:latest
docker run -d --name nginx2 -p 8002:80 --volumes-from nginx-data nginx:latest
docker run -d --name nginx3 -p 8003:80 --volumes-from nginx-data nginx:latest

5、孤儿卷

所谓孤儿volume是指没有被任何容器使用的volume。
删除volume:
1、对于直接使用`-v /root/nginx/html/:/usr/share/nginx/html`指定宿主机目录挂载的,当删除容器时,宿主机上的目录并不会被删除,这也是
数据持久化的含义,所以如果需要永久删除宿主机目录,可以在确认数据不再需要后删除宿主机目录即可。
2、对于使用docker manager volume管理的,如果是匿名卷,在删除容器的时候加上-v可以直接删除容器和匿名卷,docker rm命令如下:
[root@docker ~]# docker rm --help
Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]
Remove one or more containers
Options:-f, --force     Force the removal of a running container (uses SIGKILL)-l, --link      Remove the specified link-v, --volumes   Remove anonymous volumes associated with the container	#-v参数删除分配给容器的匿名卷
#删除容器的同时删除容器的匿名卷
docker rm  nginx1 -v -f
3、对于不管是匿名卷还是有名卷,都可以使用`docker volume rm` 命令删除卷。
4、docker volume prune   #移除全部未使用的本地volume 

相关文章:

docker的数据卷、docker数据持久化

目录 前言docker数据持久化的2种方式数据卷 bind mount &#xff0c;即-v参数匿名数据卷 docker manager volume-v参数和匿名卷的区别docker volume 命令的使用数据卷容器孤儿volume总结 前言 环境&#xff1a;centos7.9 docker version 20.10.14 本篇我们来介绍docker的数据卷…...

阅读源码工具Sourcetrail

收费工具Source Insight、Understand Sourcetrail开源工具 一、下载安装 接下来就是download&#xff0c;在GitHub的release页面选择自己系统对应的发布版本下载安装&#xff1a; 安装好后&#xff0c;运行程序&#xff0c;会出现这样的界面&#xff1a; 二、应用 选择“New…...

KMP 算法详解

KMP算法详解 1 KMP算法解决的问题 2 前缀问题 3 KMP 算法 1 KMP算法解决的问题 字符串str1和str2&#xff0c;str1是否包含str2&#xff0c;如果包含返回str2在str1中开始的位置。并做到时间复杂度为 O ( n ) O(n) O(n) 2 前缀问题 求一个字符串中每个字符前缀和后缀相…...

[matconvnet]matconvnet-1.0-beta-25在cuda11.1以上编译问题总结

首先可以肯定是matconvnet-1.0-beta-25不支持cuda11.1及其以上版本&#xff0c;因为cudnn版本问题导致源码api接口不一样&#xff0c;会下面类似报错 E:\Matlab\R2020a\matconvnet-1.0-beta25\matlab\src\bits\datacu.hpp(89): error: identifier "cudnnConvolutionFwdPr…...

自动化驱动程序管理

在部署操作系统时&#xff0c;每次都从下载和分发所需的驱动程序中实现真正的独立性可能是一场艰苦的战斗。特别是具有硬件多样化的环境&#xff0c;并且需要支持新的硬件类型时。借助 OS Deployer&#xff0c;可以对所有端点使用一个映像&#xff0c;无论品牌和型号如何&#…...

智能合约编写高级篇(二)区块哈希介绍

本文档从区块哈希基本概念出发&#xff0c;详细介绍了中移链的区块哈希交易接口和应用方向。适用于EOS区块链智能合约高级开发人员&#xff0c;熟悉如何获取当前发生交易所在的区块号和区块哈希前缀&#xff0c;并通过Tapos机制验证交易的有效性。 01 概述 &#xff08;一&…...

二进制链表转整数

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1&#xff1a; 输入&#xff1a;head [1,0,1] 输出&#xff1a;5 解释&#xff1a;二进制数 (101) 转化为十进…...

Python爬虫进阶:使用Scrapy库进行数据提取和处理

在我们的初级教程中&#xff0c;我们介绍了如何使用Scrapy创建和运行一个简单的爬虫。在这篇文章中&#xff0c;我们将深入了解Scrapy的强大功能&#xff0c;学习如何使用Scrapy提取和处理数据。 一、数据提取&#xff1a;Selectors和Item 在Scrapy中&#xff0c;提取数据主要…...

五)Stable Diffussion使用教程:文生图之高清修复

上一篇我们说到图生图,这一篇来说说高清修复。 上一篇我们通过一个例子实现了图生图的功能,使用一张图片生成了另一种风格的图片。 然而,我们生成的图片质量不尽如人意。 虽然我们之前也提到设置分辨率、精炼提示词去提升画面质量等等,但是实际用下来发现,分辨率拉得太…...

SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,SQL Server&#xff0c;Redis &#xff0c;Oracle ,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加微信号 l…...

SpringBoot原理-自动配置-原理分析-源码跟踪

自动配置原理 SpringBootApplication 该注解标识在SpringBoot项目的启动类上&#xff0c;是SpringBoot中最为重要的注解&#xff0c;该注解由三个部分组成。 SpringBootConfiguration&#xff1a;该注解与Configuration注解作用一样&#xff0c;用来声明当前类为一个配置类Comp…...

安全基础 --- 原型链污染

原型链 大部分面向对象的编程语言&#xff0c;都是通过“类”&#xff08;class&#xff09;实现对象的继承。传统上&#xff0c;JavaScript 语言的继承不通过 class&#xff0c;而是通过“原型对象”&#xff08;prototype&#xff09;实现 1、prototype 属性的作用 JavaScri…...

c++中的常用知识点总结

命名空间 使用命名空间之后&#xff0c;调用代码时可以省去也可以不省去相关的前缀。 #include <iostream>using namespace std;//使用c自己的命名空间 int main() {int num1 10;std::cout << "Hello, World!" << std::endl;cout<<num1&l…...

Leetcode:349. 两个数组的交集【题解超详细】

题目 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 难度&#xff1a;简单 题目链接&#xff1a;349.两个数组的交集 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,…...

Java 【异常】

一、认识异常 Exception 在 Java 中&#xff0c;将程序执行过程中发生的不正常行为称为异常 。 异常是异常exception&#xff0c;报错是报错error 1.算数异常 0不能作为除数&#xff0c;所以算数异常 2.空指针异常 arr不指向任何对象&#xff0c;打印不出arr的长度&#xff0c;…...

B - Polycarp‘s Practice

Polycarp is practicing his problem solving skill. He has a list of nn problems with difficulties a_1, a_2, \dots, a_na1​,a2​,…,an​, respectively. His plan is to practice for exactly kk days. Each day he has to solve at least one problem from his list. …...

朴素贝叶斯数据分类------

------------------后期会编辑些关于朴素贝叶斯算法的推导及代码分析----------------- import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, BernoulliNB, MultinomialNB from sklear…...

flask中的操作数据库的插件Flask-SQLAlchemy

1、ORM 框架 Web 开发中&#xff0c;一个重要的组成部分便是数据库了。Web 程序中最常用的莫过于关系型数据库了&#xff0c;也称 SQL 数据库。另外&#xff0c;文档数据库&#xff08;如 mongodb&#xff09;、键值对数据库&#xff08;如 redis&#xff09;近几年也逐渐在 w…...

arrow的使用

pandas2.0引入了pyarrow作为可选后端,比numpy的性能提高很多,所以为了改造backtrader,用cython和c++重写整个框架,准备用arrow作为底层的数据结构(backtrader现在的底层数据结构是基于python array构建的) 安装arrow推荐使用vcpkg git clone https://github.com/Microsoft…...

【24种设计模式】装饰器模式(Decorator Pattern(Wrapper))

装饰器模式 装饰器模式是一种结构型设计模式&#xff0c;用于动态地给对象添加额外的行为或责任&#xff0c;而不需要改变原始对象的结构。通过创建一个包装器类&#xff08;装饰器&#xff09;&#xff0c;它包含原始对象的引用&#xff0c;并提供与原始对象相同的接口&#…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...