Docker之存储配置与管理

news2024/11/19 19:40:38

一、容器本地配置与Docker存储驱动

每个容器都被自动分配了本地存储,也就是内部存储。容器由一个可写容器层若干只读镜像层组成,容器的数据就存放在这些层中。

容器本地存储采用的是联合文件系统。这种文件系统将其他文件系统合并到一个联合挂载点,实现了多层数据的叠加并对外提供一个统一视图。联合文件系统是Docker的一种底层技术

容器的本地存储是通过存储驱动进行管理的。存储驱动控制镜像和容器在 Docker 主机上的存储和管理方式。不同的存储驱动采用不同方法实现镜像构建和写时复制策略。

对于所能支持overlay2的Linux发行版来说,首选overlay2作为Docker的存储驱动。ContOS从7.4版本开始,所安装的Docker都能直接支持overlay2

 # 查看Docker主机上当前使用的存储驱动
 [root@docker ~]# docker info
 Storage Driver: overlay2            # 存储驱动是overlay2
   Backing Filesystem: xfs           # 底层文件系统是xfs
   Supports d_type: true             # 支持d_type
   Native Overlay Diff: true

可根据需要更改现有的存储驱动。建议在更改存储驱动前使用docker save命令导出已创建的镜像,或者推送到注册中心,以免今后重建他们。

更改存储驱动会使得现有容器和镜像不可访问。在Linux上,可以通过修改/etc/docker/daemon.json配置文件来更改存储引擎配置,修改完后需要重启Docker才能够生效。

 # 将存储驱动设置为overlay2
 [root@docker ~]# vi /etc/docker/daemon.json
 {
     "storage-driver":"overlay2"
 }

二、容器与非持久化数据

非持久化数据是不需要保存的那些数据,容器本地存储中的数据就属于这种类型。容器创建时会创建非持久化存储,这是容器全部文件和文件系统保存的地方。在容器内创建的所有文件都存储在可写容器层,文件系统的改动都发生在容器层

2.1、存在问题

  • 非持久化数据从属于容器,生命周期与容器相同,会随着容器的删除而被删除。
  • 当该容器不再运行时,数据不会持久保存,如果另一个进程需要,则可能很难从该容器中获取数据。
  • 容器的可写层与运行容器的Docker主机紧密耦合,无法轻松地将数据转移到其他位置。
  • 写入容器的可写层需要Docker存储驱动管理文件系统。存储驱动使用Linux内核提供的联合文件系统,其性能不如直接写入主机文件系统的Docker卷。

三、容器与持久化数据

持久化数据是需要保存的数据,如客户信息、财务、计划、审计日志,以及某些应用日志数据。 Docker通过将主机中的文件系统挂载到容器中供容器访问,从而实现持久化数据存储,这就是容器的外部存储。 即使容器删除之后,这些文件仍然存在。 Docker 目前支持绑定挂载这两种挂载类型来实现容器的持久化数据存储

3.1、卷

  • 卷是在Docker中进行持久化数据存储的最佳方式
  • 如果希望自己的容器数据保留下来(持久化),则可以将数据存储在卷
  • 卷又称数据卷本质上是 Docker 主机文件系统中的目录或文件,它能够直接被挂载到容器的文件系统中。
  • 卷与容器是解耦的,因此可以独立地创建并管理卷,并且卷并未与任意容器生命周期绑定
  • 用户可以停止或删除一个关联了卷的容器,但是卷并不会被删除。
  • 可以将任意数量的卷装入容器,多个容器也可以共享一个或多个卷

3.2、绑定挂载

绑定挂载是Docker早期版本就支持的挂载类型。绑定挂载性能高,但它们需要指定主机文件系统的特定路径,从而限制了容器的可移植性。

3.3、外部存储与本地存储的关系

四、挂载类型

如果在Linux上运行Docker,也可以使用tmpfs挂载,仅支持非持久化数据,不能用于持久化数据存储。卷、绑定挂载和tmpfs挂载这三种类型的区别在于存放的位置不同:

4.1、卷

默认位置:/var/lib/docker/volumes目录。可以以命名方式匿名方式挂载卷。

卷由Docker创建并管理,适用于以下场景:

  • 多个正在运行的容器之间共享数据
  • 当Docker主机不能保证具有特定目录结构时,卷有助于将Docker主机的配置与容器运行时解绑。
  • 当需要在两个Docker主机之间备份、恢复或迁移数据时。可以在停止使用卷的容器之后,备份卷所在的目录(如/var/lib/docker/volumes/<卷名>)。

4.2、解绑挂载

解绑挂载可以存储到主机系统的任何位置。适用场景:

  • 在主机和容器之间共享配置文件。Docker向容器提供DNS解析时默认采用的就是这种方式。
  • 在Docker主机上的开发环境和容器之间共享源代码或构建工作。
  • 当Docekr主机上的目录结构保证与容器要求的绑定挂载一致时。

正在开发新的Docker化应用程序,则应考虑使用命名卷,而不要使用绑定挂载。

4.3、tmpfs挂载

仅限运行Linux操作系统的Docker主机使用,只存储在主机的内存中,不会被写到主机文件系统,因此不能保存容器的应用数据。在不需要将数据持久化到主机或容器时,tmpfs挂载最合适。

可以考虑使用tmpfs挂载避免将非持久化数据永久存储到任何位置,并且通过避免写入容器的可写层来提高容器的性能。

五、Docker卷管理语法

docker volume是Docker卷的管理命令,基本语法:

 docker volume 子命令

子命令用于完成具体的卷管理任务,docker volume命令列举如下:

  • docker volume create:创建一个新的卷。
  • docker volume ls:列出本地Docker主机上的卷。
  • docker volume inspect:查看卷的详细信息,包括卷在Docker主机文件系统中的具体位置。
  • docker volume prune:删除未被容器或服务副本使用的全部卷。
  • docker volume rm:删除未被使用的指定卷。

六、容器的文件系统挂载语法

使用docker rundocker create命令的相关选项将外部文件系统挂载到容器中。

6.1、-v的基本语法

 -v [主机中的源:]容器中的目标[:<选项>]

  • 第一个字段表示挂载源(来自主机的文件系统)
  • 第二个字段是挂载目标(容器中的挂载点,可以是目录或文件路径,必须采用绝对路径的形式)
  • 第三个字段是可选的,是一个以逗号分隔的选项列表,如ro表示只读。

6.2、--mount选项的基本语法

 --mount <键>=<值>,<键>=<值>,...

其主要的键列举如下:

  • type:指定要挂载的类型,值可以是bind(绑定挂载)、volume(卷)或tmpfs。默认使用volume。
  • source(或src):指定挂载源。对于卷,这是卷名;对于绑定挂载,则为主机上的目录或文件。
  • destination(或dst、target):指定挂载目标,即容器中的挂载点,必须采用绝对路径的形式。
  • readonly:指定只读选项,表示源以只读方式挂载到容器中。
  • 其他键:可以被多次指定,由若干键值对组成。卷和绑定挂载有不同的键。

七、示例

7.1、创建一个卷并让容器挂载

1、创建一个卷

 [root@docker ~]# docker volume create test-vol
 test-vol

2、列出当前卷

 [root@docker ~]# docker volume ls
 DRIVER    VOLUME NAME
 local     test-vol

3、查看该卷的详细信息

 [root@docker ~]# docker volume inspect test-vol 
 [
     {
         "CreatedAt": "2024-04-27T09:55:50+08:00",
         "Driver": "local",      # 卷驱动
         "Labels": null,
         "Mountpoint": "/var/lib/docker/volumes/test-vol/_data", # 卷的挂载点
         "Name": "test-vol",     # 卷名称
         "Options": null,
         "Scope": "local"        # 卷的作用域
     }
 ]
 # 发现创建卷时会在Docker根目录(/vr/lib/docker)下的volumes子目录生成一个以卷名命名的子目录,在其下创建名为_data的子目录作为卷的存储路径

4、创建并启动一个容器,并将test-vol卷挂载到容器中的/world目录。

 docker run -it -v test-vol:/world ubuntu /bin/bash

5、在容器中列出目录,发现有一个名为world目录,这个目录实际指向的就是上述的test-vol卷。

 root@c3c86b6463b9:/# ls
 bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  world
 ​
 # 退出该容器
 root@c3c86b6463b9:/# exit
 exit

6、验证卷被正确挂载到容器中

 [root@docker ~]# docker inspect c3c8
 [
 ...
     "Mounts": [             # 挂载信息
         {
             "Type": "volume",           # 挂载类型为volume(卷)
             "Name": "test-vol",         # 卷名
             "Source": "/var/lib/docker/volumes/test-vol/_data", # 挂载源
             "Destination": "/world",    # 挂载目标
             "Driver": "local",          # 卷驱动类型
             "Mode": "z",                # SELinux标签
             "RW": true,                 # 可读写
             "Propagation": ""           # 传播属性 
          }
      ],
 ...
 ]
 # 表明挂载的是一个卷,显示了正确的源和目标

7、删除该卷。

 [root@docker ~]# docker volume rm test-vol
 Error response from daemon: remove test-vol: volume is in use - [c3c86b6463b9059cd97758faca00cd690944a31e973b1ac07d7c77ae333ecaac]
 # 说明卷正在被使用。上述容器虽然停止运行,但仍处于生命周期内,会占用卷

8、删除容器,在删除卷即可成功。

 [root@docker ~]# docker rm c3c8
 c3c8
 [root@docker ~]# docker volume rm test-vol
 test-vol

创建卷时使用-d选项可以指定不同的驱动,第三方驱动可以通过插件方式接入。这些驱动提供了高级存储特性,并为Docker集成了外部存储系统

有些卷驱动可能需要使用-o或--opt等额外选项定制卷的创建

 docker volume create --driver fake  --opt tardis=blue --opt timey=wimey foo

9、挂载NFS文件系统的示例:

 docker volume crete --driver local \        #  本地驱动
 --opt type=nfs \                            # 文件类型为nfs
 --opt o=addr=192.168.1.1,rw \               # NFS服务器地址,可读写
 --opt device=:/path/to/dir \                # NFS目录路径
 foo

多个容器可以使用同一个卷(用于访问共享数据)。例如一个容器写入数据到卷,另一个容器从卷中读取数据。

卷名必须是唯一的,这意味着不同的卷驱动不能使用相同的卷名。

7.2、启动容器时自动创建卷

启动带有容器的卷时,若卷不存在,则Docker会自动创建这个卷。

 # 将myvol挂载到容器testnovol的/app目录下。
 docker run -d --name testnovol --mount source=myvol,target=/app nginx # --mount方法实现
 docker run -d --name testnovol -v myvol:/app nginx                    # -v选项实现

myvol卷并没有提取被创建,查看 该容器的详细信息:

 [root@docker ~]# docker inspect testnovol
 [
 ...
         "Mounts": [
             {
                 "Type": "volume",
                 "Name": "myvol",
                 "Source": "/var/lib/docker/volumes/myvol/_data",    # 挂载源
                 "Destination": "/app",                              # 挂载目标
                 "Driver": "local",
                 "Mode": "z",
                 "RW": true,
                 "Propagation": ""
             }
         ],
 ...
 ]

7.3、使用容器填充卷

  • 如果容器启动时挂载已经存在并拥有数据的卷,则容器不会将其挂载点目录的数据复制到该卷,而是直接使用该卷中的数据

  • 如果容器启动时挂载空白卷自动创建新卷,而容器在挂载点目录中已有文件或目录,则该挂载点目录的内容会被传播(复制)到卷中,也就是将容器中挂载点目录的数据填充到卷中

1、启动一个nginx容器,并使用容器的/usr/share/nginx/html目录(Nginx服务器存储器网页内容的默认位置)的内容填充新的卷nginx-vol。

 [root@docker ~]# docker run -d --name=nginxtest --mount source=nginx-vol,destination=/usr/share/nginx/html nginx
 d538791a4aa89bb8b6840b3287f0db270832b7ca31a7632012311b4007098dd9

2、查看该卷的详细信息,其挂载点信息如下:

 [root@docker ~]# docker volume inspect nginx-vol 
 ...
     "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
 ...

3、查看主机上该卷所在目录的内容,可以发现容器已经填充了卷

 [root@docker ~]# ls -l /var/lib/docker/volumes/nginx-vol/_data
 total 8
 -rw-r--r-- 1 root root 497 Apr 16 22:29 50x.html
 -rw-r--r-- 1 root root 615 Apr 16 22:29 index.html

4、启动另一个容器挂载该卷,以使用其中预先填充的内容:

 [root@docker ~]# docker run -it --name=othercntr --mount source=nginx-vol,destination=/nginx ubuntu /bin/bash
 root@68134426c8e0:/# ls nginx
 50x.html  index.html
 root@68134426c8e0:/# exit
 exit

5、删除容器和卷,恢复实验环境

 docker stop nginxtest othercntr
 docker rm nginxtest othercntr
 docker volume rm nginx-vol

7.4、使用只读卷

同一个卷可以由多个容器挂载,并且可以让某些容器执行读写操作,而让另一些容器仅能执行只读操作。

1、添加readonly参数。--mount选项的实现方法

 [root@docker ~]# docker run -d --name=nginxtest --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly nginx:latest
 ​
 [root@docker ~]# docker inspect nginxtest
 ...
 "Mounts": [
             {
                 "Type": "volume",
                 "Name": "nginx-vol",
                 "Source": "/var/lib/docker/volumes/nginx-vol/_data",
                 "Destination": "/usr/share/nginx/html",
                 "Driver": "local",
                 "Mode": "z",        # SELinux标签
                 "RW": false,        # 读写为false表示只读
                 "Propagation": ""
             }
           ]
 ...
 # 停止并删除nginxtest容器,然后删除nginx-vol卷,恢复环境

2、-v选项实现方法

 [root@docker ~]# docker run -d --name=nginxtest -v nginx-vol:/usr/share/nginx/html:ro nginx:latest
 [root@docker ~]# docker inspect nginxtest
 ...
 "Mounts": [
             {
                 "Type": "volume",
                 "Name": "nginx-vol",
                 "Source": "/var/lib/docker/volumes/nginx-vol/_data",
                 "Destination": "/usr/share/nginx/html",
                 "Driver": "local",
                 "Mode": "ro",       # 模式为只读
                 "RW": false,        # 读写为false表示只读
                 "Propagation": ""
             }
         ],
 ...

7.5、使用匿名卷

在创建或启动容器时可以创建匿名卷,匿名卷没有指定明确的名称。

1、使用--mount选项启动容器时不定义source,则会产生匿名卷:

 [root@docker ~]# docker run -it --mount destination=/world ubuntu /bin/bash
 root@eb339806b639:/# exit
 exit

2、查看该容器的详细挂载信息:

 [root@docker ~]# docker inspect eb33
 ...
 "Mounts": [
             {
                 "Type": "volume",
                 "Name": "3e19c9513c022a4310411d5becd7715b3c935e0685e2...",
                 "Source": "/var/lib/docker/volumes/3e19c9513c022a4...aae/_data",
                 "Destination": "/world",
                 "Driver": "local",
                 "Mode": "z",
                 "RW": true,
                 "Propagation": ""
             }
         ],
 ...

发现匿名卷不是没有名称,而是Docker自动为匿名卷自动生成了一个UUID(通用唯一识别码)作为名称。

3、删除该容器,列出当前卷,发现该匿名卷仍然存在

 [root@docker ~]# docker rm eb33
 eb33
 [root@docker ~]# docker volume ls
 DRIVER    VOLUME NAME
 local     3e19c9513c022a4310411d5becd7715b3c935e0685e2927daae6ee4bf53737f3

4、若要删除匿名卷,必须指定匿名卷的完整UUID:

 [root@docker ~]# docker volume rm 3e19
 Error response from daemon: get 3e19: no such volume
 ​
 [root@docker ~]# docker volume rm 3e19c9513c022a4310411d5becd7715b3c935e0685e2927daae6ee4bf53737f3
 3e19c9513c022a4310411d5becd7715b3c935e0685e2927daae6ee4bf53737f3

要自动删除匿名卷,应在创建容器时使用--rm选项。

要使用-v选项在启动容器时产生匿名卷,则需要省略第1个字段:

 docker run -it -v /world ubuntu /bin/bash

7.6、绑定挂载主机上的目录

通过绑定挂载可以将Docker主机上现有的目录绑定挂载到容器的目录中,需要挂载的目录可以由主机上的绝对路径引用。

1、准备源代码目录并切换到source目录

 [root@docker ~]# mkdir -p source/target
 [root@docker ~]# cd source
 [root@docker source]# ls
 target

2、启动容器并将主机上的source/target目录挂载到容器的/app目录中。

 # --mount方式     $(pwd)表示指定挂载源为主机的当前目录
 [root@docker source]# docker run -d -it --name devtest --mount type=bind,source="$(pwd)"/target,target=/app nginx
 ​
 # -v方式,两种选其一即可
 [root@docker source]# docker run -d -it --name devtest -v "#(pwd)"/target:/app nginx

3、查看容器的信息信息,验证绑定挂载是否正确。

 [root@docker source]# docker inspect devtest 
 ...
 "Mounts": [
             {
                 "Type": "bind",                 # 挂载类型为bind(绑定) 
                 "Source": "/root/source/target",# 挂载源
                 "Destination": "/app",          # 目标为容器上的/app
                 "Mode": "",                     # 模式为空
                 "RW": true,                     # 可读写
                 "Propagation": "rprivate"       # 传播方式:表示私有的
             }
         ],
 ...

4、停止并删除容器,恢复环境:

 docker stop devtest
 docker rm devtest

5、只读绑定挂载

 # --mount选项方法
 docker run -d -it --name devtest --mount type=bind,source="$(pwd)"/target,target=/app,readonly nginx
 ​
 # -v选项方法
 docker run -d -it --name devtest -v "$(pwd)"/target:/app :ro nginx
 ​
 # 查看容器详细信息:
 [root@docker source]# docker inspect devtest 
 ...
 "Mounts": [
             {
                 "Type": "bind",                 # 挂载类型为bind(绑定) 
                 "Source": "/root/source/target",# 挂载源
                 "Destination": "/app",          # 目标为容器上的/app
                 "Mode": "",                     # 模式为空
                 "RW": false,                    # 只读
                 "Propagation": "rprivate"       # 传播方式:表示私有的
             }
         ],
 ...
 ​
 # 停止并删除容器,恢复环境

7.7、绑定挂载主机上的文件

除了绑定挂载目录外,还可以单独指定一个文件进行绑定挂载,该文件可以由主机上的绝对路径引用。

绑定挂载文件主要用于主机与容器之间共享配置文件

例如:将主机上的/etc/localtime挂载到容器中,可以让容器的时区设置与主机保持一致:

 [root@docker ~]# docker run --rm -it -v /etc/localtime:/etc/localtime ubuntu /bin/bash
 root@b7b0f93b2fb4:/# date +%z       # 查看时区设置
 +0800
 root@b7b0f93b2fb4:/# exit
 exit

7.8、绑定挂载主机上不存在的目录或文件

绑定挂载Docker主机上并不存在的目录或文件时,--mount和-v选项的表现有些差异。

使用-v选项,则会在主机上自动创建一个目录,对于不存在的文件,创建的也是一个目录。

 [root@docker-2322030238 ~]# docker run --rm -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash
 root@bb0caeb00906:/foo# exit
 exit
 # 可以发现家目录下有doesnt目录,其下有exist目录
 [root@docker-2322030238 ~]# cd / && ls
 ...  doesnt  ...

但用--mount选项,Docker非但不会自动创建目录,反而会报错。

 [root@docker ~]# docker run --rm --mount type=bind,source=/doesnt/exist:/foo,target=/foo -w /foo -i -t ubuntu bash
 docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /doesnt/exist:/foo.

7.9、绑定挂载到容器中的非空目录

若果将主机上的目录挂载到容器中的非空目录,则容器挂载的目录中的现有内容会被绑定挂载(主机上的目录)所遮盖(被遮盖的目录不会被删除或更改,但不可访问)

无论主机上的目录是否为空,绑定挂载到容器的非空目录都会发生遮盖的情况。对于卷来说,只有卷中存在内容,挂在卷的容器目录才会被遮盖而使用该卷中的内容。

比较极端的示例:用主机上的/tmp目录替换容器/usr目录的内容(这会产生一个没有用处的容器):

 [root@docker-2322030238 ~]# docker run -d -it --name broken-container --mount type=bind,source=/tmp,target=/usr nginx
 240b7c0c3541d07e4e932ddbb6f83a7121ae3e4b8af7dcf2c2e3432ccf008975
 ​
 # 容器虽然创建了,但是无法工作。使用以下命令删除容器
 docker container rm broken-container

7.10、备份、恢复和迁移数据卷

可以通过卷容器(Volume Container)实现卷的备份、恢复和迁移。卷容器又称数据卷容器,是一种特殊的容器,专门用来将卷(也可以是绑定挂载)提供给其他容器挂载。使用docker run或docker create创建容器时可通过--volumes-from选项基于卷容器创建一个新的容器,并挂载卷容器提供的卷。

1、创建卷容器

 # 创建一个名为dbstore的卷容器,挂载一个匿名卷(/dbdata)
 [root@docker ~]# docker create -v /dbdata --name dbstore busybox /bin/sh

2、备份卷容器

 [root@docker ~]# docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
 tar: Removing leading `/' from member names
 /dbdata/
 ​
 [root@docker ~]# ls
 ... backup.tar ... 
  • 启动一个新的容器并从dbstore容器中挂载卷
  • 将本地主机的当前目录挂载为/backup
  • 传送一个命令,将dbdata卷的内容打包为/backup/backup.tar文件

命令完成后,会在主机当前目录中留下一个dbdata卷的备份文件

3、从备份中恢复卷容器

创建备份后,可以将它恢复到同一个容器,或者另一个在别处创建的容器。

 # 创建一个名为dbstore2的新容器
 docker run -v /dbdata --name dbstore2 ubuntu /bin/bash

在新容器的数据卷中将备份文件解压缩

 docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity类银河恶魔城学习记录15-5,6 p157 Audio time limiter p158 Area sound

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili​​ AreaSound.cs using System.Collections; using System.Collections.G…

Spring boot + Redis + Spring Cache 实现缓存

学习 Redis 的 value 有 5 种常用的数据结构 Redis 存储的是 key-value 结构的数据。key 是字符串类型&#xff0c;value 有 5 种常用的数据结构&#xff1a; Redis 的图形化工具 Another Redis Desktop Manager Spring Data Redis Redis 的 Java 客户端。 Spring Cache Spr…

Pycharm新建工程时使用Python自带解释器的方法

Pycharm新建工程时使用Python自带解释器的方法 新建Project时最好不要新建Python解释器&#xff0c;实践证明&#xff0c;自己新建的Python解释器容易出现各种意想不到的问题。 那么怎样使用Python安装时自带的解释器呢&#xff1f; 看下面的三张截图大家就清楚了。 我的Pyth…

avl excite python二次开发1--python解释器需用内置解释器aws_cmd

avl excite python二次开发1--python解释器需用内置解释器aws_cmd 1、python解释器问题1.1、用外置python解释器&#xff0c;import WSInterface会失败(WSInterface.pyd)1.2、用内置解释器aws_cmd运行py脚本1.3 用内置解释器aws_python执行脚本三级目录 1、python解释器问题 1…

Python_AI库 matplotlib扩展知识

Python_AI库 matplotlib扩展知识 在数据分析和处理的领域里&#xff0c;可视化是一种不可或缺的手段。通过图形化的展示&#xff0c;我们可以更直观地理解数据的分布、趋势和关系。而matplotlib&#xff0c;作为Python中最为流行的数据可视化库之一&#xff0c;以其强大的功能…

Anti Rookit -- 检测隐藏进程

Anti Rookit 一&#xff1a;检测隐藏进程 引言 检测隐藏进程除了众所周知的枚举进程ID之外&#xff0c;还有枚举句柄表的方式。不过今天给大家带来的是第三种方法。 探究 应用层通过接口 C r e a t e P r o c e s s \textcolor{cornflowerblue}{CreateProcess} CreateProcess…

分布式与一致性协议之Paxos算法(二)

Paxos算法 如何达成共识 想象这样一个场景&#xff0c;某地出现突发事件&#xff0c;当地村委会、负责人等在积极研究和搜集解决该事件的解决方案&#xff0c;你也决定参与其中&#xff0c;提交提案&#xff0c;建议一些解决方法。为了和其他村民的提案做区分&#xff0c;你的…

Stability AI 推出稳定音频 2.0:为创作者提供先进的 AI 生成音频 - Circle 阅读助手

概述 Stability AI 的发布再次突破了创新的界限。这一尖端模型以其前身的成功为基础&#xff0c;引入了一系列突破性的功能&#xff0c;有望彻底改变艺术家和音乐家创建和操作音频内容的方式。 Stable Audio 2.0 代表了人工智能生成音频发展的一个重要里程碑&#xff0c;为质量…

【golang学习之旅】Go的 switch 分支语句

系列文章 【golang学习之旅】报错&#xff1a;a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】Go 的循环结构 【golang学习之旅】Go里面 if 条件判断语句 目录 系列文章switch 分支fallthrough 关键字无条件 switch switch 分支 有些时候需…

前端框架编译器之模板编译

编译原理概述 编译原理&#xff1a;是计算机科学的一个分支&#xff0c;研究如何将 高级程序语言 转换为 计算机可执行的目标代码 的技术和理论。 高级程序语言&#xff1a;Python、Java、JavaScript、TypeScript、C、C、Go 等。计算机可执行的目标代码&#xff1a;机器码、汇…

如何使用 Internet Download Manager (IDM) 来加速和优化你的下载体验 IDM 6.41下载神器

在当今信息爆炸的时代&#xff0c;下载文件和媒体内容已成为我们日常生活的一部分。无论是工作学习还是娱乐休闲&#xff0c;我们都需要从互联网上下载各种资源。为了提高下载效率和确保文件完整性&#xff0c;选择一款优秀的下载管理软件至关重要。Internet Download Manager …

四、线段、矩形、圆、椭圆、自定义多边形、边缘轮廓和文本绘制(OpenCvSharp)

功能实现&#xff1a; 对指定图片上进行绘制线段、矩形、圆、椭圆、自定义多边形、边缘轮廓以及自定义文本 一、布局 用到了一个pictureBox和八个button 二、引入命名空间 using System; using System.Collections.Generic; using System.Drawing; using System.Windows.F…

用C实现通讯录(详细讲解+源码)

前言 &#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL.. &#x1f4da;以后会将数据结构收录为一个系列&#xff0c;敬请期待 ● 本期内容会给大家带来通讯录的讲解&#xff0c;主要是利用结构体来实现通讯录&#xff0c;该通讯…

【微信小程序调用百度API实现图像识别实战】-前后端加强版

前言&#xff1a;基于前面两篇图像识别项目实战文章进行了改造升级。 第一篇 入门【微信小程序调用百度API实现图像识别功能】----项目实战 第二篇 前后端结合 【微信小程序调用百度API实现图像识别实战】----前后端分离 这一篇主要讲述的是在第二篇的基础上新增意见反馈功能&a…

【35分钟掌握金融风控策略13】单维度策略监控和调优

目录 单维度策略监控和调优 策略宏观监控和调优 项目运营报表 资产监控报表 客群质量监控报表 资产使用报表 项目风险报表 FSTPD逾期报表 迁徙率报表 Vintage报表 贷后催收报表 单维度策略监控和调优 若贷前授信审批环节上线的是基于决策树开发的多维度策略&#x…

html+css 选择器优先级

1.基本选择器优先级 id>class>tagname(标签选择器)>*(通配符选择器) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>基本选择器的优先级</title><style type"text/css"…

微信小程序使用echarts实现条形统计图功能

微信小程序使用echarts组件实现条形统计图功能 使用echarts实现在微信小程序中统计图的功能&#xff0c;其实很简单&#xff0c;只需要简单的两步就可以实现啦&#xff0c;具体思路如下&#xff1a; 引入echarts组件调用相应的函数方法 由于需要引入echarts组件&#xff0c;代…

永磁同步电机PMSM负载状态估计simulink模型

永磁同步电机PMSM负载状态估计simulink模型&#xff0c;龙伯格观测器&#xff0c;各种卡尔曼滤波器&#xff0c;矢量控制&#xff0c;坐标变换&#xff0c;永磁同步电机负载转矩估计&#xff0c;pmsm负载转矩测量&#xff0c;负载预测&#xff0c;转矩预测的matlab/simulink仿真…

锂电池SOH预测 | 基于LSTM的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

BPE、Wordpiece、Unigram、SpanBERT等Tokenizer细节总结

BPE(Byte Pair Encoding) GPT-2和Roberta用的是这种&#xff0c;不会产生[UNK]这个unknown字符 这部分部分摘录自https://martinlwx.github.io/zh-cn/the-bpe-tokenizer/ 看以下code例子就足够理解了&#xff0c;核心是维护self.merges&#xff08;维护一个pair->str的字…