Linux操作系统运维-Docker的基础知识梳理总结

Linux操作系统运维-Docker的基础知识梳理总结

  • docker用来解决不同开发人员软件调试时环境不统一的问题,保证了程序调试时运行环境的一致性。
  • docker的设计理念便是一处镜像,处处运行,即通过产生用户软件,运行环境及其运行配置的统一镜像来解决不一致的开发环境部署。
  • docker是基于go语言实现的云开源项目,它是linux容器技术的进一步发展而来。

docker与传统虚拟机的差异

  • linux容器(容器虚拟化技术)

Linux容器是一种轻量级的虚拟化技术,它允许在同一主机上运行多个隔离的用户空间实例,每个实例都有自己的文件系统、进程空间和网络资源。容器是基于操作系统级虚拟化实现的,与传统的虚拟机相比,它们更加轻量级、启动更快,并且占用更少的系统资源。

Linux容器的核心技术是Linux内核的命名空间和控制组(cgroup)。命名空间提供了隔离的环境,使得每个容器都具有自己独立的进程、网络、文件系统等资源。控制组用于限制和管理容器的资源使用,例如CPU、内存、磁盘IO等。

容器可以在同一主机上并行运行,互相之间相互隔离,不会相互影响。每个容器都可以运行自己的应用程序和服务,就像在独立的操作系统中一样。容器还可以快速部署、复制和迁移,使得应用程序的部署和管理更加灵活和高效。

常见的Linux容器技术包括Docker、LXC(Linux Containers)、rkt等。它们提供了易于使用的工具和接口,简化了容器的创建、管理和部署过程。

所以docker与传统虚拟机的差异体现在:docker是在操作系统层面实现虚拟化,而传统虚拟机是在硬件层面实现虚拟化

docker快速的底层原因

  • docker拥有更少的抽象层,不需要硬件资源虚拟化,直接使用物理机的硬件资源
  • docker利用的是宿主机的内核,无需加载操作系统内核,避免了引导加载系统内核等消耗大量时间的过程

Docker帮助启动类命令

  • docker概要信息
docker info
  • docker帮助文档
docker --hlep
  • docker对应指令的文档
docker [command] --help

例如:docker run --help

Docker常见镜像操作命令

  • 查看存在镜像列表
docker images
选项描述
-a列出本地所有镜像,含历史镜像列表
-q只显示镜像ID
  • 在仓库检索镜像
docker search [镜像名]

例如:docker search hello-world

--limit选项:用于列出指定数目的镜像(默认列出25个,即不指定数目),因为不同组织或个人提交的镜像是比较多的

例如:docker search --limit 10 redis

  • 下载镜像
docker pull [镜像名]

例如:docker pull redis 就是默认下载官方最新版的redis

在此命令后还可以以冒号衔接一个TAG,TAG是镜像的标签或版本号,例如 docker pull [镜像名]:6将下载一个TAG为6的版本

  • 查看镜像,容器,数据卷所占空间
docker system df
[root@localhost ~]# docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          4         1         954.8MB   954.8MB (100%)
Containers      2         1         106.9MB   15B (0%)
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B
  • 删除镜像
docker rmi [镜像名/镜像ID]

删除镜像的两个阶段:

  • Untagged(取消标签): 如果指定的镜像标签是一个具体的标签(例如ubuntu:latest),那么这个命令会取消这个标签与镜像的关联。

  • Deleted(删除): 如果删除操作成功,Docker会删除与指定镜像ID相关联的所有层。

Untagged的操作意味着这个镜像不再与特定的标签相关联,但实际的镜像层可能仍然存在,因为可能还有其他标签或镜像依赖于这些层。Deleted的操作则彻底删除了指定的镜像层,释放相关的存储空间。如下正在执行删除Ubuntu操作的docker

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mysql        latest    56b21e040954   8 days ago    632MB
ubuntu       latest    e34e831650c1   2 weeks ago   77.9MB
redis        latest    bdff4838c172   2 weeks ago   138MB
[root@localhost ~]# docker rmi e34e831650c1
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:e6173d4dc55e76b87c4af8db8821b1feae4146dd47341e4d431118c7dd060a74
Deleted: sha256:e34e831650c1bb0be9b6f61c6755749cb8ea2053ba91c6cda27fded9e089811f
Deleted: sha256:8e87ff28f1b5ff2d5131999ccfa1e674cb252631c50683f5ee43fad59cbea8e1

注意

  • 被使用过的镜像有可能删除不了,可以使用 -f选项进行强制删除,例如:docker rmi -f hello-world

  • 也可以使用镜像id进行删除,例如:docker rmi -f xxxxxx,值得注意的是镜像的id实际上是sha256加密字符串的前几位

  • 删除多个镜像 例如:docker rmi -f hello-world ubuntu

  • 删除镜像时在镜像后也可以接TAG,进行指定删除

  • 全部删除:docker rmi -f $(docker images -qa),实际上是将全部镜像作为参数传递给删除命令

docker的虚悬镜像:仓库名与标签均为<none>的镜像被称为虚悬镜像

Docker常见容器操作命令

以镜像为模板,以容器为实例

命令模板docker run 指令 镜像名 命令 其他参数

指令描述
--name="容器新名称"为运行的容器指定一个名称
-d后台运行一个容器,并返回容器ID
-it-i与-t常一起使用,前者开启交互式运行,后者用于启动伪终端
-P进行随机端口映射
-p指定对应端口进行映射,参数为 [主机端口]:[容器端口]
-e允许你在运行容器时向其中传递环境变量。对于配置应用程序、传递配置信息以及控制应用程序的行为非常有用。

注意:在-t指令后是可以开启指定终端的,例如:docker run -it ubuntu /bin/bash

  • docker run命令的执行过程

在这里插入图片描述

图源:尚硅谷

  • 查看正在运行的容器
命令描述
docker ps查看正在运行的容器
docker ps -a查看所有容器,包括已停止的
docker ps -l显示最近创建的容器
docker ps -n显示最近创建的 n 个容器
docker ps -q静默模式,只显示容器编号

注意:在未指定的情况下,我们每run一个镜像都会产生一个对应的容器,并且在伪终端界面输入exit将会退出容器,并且将容器关闭,使用快捷键ctrl+q+p将会退出容器,但是容器仍然在后台存活

  • 容器的管理与监控
命令描述
docker start [容器id或者名称]启动已经停止的容器
docker restart [容器id或者名称]重启容器
docker stop [容器id或者名称]停止容器
docker kill [容器id或者名称]强制停止容器
docker rm [容器ID]删除已经停止的容器
docker rm -f [容器ID/容器名称]强制删除一个容器
docker rm -f $(docker ps -a -q)强制删除多个停止的容器
docker run -d [容器id或者名称]在后台运行服务
docker logs [容器id或者名称]查看对应容器的日志

需要注意的是,使用后台运行指令时,在容器的前台必须要存在一个前台进程,否则容器将会自动退出

命令描述
docker inspect [容器ID]用于检查Docker容器的详细信息
docker exec -it [容器ID] [shell程序]在容器中打开新的终端进程,使用exit命令退出不会导致容器停止
docker attach [容器ID]不会在容器中打开新的终端进程,使用exit命令退出将导致容器停止
docker cp [容器ID]:[容器内路径] [目标主机路径]将容器中的文件复制到主机磁盘
docker export [容器ID] > [文件名.tar]导出整个容器作为tar归档文件,即备份容器
`cat [文件名.tar]docker import - [镜像用户]/[镜像名]:[镜像版本号]`
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
f0e00969856e   ubuntu    "/bin/bash"   2 minutes ago   Up 2 minutes             focused_napier
[root@localhost ~]# docker inspect f0e00969856e
[{"Id": "f0e00969856e0a81bfb3d625d799be247734be9fae09339a11c40bba6f4232c2","Created": "2024-01-29T02:57:21.589434796Z","Path": "/bin/bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,...

容器启动时的行为

已知如下命令默认不会在容器中启动前台进程,所以会在容器创建完成后直接退出:

docker run ubuntu

那么我们考虑如下行为:

docker run -it ubuntu
docker stop [容器ID]
docker start [容器ID]
docker exec -it [容器ID] [shell程序]

我们进行逐步解析:

  • docker run -it ubuntu启动容器时将会默认开启bash作为前台的主进程,保证了容器不会关闭,而是等待用户的输入

  • 当通过 docker stop [容器ID] 命令停止一个正常运行的容器时,Docker 会尝试关闭容器内的应用程序,并发送一个 SIGTERM 信号给主进程。如果容器内的应用程序在收到 SIGTERM 信号后能够正确处理并正常退出,那么容器会在一定时间内停止。如果容器内的应用程序没有正确响应 SIGTERM 信号,Docker 将发送一个 SIGKILL 信号,强制终止容器。

  • docker start [容器ID]启动容器时,docker start 不会重新运行 docker run 中指定的启动命令,而是尝试重新运行容器最初启动时的主进程。主进程即docker run -it ubuntu启动的交互式shell。如果容器内的应用程序在启动时没有遇到问题,它将继续在后台运行。即处于挂起状态

  • docker exec -it [容器ID] [shell程序]将会在容器内新建一个可交互shell进程,我们通过在容器内运行ps -aux即可发现以下内容

    root@fc68f54b4133:/# ps aux
    USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root          1  0.0  0.2   4612  2088 pts/0    Ss+  09:37   0:00 /bin/bash
    root          9  0.0  0.2   4612  2324 pts/1    Ss   09:38   0:00 /bin/bash
    root        229  0.0  0.1   7048  1444 pts/1    R+   09:47   0:00 ps aux
    

    我们会发现有两个bash进程,根据STAT与PID可知第一个bash是会话的领导者,并且处于挂起状态,并且还是一个前台进程组成员

程序状态表:

状态描述
R进程正在运行或可运行(runnable)。这表示进程目前正在执行或等待执行。
S进程处于休眠状态。通常是因为在等待某个事件而挂起。
D不可中断的休眠状态。进程正在等待硬件操作的完成,无法被中断。
Z僵尸进程。进程已经终止,但其父进程还没有等待回收它的状态信息。
T停止状态。进程被停止或暂停执行。
  • Ss 表示进程是会话领导者,同时进程处于休眠状态。
  • S< 表示进程是会话领导者,同时进程处于非休眠状态。

Docker镜像分层与加载原理

镜像的分层概念与特性

Docker镜像是Docker容器的基础构建块,它是一个轻量级、独立、可执行的软件包,其中包含运行一个应用所需的所有内容,包括代码、运行时、库、环境变量和配置文件等。

Docker的镜像分层是指镜像是由多个只读层(layers)组成的结构。这些层是对文件系统的一系列叠加操作,每一层都包含了一组文件和配置,与前一层相比有所修改。这种分层结构的设计使得镜像更加轻量、高效、可维护,同时具备一些重要的优势:

  • 缓存和重用: 因为每一层都是只读的,且具有唯一标识,Docker可以缓存这些层,从而在构建和推送镜像时更加高效。如果多个镜像共享相同的层,这些层只需存储一次,节省了存储空间。

  • 分布式构建: 当构建一个镜像时,Docker可以将各个层分布式地下载和构建,从多个源获取。这使得构建过程更加快速,尤其是当镜像的各个层已经存在于本地或远程的镜像仓库时。

  • 可继承性: 镜像的分层结构允许基于现有镜像构建新的镜像,只需添加或修改几个层,而不必重新构建整个镜像。这提高了镜像的可继承性和可重用性。

  • 更容易管理和更新: 当一个容器运行时,Docker在其上添加一个可写层(即容器层,用于存储容器的运行时状态和文件修改。这个可写层是容器特有的,而镜像的只读层是共享的。这使得容器可以轻松地更新、删除和重新创建,而不影响镜像的原始只读层。

联合文件系统概念与镜像构建

联合文件系统(Union File System)是一种文件系统技术,它将多个文件系统层联合在一起,形成一个单一的文件系统视图。Union文件系统(UnionES)是一种分层、轻量级并目高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。它的使用使得docker具有以下特性:

  • 分层文件系统: Docker镜像是由多个只读层(layers)组成的,每一层都包含文件和配置。这些只读层采用分层结构,每一层相对于前一层表示一系列文件的添加、修改或删除。

  • 联合挂载: Docker使用联合挂载技术将这些只读层联合在一起,形成一个单一的文件系统视图。这样,当容器运行时,这个文件系统视图包含了所有必要的文件和配置,提供了容器的运行环境。

  • 可写层: 在容器运行时,Docker在只读层之上添加一个可写层,用于存储容器的运行时状态和文件修改。这个可写层是容器特有的,允许容器在运行时进行文件修改而不影响镜像的原始只读层。

  • 镜像的不可变性: 由于只读层的不可变性,Docker镜像具有不可变性的特性。一旦镜像被构建,它的只读层就不再改变,这样可以确保镜像的一致性和可重复性。

如下正在执行分层拉取MySQL镜像的docker

[root@localhost ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
558b7d69a2e5: Downloading [==========>                                        ]     11MB/51.32MB
2cb5a921059e: Download complete 
b85878fb9bb2: Download complete 
d16f3fd26a82: Downloading [======>                                            ]  593.1kB/4.591MB
afd51b5329cb: Waiting 
374d2f7f3267: Waiting 
4ea1bb2c9574: Waiting 
1c9054053605: Waiting 
d79cd2da03be: Waiting 
e3a1aa788d17: Waiting 

Docker的镜像加载原理

docker加载镜像的过程与Linux/Unix系统启动是类似的,它也有bootfs用来引导镜像,不过docker中的bootfs是Docker引擎用于引导容器的一部分

bootfs(boot file system)主要包含bootloaderkernelbootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfsrootfs (root file system)在bootfs之上。包含的就是典型 Linux 系统中的/dev/proc/bin/etc 等标准目录和文件。rootfs就是各科不同的操作系统发行版,比如UbuntuCentos等等。

Docker的镜像为何如此轻量

首先需要明白镜像的linux是精简的,并没有许多不必要的基础组件。对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Hostkernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs

当我们将一个镜像进行实例化开启容器后,一个新的可写层将会加载到镜像顶部变为我们的容器,也被称为容器层。其下的镜像层均是不可写的

提交容器副本构建新镜像

docker commit -m="容器描述信息" -a="作者信息" [容器ID] 新的镜像名:标签名
[root@localhost ~]# docker commit -m="installed the vim" -a="2333" f0e00969856e vim/ubuntu:2333333
sha256:9926edd5141d5adf6104f0ac1ea14b2881423f6fb10e816aff905e137b835e52
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
vim/ubuntu   2333333   9926edd5141d   12 seconds ago   185MB
mysql        latest    56b21e040954   10 days ago      632MB
ubuntu       latest    e34e831650c1   2 weeks ago      77.9MB
redis        latest    bdff4838c172   2 weeks ago      138MB
[root@localhost ~]# 

修改自定义镜像的tag

docker tag [原有镜像名]:[原有tag] [新镜像名]:[新的tag]

正在运行的镜像也是可以进行构建新镜像的,在上述命令的过程中,我们扩展了现有的镜像,类似于Java的继承,新的镜像是从base镜像一层一层叠加生成的,每提交一个镜像就在现有的镜像上增加一层,则我们上述的内容可以得出一个大致的模型:

Docker镜像构建模型

在这里插入图片描述

Docker容器数据卷概念与使用

Docker容器数据卷是在Docker容器之间共享和持久化数据的一种方式。它们允许在容器之间共享文件、目录或者数据,并且可以在容器的生命周期内保留数据,即使容器停止或被删除(类似于虚拟机上的共享文件夹)。它具有以下特性:

  1. 容器与主机之间的数据传输: 数据卷不仅仅可以在容器之间共享,还可以在容器与主机之间传输数据。这使得容器中的数据可以持久化保存在主机上。

  2. 数据卷的生命周期: 数据卷的生命周期独立于容器。即使容器被删除,数据卷中的数据仍然存在,除非显式删除数据卷。

  3. 数据卷的备份和恢复: Docker提供了一些工具,如docker cp命令,允许将数据卷中的数据复制到主机上,从而实现备份和恢复操作。

  4. 容器之间的解耦: 使用数据卷可以实现容器之间的解耦,允许更新或替换一个容器而不影响其它容器的数据。

为什么会谈到容器停止时会保留数据?

默认情况下,Docker容器停止后,容器内的数据是不会丢失的。Docker 使用一种称为写时复制(Copy-On-Write)的技术,使得容器在运行时可以修改其文件系统,但在容器停止后,对文件系统的修改将被保存在容器的镜像中。

然而,需要注意的是,虽然容器内的数据在停止时不会丢失,但容器本身可能会被删除。如果你使用了临时性的容器(例如通过 docker run --rm 命令启动的容器),容器停止后会被自动删除,但数据卷仍然存在。临时性容器是一种短暂存在的、用于执行特定任务的 Docker 容器。它们与长期运行的常规容器不同,因为它们在任务完成后会自动删除。临时性容器通常用于执行一次性的、短暂的操作,例如调试、测试、数据备份或手动操作。--rm 标志表示容器在停止后应该被自动删除。

  • 进行容器卷挂载
docker run -it -v [宿主机的绝对路径]:[容器内的路径]:[读写模式] [镜像名]

需要注意的是,在宿主机或容器内的路径不存在的情况下将会自动创建,并且可以使用多个v来挂载多个容器卷,读写模式默认是rw,只读模式ro,不过读写模式只限制容器,该选项默认挂载的主机路径为/var/lib/docker/volumes

使用–privileged=true来进行挂载权限不足的问题

在Docker中,--privileged=true是一个非常强大且潜在危险的选项,它赋予了容器超级用户的权限,使得容器内的进程具有对主机上所有设备的访问权限。这包括了对主机上的特权操作系统功能的完全访问,这可能会导致安全风险。

使用--privileged=true的主要目的是为了让容器内的进程能够执行一些需要特殊权限的操作,比如在容器内运行一些需要访问主机设备或进行底层系统操作的应用。然而,这样的权限可能会被滥用,因此建议仅在确切了解和信任容器中运行的应用程序的情况下使用该选项。

  • 下方命令将创建一个数据卷,它的默认路径为/var/lib/docker/volumes,通常需要我们自己指定
docker volume create [数据卷名]
  • 第二种挂载数据卷的方式
docker run -d --name [新容器的名称] --mount source=[数据卷路径],target=[容器内路径] [新容器镜像名]
  • 继承容器卷
docker run -d --name [新容器的名称] --volumes-from [已存在容器名称] [新容器镜像名]

新的容器将继承选定的已存在容器上的容器数据卷

配置阿里云镜像加速服务

可以在登录阿里云后在容器服务->容器工具里找到镜像加速服务及使用文档

在这里插入图片描述

点击进入控制台,有以下界面:

在这里插入图片描述

根据操作指南,里面会有你自己的加速链接(我这里使用的是CentOS):

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://xxxxxxxc.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

本地镜像发布到阿里云

在上述界面中找到以下内容,创建个人实例:

在这里插入图片描述

然后创建自己的命名空间,在自定义的命名空间中创建仓库后,根据页面提示的命令操作即可,和GitHub是类似的

私人镜像仓库的部署

抓取官方的镜像

docker pull registry

创建私有仓库运行实例

docker run -d -p [主机端口]:5000 registry

例如:

docker run -d -p 8080:5000 registry

查看仓库中的镜像有哪些

curl -X GET http://仓库的地址/v2/_catalog

也可以将默认镜像储存目录作为容器数据卷进行挂载,例如以下命令

docker run -d -p 8080:5000 -v ~/tmp_docker/:/var/lib/registry --name docker_test registry

例如在宿主机的仓库映射端口为8080时

[root@localhost ~]# curl -X GET http://127.0.0.1:8080/v2/_catalog
{"repositories":[]}

Docker Registry 提供了一个 API 端点,可以使用 curl 或其他 HTTP 客户端工具进行访问。通过调用 /v2/_catalog 端点,可以列出所有仓库。

创建自定义的镜像

docker commit -m="容器描述信息" -a="作者信息" [容器ID] 新的镜像名:标签名

修改镜像tag为规范格式

docker tag [原有镜像名]:[原有tag] [仓库地址/新镜像名]:[新的tag]

以看HTTP方式推送自定义镜像

  • 配置信任HTTP推送
[root@localhost ~]# vim /etc/docker/daemon.json
[root@localhost ~]# cat /etc/docker/daemon.json 
{"insecure-registries":["127.0.0.1:5000"]
}

进行推送

[root@localhost ~]# docker push 127.0.0.1:8080/vim_ubuntu:233
The push refers to repository [127.0.0.1:8080/vim_ubuntu]
14501abaf824: Pushed 
8e87ff28f1b5: Pushed 
233: digest: sha256:b1a9da2a1fa274bea7c2ad57bd6d7775156ba288d62261124f646fe95edc393f size: 741
[root@localhost ~]# curl -X GET http://127.0.0.1:8080/v2/_catalog
{"repositories":["vim_ubuntu"]}

拉取该镜像

[root@localhost ~]# docker pull 127.0.0.1:8080/vim_ubuntu:233
233: Pulling from vim_ubuntu
df2fac849a45: Already exists 
314a19a38b7c: Pull complete 
Digest: sha256:b1a9da2a1fa274bea7c2ad57bd6d7775156ba288d62261124f646fe95edc393f
Status: Downloaded newer image for 127.0.0.1:8080/vim_ubuntu:233
127.0.0.1:8080/vim_ubuntu:233

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

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

相关文章

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现ABC-BP人工蜂群算法优化BP神经网络多变量回归预测&#x…

Linux下centos操作系统安装Mysql8.0过程及踩坑填补

我自己有一台服务器&#xff0c;之前安装的是MySQL5.5&#xff0c;现在我想升级为MySQL8.0&#xff0c;于是我干了以下操作,既有踩坑又有干货&#xff1a; 1.先卸载MySQL&#xff1b; 2.删除跟MySQL相关文件&#xff1b; 3.安装新的MySQL8.0版本&#xff08;这里踩了一个坑&…

Spring- FactoryBean接口中的getObject()方法

目录 一、Spring框架介绍 二、FactoryBean接口是什么 三、getObject()方法如何使用 一、Spring框架介绍 Spring框架是一个轻量级的、非侵入式的Java企业级应用开发框架&#xff0c;以IoC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;为核心思…

springboot集成easypoi导出多sheet页

pom文件 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version> </dependency> 导出模板&#xff1a; 后端代码示例&#xff1a; /*** 导出加油卡进便利店大额审批列…

云计算 - 弹性计算技术全解与实践

一、引言 在过去的十年里&#xff0c;云计算从一个前沿概念发展为企业和开发者的必备工具。传统的计算模型通常局限于单一的、物理的位置和有限的资源&#xff0c;而云计算则通过分布式的资源和服务&#xff0c;为计算能力带来了前所未有的"弹性"。 弹性&#xff1a;…

axios get 请求 url 转码 空格转成+,导致请求失败(前端解决)

问题 GET 请求参数&#xff1a; URL-encoded 后&#xff1a; 浏览器将空格转成了&#xff0c;导致服务报错&#xff0c;返回 400。 解决 在请求拦截器中&#xff0c;对 params 进行处理。 axios.interceptors.request.use((config) > {let url config.url;if (config…

ES监控方法以及核心指标

文章目录 1. 监控指标采集1.1 部署elasticsearch_exporter1.2 prometheus采集elasticsearch_exporter的暴露指标1.3 promethues配置告警规则或者配置grafana大盘 2. 核心告警指标2.1 es核心指标2.2 es容量模型建议 3. 参考文章 探讨es的监控数据采集方式以及需要关注的核心指标…

python-自动化篇-办公-一键将word中的表格提取到excel文件中

文章目录 代码 工作中&#xff0c;经常需要将Word文档中的表格粘贴到Excel文件中&#xff0c;以便汇总及分析。一个一个复制粘贴&#xff0c;非常不方便&#xff0c;还是Python自动化操作&#xff0c;省心省力。要求如下图所示&#xff0c;即将word中的所有表格&#xff0c;转存…

闲聊电脑(6)装个 Windows(二)

闲聊电脑&#xff08;6&#xff09;装个 Windows&#xff08;二&#xff09; 夜深人静&#xff0c;万籁俱寂&#xff0c;老郭趴在电脑桌上打盹&#xff0c;桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭&#xff1a;冰箱大哥&#xff0c;上次说的镜像文件到底长啥样…

VMware虚拟机安装openEuler系统(一)(2024)

目录 一、下载ISO镜像 二、开始创建虚拟机 通过实践是学习openEuler开源Linux系统的最佳方式。因此我们首先得搭建一个openEuler实战环境&#xff0c;文章是在Windows系统上使用VMware Workstation虚拟化软件&#xff0c;安装和学习openEuler开源Linux操作系统。 使用虚拟机…

【wu-lazy-cloud-network】Java自动化内网穿透

项目介绍 wu-lazy-cloud-network 是一款基于&#xff08;wu-framework-parent&#xff09;孵化出的项目&#xff0c;内部使用Lazy ORM操作数据库&#xff0c;主要功能是网络穿透&#xff0c;对于没有公网IP的服务进行公网IP映射 使用环境JDK17 Spring Boot 3.0.2 功能 1.内网…

算法day12

算法day12 二叉树理论基础114 二叉树的前序遍历145 二叉树的后序遍历94 二叉树的中序遍历迭代法 二叉树理论基础 直接看代码随想录就完事了&#xff0c;之前考研也学过&#xff0c;大概都能理解 我这里就说说代码层面的。 二叉树的存储&#xff1a; 1、链式存储&#xff1a;这…

基础面试题整理6之Redis

1.Redis的应用场景 Redis支持类型&#xff1a;String、hash、set、zset、list String类型 hash类型 set类型 zset类型 list类型 一般用作缓存&#xff0c;例如 如何同时操作同一功能 2.redis是单线程 Redis服务端(数据操作)是单线程&#xff0c;所以Redis是并发安全的,因…

Mysql MGR搭建

一、架构说明 1.1 架构概述 MGR(单主)VIP架构是一种分布式数据库架构&#xff0c;其中数据库系统采用单主复制模式&#xff0c; 同时引入虚拟IP(VIP)来提高可用性和可扩展性。 这种架构结合了传统主从复制和虚拟IP技术的优势&#xff0c;为数据库系统提供了高可用、 高性能和…

十分钟GIS——geoserver+postgis+udig从零开始发布地图服务

1数据库部署 1.1PostgreSql安装 下载到安装文件后&#xff08;postgresql-9.2.19-1-windows-x64.exe&#xff09;&#xff0c;双击安装。 指定安装目录&#xff0c;如下图所示 指定数据库文件存放目录位置&#xff0c;如下图所示 指定数据库访问管理员密码&#xff0c;如下图所…

uniapp canvas游标卡尺效果

效果 根据公司业务仿照写的效果。原项目从微信小程序转uniapp,未测试该效果在android端效果。 uniapp直接使用canvas不可做子组件,否则无效果显示,其次显示时要考虑页面渲染超时的问题。 如效果所见,可以设置取值精度。 gitee地址:project_practice: 项目练习 - Gitee.…

用python编写爬虫,爬取房产信息

题目 报告要求 工程报告链接放在这里 https://download.csdn.net/download/Samature/88816284使用 1.安装jupyter notebook 2.用jupyter notebook打开工程里的ipynb文件&#xff0c;再run all就行 注意事项 可能遇到的bug 暂无&#xff0c;有的话私信我

Java 中使用多线程的方式有哪些

在 Java 中&#xff0c;使用多线程主要有以下几种方式&#xff1a; 实现 Runnable 接口&#xff1a;这是实现多线程的一种方式。一个类实现 Runnable 接口后&#xff0c;就意味着它是一个线程的执行对象。当一个线程启动时&#xff0c;需要一个与之关联的 Runnable 对象。 publ…

Netflix Mac(奈飞mac客户端) v2.13.0激活版

Clicker for Netflix Mac版是一款适用于Mac的最佳独立Netflix播放器&#xff0c;具有直接从从Dock启动Netflix&#xff0c;从触摸栏控制Netflix&#xff0c;支持画中画等多种功能&#xff0c;让你拥有更好的观看体验。 软件特色 •直接从Dock启动Netflix •从触摸栏控制Netflix…

每日一练:LeeCode-112、路径总和【二叉树+DFS+回溯】

本文是力扣LeeCode-112、路径总和 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有…