Docker保姆级学习教程

news2024/11/24 3:42:10

文章目录

  • 1、什么是Docker
    • 1.1、容器技术
    • 1.2、容器与虚拟机比较
    • 1.3、Docker特点
      • 1、更高效的利用系统资源
      • 2、更快速的启动时间
      • 3、一致的运行环境
      • 4、持续支付和部署
      • 5、更轻松的迁移
      • 6、更轻松的维护和扩展
  • 2、Docker组件学习
    • 2.1、Docker客户端和服务器
    • 2.2、Docker镜像
    • 2.3、Registry(注册中心/镜像仓库)
    • 2.4、Docker容器
  • 3、Docker的安装
    • 3.1、准备工作
      • 1、准备Linux服务器
      • 2、清除系统残余项
      • 3、安装下载Docker
      • 4、添加阿里云的软件源
      • 5、更新yum缓存
    • 3.2、安装Docker
      • 1、安装Docker
      • 2、启动Docker
      • 3、开机启动Docker
      • 4、移除Docker-ce服务
      • 5、删除Docker依赖项
  • 4、Docker常用命令
    • 4.1、停止与启动容器
    • 4.2、文件拷贝
    • 4.3、目录挂载
    • 4.4、查看容器IP地址
    • 4.5、删除容器
    • 4.6、登录容器
      • 1、使用attach进入容器
      • 2、使用exec命令进入容器
  • 5、Docker安装常用软件
    • 5.1、安装 MySQL
    • 5.2、安装JDK
  • 6、Docker中部署jar包运行
    • 6.1、准备一个jar包
    • 6.2、创建DockerFile文件
    • 6.3、生成镜像
    • 6.4、启动镜像
    • 6.5、启动容器
    • 6.6、运行效果查看

1、什么是Docker

首先看下Docker图标:

clip_image002

一条小鲸鱼上面有些集装箱,比较形象的说明了Docker的特点,以后见到这个图标等同见到了Docker

1.1、容器技术

  1. Docker是一个开源的应用容器引擎,它基于Go语言开发,并遵从Apache2.0开源协议
  2. 使用Docker可以让开发者封装他们的应用以及依赖包到一个可移植的容器中,然后发布到任意Linux机器上,也可以实现虚拟化
  3. Docker容器完全使用沙箱机制,相互之间不会有任何接口,这保证了容器之间的安全性
  4. Docker诞生于2013年初,目前有两个版本:Community Edition(CE,社区版)和EnterpriseEdition(EE,企业版)

1.2、容器与虚拟机比较

image-20220817120328415

虚拟机:

  1. 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统
  2. 在实体计算机中能够完成的工作在虚拟机中都能够实现
  3. 在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量
  4. 每个虚拟机都有独立的CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作

区别:

  1. 虚拟机是在一台物理机上,利用虚拟化技术,虚拟出来多个操作系统,每个操作系统之间是隔离的。Docker是开源的应用容器引擎,依然需要先在电脑上安装操作系统,然后安装Docker容器管理器
  2. 虚拟机是在硬件级别进行虚拟化,而Docker是在操作系统的层面虚拟化
  3. 虚拟机是通过模拟硬件搭建操作系统,而Docker则是复用操作系统
  4. 虚拟机实现了操作系统之间的隔离,Docker只是进程之间的隔离,所以虚拟机的隔离级别更高,安全性更强
  5. Docker的运行速度更快
  6. Docker的文件要小的多,虚拟机要大的多

1.3、Docker特点

1、更高效的利用系统资源

Docker对系统资源的利用率很高,无论是应用执行速度,内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,对比虚拟化技术,一个相同配置的主机往往可以运行更多数量的应用

2、更快速的启动时间

传统的虚拟化技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级,甚至毫秒级的启动时间,大大节约了开发测试,部署的时间

3、一致的运行环境

开发过程中常见的一个问题是环境一致问题,由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中发现。

而Docker的镜像提供了除内核外完整的运行时环境,确保环境一致性,从而不会在出现这段代码在我机器上没问题这类问题

Docker是一个采用集装箱思想出现技术,把相关依赖及运行代码打到一起,达到开发环境,测试环境,部署环境一样,减少由于环境不一致而出现问题

4、持续支付和部署

对开发和运维人员来说,最希望就是一次创建和部署,可以在任意地方运行。而且使用Docker file使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像

5、更轻松的迁移

由于Docker确保了执行环境的一致性,使得应用的迁移更加容易。

Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本、其运行结果是一致的。

因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况

6、更轻松的维护和扩展

Docker使用的分层存储以及镜像技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得十分简单。

此外,Docker团队同各个开源项目团队一起维护了一大批高质量的官网镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大降低了应用服务的镜像制作成本

2、Docker组件学习

clip_image008

2.1、Docker客户端和服务器

  1. Docker是一个客户端-服务器(C/S)架构程序。
  2. Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。
  3. Docker提供了一个命令行工具Docker以及一整套RESTful API。
  4. 你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程

clip_image010

2.2、Docker镜像

  1. 镜像是构建Docker的基石。
  2. 用户基于镜像来运行自己的容器。
  3. 镜像也是Docker生命周期中的“构建”部分。
  4. 镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。
  5. 例如:添加一个文件;执行一个命令;打开一个窗口。也可以将镜像当作容器的“源代码”。
  6. 镜像体积很小,非常“便携”,易于分享、存储和更新

2.3、Registry(注册中心/镜像仓库)

  1. Docker用Registry来保存用户构建的镜像。
  2. Registry分为公共和私有两种。
  3. Docker公司运营公共的Registry叫做Docker Hub。
  4. 用户可以在Docker Hub注册账号,分享并保存自己的镜像

说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry

2.4、Docker容器

  1. Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。
  2. 容器是基于镜像启动起来的,容器中可以运行一个或多个进程。
  3. 我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。
  4. 容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务

所以Docker容器就是:一个镜像格式;一些列标准操作;一个执行环境

Docker借鉴了标准集装箱的概念:

标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker运输软件(所以说Docker图标很形象)

  • 和集装箱一样,Docker在执行上述操作时,并不关心容器中到底装了什么,它不管是web服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容“装载”进去
  • Docker也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,再把容器部署到具体的主机中。像标准集装箱一样,Docker容器方便替换,可以叠加,易于分发,并且尽量通用
  • 使用Docker,我们可以快速的构建一个应用程序服务器、一个消息总线、一套实用工具、一个持续集成(CI)测试环境或者任意一种应用程序、服务或工具。我们可以在本地构建一个完整的测试环境,也可以为生产或开发快速复制一套复杂的应用程序栈

clip_image012

3、Docker的安装

  1. Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
  2. 这是官网上对Docker的介绍。说白了,Docker就是方便我们环境搭建和开发使用的

今天我主要是教大家如何搭建一个docker,帮助刚刚接触docker的同学快速搭建docker。好了,废话不多说,开始

3.1、准备工作

1、准备Linux服务器

Linux服务器一台,且上面的安装的Centos系统内核要不低于3.10。你可以通过uname -r来查询当前内核版本,我本地的虚拟机:

image-20220817121842367

2、清除系统残余项

如果你的Llinux服务器之前没有装过Docker,可以直接跳过此步骤

sudo yum remove docker

image-20220817124553513

我这台Linux服务器上刚装的虚拟机,是新的,所以没有什么需要删除的

3、安装下载Docker

接下来我就通过FinalShell工具来输入命令了

安装下载Docker的命令如下:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

输入命令后回车,等一会,等他安装完毕:

image-20220817124935805

安装完毕是这样了:image-20220817124955111

4、添加阿里云的软件源

输入下面命令:

sudo yum-config-manager --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

image-20220817125119864

装这个的目的是以后每个软件都优先从阿里云的软件库中下载,如果阿里云仓库没有,才会去docker.hub中下载,提高我们的下载速度。(与maven仓库同理)

5、更新yum缓存

为了保证能更新和下载需要的服务:如docker

输入命令并且更新成功命令

sudo yum makecache fast

image-20220817125300042

  1. 我们在更新 yum 源或者出现配置yum源之后,通常都会使用 yum makecache 生成缓存,这个命令是将软件包信息提前在本地缓存一份,用来提高搜索安装软件的速度
  2. 如果觉得占用磁盘空间,可以使用yum clean指令清除缓存:【yum clean all】

3.2、安装Docker

1、安装Docker

安装Docker,Docker版本分为:CE(社区免费版)和EE(企业版,安全CE)

命令如下:

sudo yum -y install docker-ce

image-20220817130021360

image-20220817130040231

开始下载并安装Docker,稍等一会,系统正在下载

看到complete,表示下载安装成功了

2、启动Docker

如下命令启动Docker:

sudo systemctl start docker

查看Docker是否成功,输入命令:

docker info

image-20220817130155956

我们可以看到Docker已经安装成功且容器与镜像数都为0,是一个全新的docker服务

至此,我们Docker安装成功了

3、开机启动Docker

如下命令可以设置Docker随着Linux开机而启动

sudo systemctl enable docker

image-20220817130339861

4、移除Docker-ce服务

sudo yum remove docker-ce

5、删除Docker依赖项

sudo rm -rf /var/lib/docker

4、Docker常用命令

docker search 镜像名称 //搜索镜像
docker pull 镜像名称:版本号 //拉取对应版本的镜像
docker pull 镜像名称 //默认拉取最新的镜像
docker images //查看本地已下载的镜像
docker ps //查看正在运行的容器
docker ps -a //查看所有的容器(包括run、stop、exited状态的)
docker container ls //查看正在运行的容器
docker rm 容器ID //只能删除没有在运行的容器
docker rm -f 容器ID //可以删除正在运行的容器
docker run -p 本地主机端口号:容器服务端口号 --name 容器名字 [-e 配置信息修改] -d 镜像名字
docker start 容器ID //启动容器
docker stop 容器ID //终止容器
docker rmi 镜像名称orID //删除镜像
docker rmi 镜像名称orI --force //强制删除镜像

4.1、停止与启动容器

停止正在运行的容器:docker stop 容器名/容器id

启动已运行过的容器:docker start 容器名/容器id

4.2、文件拷贝

如果我们需要将文件拷贝到容器内可以使用cp命令

docker cp 需要拷贝的文件或目录容器名称:容器目录

也可以将文件从容器内拷贝出来

docker cp 容器名称:容器目录需要拷贝的文件或目录  
docker cp /1.txt redis:/  #把linux中的/1.txt文件,拷贝到redis容器中的 / 根目录  docker cp redis:/2.txt /  #把redis容器中的 /2.txt ,拷贝到 linux的 / 根目录  

4.3、目录挂载

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。

创建容器 添加-v参数 后边为 宿主机目录:容器目录

docker run -di -v  /usr/local/myhtml:/usr/local/myhtml --name=mycentos2 centos:7  

如果你共享的是多级的目录,可能会出现权限不足的提示:permission denied

这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数–privileged=true来解决挂载的目录没有权限的问题

4.4、查看容器IP地址

我们可以通过以下命令查看容器运行的各种数据

docker inspect mycentos2

也可以直接执行下面的命令直接输出IP地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos2  

4.5、删除容器

删除指定的容器:docker rm 容器名/容器ID

注意,只能删除停止的容器

删除所有容器:

docker rm docker ps -a -q

4.6、登录容器

我们先查看一下正在运行的容器:

image-20220817134633458

目前有JDK和MySQL都在运行,接着看

1、使用attach进入容器

docker attach 53

其中的 “53” 指的是什么呢?

我们启动的Java镜像的容器ID是“53d4afb331e4”,所以, docker attach 命令后面,你可以指定容器ID来进入具体的容器。可以指定53、53d4、53d4afb等任意长度的值,都代表了当前的java容器

效果如下图:

image-20220817134812916

除了使用容器ID进入容器之外,也可以使用容器的别名进入容器:

docker attach java

2、使用exec命令进入容器

通过容器别名进入容器:

docker exec -it java /bin/bash

通过容器ID进入容器:

docker exec -it 53 /bin/bash

进入容器后,可以查看Java的版本信息,如下图所示:

image-20220817135133156

5、Docker安装常用软件

5.1、安装 MySQL

首先在Docker仓库中搜索一下MySQL,命令如下:

docker search mysql

结果:

image-20220817131106040

我们这里安装MySQL8.0 的,命令如下:

docker pull mysql:8.0
docker pull mysql //默认拉取最新版本

image-20220817131411527

下载中,稍等一会

image-20220817131807840

查看本地仓库镜像是否下载成功

docker images mysql:8.0

image-20220817131837427

运行MySQL8.0容器:

docker run -p 3307:3306 --name mysql8.0 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0

参数说明:
-p 将本地主机的端口映射到docker容器端口(因为本机的3306端口已被其它版本占用,所以使用3307)
--name 容器名称命名
-e 配置信息,配置root密码
-d 镜像名称

image-20220817132116197

查看mysql8.0容器运行情况

docker ps

image-20220817132150102

docker登录mysql

docker exec -it mysql8.0 bash
mysql -uroot -p

image-20220817132313792

然后输入密码root就可以登录成功了

接下来,我们用本地的【Navicat Premium 15】工具来连接这个数据库试试:

image-20220817132526316

查询版本号:

select version();

结果:

image-20220817132617111

5.2、安装JDK

命令:

docker pull primetoninc/jdk:1.8

image-20220817132808164

安装完成:

image-20220817133111784

启动JAVA镜像容器:

docker run -d -it --name java primetoninc/jdk:1.8

参数说明:
run:启动一个镜像容器
-d:指定容器运行于后台
-it:-i 和 -t 的缩写;
    -i:以交互模式运行容器,通常与 -t 同时使用
    -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name:第一个“java”是为容器指定了一个别名,而第二个“java”指的是下载镜像时的名称

image-20220817134114984

看下是否安装成功:

java -versrion

image-20220817134134735

搞定,安装成功了

6、Docker中部署jar包运行

6.1、准备一个jar包

我这里顺便写了一个SpringBoot项目,里面什么都没有,只有一个定时任务,每隔两秒打印一句话而已:

pom依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.wujiangbo</groupId>
    <artifactId>DockerDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--1、引入SpringBoot-->
    <parent>
        <groupId> org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>

    <dependencies>

        <!--web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.5.RELEASE</version>
                <configuration>
                    <!--自己手动导入的jar包也需要打包-->
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.4</version>
                <configuration>
                    <!--测试包下的代码出错不影响项目的编译-->
                    <testFailureIgnore>true</testFailureIgnore>
                    <!--跳过测试包代码-->
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>

        <finalName>dockerDemo</finalName>
    </build>

</project>

启动类:

package cn.wujiangbo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class App {

    public static void main(String[] args){
        SpringApplication.run(App.class, args);
    }

}

定时任务:

package cn.wujiangbo.task;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;

@Component
public class TestTask {

    @Scheduled(fixedRate = 2000)
    public void test(){
        System.out.println("定时任务:每隔两秒执行一次" + new Date());
    }
}

没有yml配置文件

windows本地启动时可以出来效果的,如下图所示:

image-20220817140703600

6.2、创建DockerFile文件

在Linux的opt目录中新建dockerTest文件夹,如下:(opt目录自己任意选择,我这里以opt目录为例)

image-20220817141402886

然后利用工具将我们准备好的jar包传到该目录:

image-20220817141530327

OK,目前jar包已经上传完成了,接下来在该目录中,新建DockerFile文件,内容如下:(我这里是本地新建DockerFile编辑好内容后上传到)

# jdk 是一个已有的包含 jdk 的镜像
 FROM java
 
#  作者签名
 MAINTAINER wujiangbo
 
#  简化 jar 的名字路径
 COPY dockerDemo.jar /app.jar
 
#  执行 java -jar 命令 (CMD:在启动容器时才执行此行。RUN:构建镜像时就执行此行)
 CMD java -jar /app.jar
 
#  设置对外端口为 8080
 EXPOSE 8080

然后将【DockerFile】文件上传到【dockerTest】目录中,结果如下:

image-20220817141912690

6.3、生成镜像

生成本工程的镜像:

docker build -t docker_test:docker_demo -f /opt/dockerTest/Dockerfile /opt/dockerTest

生成成功,然后使用【docker images】命令查看了所有的镜像,果然有docker这个镜像了

image-20220817144501073

6.4、启动镜像

docker run --name dockerApp -p 8080:8080 -d 28dae64bba9d

image-20220817145228212

从上面执行结果可以看出,镜像已经启动了

6.5、启动容器

docker start cc7c3a1582d0

查看正在运行的容器:

image-20220817145520454

6.6、运行效果查看

上面我们将容器已经启动了,那么怎么看我们那个jar包的运行结果了?

现在我们只需要进入到容器中就可以了:

docker attach cc7c3a1582d0

结果:

image-20220817150420676

说明已经成功的运行jar包了

接下来我们关闭容器试试:

docker stop cc7c3a1582d0

image-20220817150545694

另外一个一直做打印的窗口就立马停止打印了:

image-20220817150616236

测试成功,jar包可以正常的启动和停止了

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

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

相关文章

奇怪的知识——Windows下怎么修改进程的名称?

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;无尽的折腾后&#xff0c;终于又回到…

element-plus的form表单form-item的prop怎么写才能正确校验,实现逻辑是怎么样的?

不管是element-plus还是上一个版本的element-ui&#xff0c;都是一个使用很广泛的基于csshtmljs的ui组件库&#xff0c;它的form表单自带强大的校验功能&#xff0c;form-item的prop怎么写才正确&#xff0c;实现逻辑是怎么样的&#xff1f;element-plus的form表单的model、for…

聚观早报 | 苹果市值跌破2万亿美元大关;卢伟冰晋升小米集团总裁

今日要闻&#xff1a;苹果市值跌破2万亿美元大关&#xff1b;卢伟冰晋升小米集团总裁&#xff1b;京东方拿下iPhone 15订单&#xff1b;英伟达与富士康达成合作&#xff1b;哪吒汽车旗下车型价格调整苹果市值跌破2万亿美元大关 1 月 4 日消息&#xff0c;据国外媒体报道&#x…

C51单片机连接wifi模块,发送AT指令

一、AT指令AT 指令集是从终端设备&#xff08; Terminal Equipment &#xff0c; TE) 或 数据终端设备 &#xff08; Data TerminalEquipment &#xff0c; DTE) 向终端适配器 (Terminal Adapter &#xff0c; TA) 或 数据电路终端设备 (Data CircuitTerminal Equipment &#…

CDGA|企业数字化转型进展得越快就越好吗?

数据治理并不是一件简单的事情。即使是行业知名公司&#xff0c;在高度重视和确保投入的情况下&#xff0c;完成全公司“数据底座”/“数据中台”的所耗时间也往往以年计。并且&#xff0c;还需要注意到&#xff0c;数据规范只是数字化转型的一个维度而已&#xff1a; 在国标《…

SQL INSERT INTO 语句

INSERT INTO 语句用于向表中插入新记录。 SQL INSERT INTO 语句 INSERT INTO 语句用于向表中插入新记录。 SQL INSERT INTO 语法 INSERT INTO 语句可以有两种编写形式。 第一种形式无需指定要插入数据的列名&#xff0c;只需提供被插入的值即可&#xff1a; INSERT INTO t…

Python爬虫常用哪些库?

经常游弋在互联网爬虫行业的程序员来说&#xff0c;如何快速的实现程序自动化&#xff0c;高效化都是自身技术的一种沉淀的结果&#xff0c;那么使用Python爬虫都会需要那些数据库支持&#xff1f;下文就是有关于我经常使用的库的一些见解。 请求库&#xff1a; 1、urllib&a…

matlab复杂函数多元函数拟合

简介 本文介绍了基于matlab实现的复杂函数以及多元函数的拟合。在工程和研究中偶尔会遇到要用一个非常复杂的数学公式来拟合实验测量数据&#xff0c;对这些复杂的数学公式拟合时&#xff0c;采用常见的拟合方法往往会失败&#xff0c;或者得不到足够精确的结果。本文以笔者多…

AVL树:高度平衡的二叉搜索树

AVL树 AVL树和BST树的联系   答&#xff1a;BST树&#xff08;二叉排序树&#xff09;当节点的数据key有序时是一棵单支树&#xff0c;查找时效率直接降低到O(N)而不是树高&#xff0c;为了使树尽量两边均匀&#xff0c;设计出了AVL树&#xff0c;AVL树的左右高度差不超过1。…

sql语句练习题1

1、选择部门30中的所有员工&#xff1b; 要注意到查的是所有员工 代码如下&#xff1a; mysql> select * from emp where deptno 30;2、列出所有办事员(CLERK)的姓名&#xff0c;编号和部门编号&#xff1b; 注意的是要查的是姓名&#xff0c;编号和部门编号 范围限定的是…

并发编程的原子性 != 事务ACID的原子性

△Hollis, 一个对Coding有着独特追求的人△这是Hollis的第 412 篇原创分享作者 l Hollis来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09;关于原子性&#xff0c;很多人在多个地方都听说过&#xff0c;大家也都背的很熟悉。在事务的ACID中&#xff0c;有原子性…

儒家思想和道家思想的三个主要差异

孔子、孟子、老子、庄子&#xff0c;这四位古代思想家被称为“中国四哲”&#xff0c;他们分别代表了儒家和道家思想。这两大思想流派&#xff0c;是数千年来中国人智慧的结晶和文化的瑰宝。01先秦儒家思想的发展&#xff0c;经过了三个阶段&#xff0c;第一阶段是孔子&#xf…

CHAPTER 7 Ansible playbook(四)

ansible-playbook7.1 roles&#xff08;角色&#xff09;7.1.1 Ansible Roles 介绍7.1.2 Roles结构7.1.3 存储和查找角色7.1.4 制作一个Role7.1.5 使用角色7.1.5.1 经典方法7.1.5.2 import_role7.1.6 如何使用Galaxy7.1 roles&#xff08;角色&#xff09; 7.1.1 Ansible Role…

windows docker安装prometheus和grafana

文章目录docker安装prometheusdocker安装grafanawindows安装windows_exporterprometheus配置新增windows_exporter的job,配置grafana导入windows模板即可出现酷炫大屏出现酷炫画面完成docker安装prometheus 拉取镜像,在D盘下创建prometheus.yml配置文件,映射到docker里面d:/se…

【pandas】教程:8-如何组合多个表格的数据

Pandas 组合多个表格的数据 本节使用的数据为 data/air_quality_no2_long.csv&#xff0c;链接为 pandas案例和教程所使用的数据-机器学习文档类资源-CSDN文库 导入数据 NO2NO_2NO2​ import pandas as pd air_quality_no2 pd.read_csv("data/air_quality_no2_long.cs…

二、python编程进阶02:模块和包

目录 1. python中的模块是什么 2. 导入模块: 学习import语句 2.1 import语句介绍 2.2 import导入模块的语法 2.3 导入自己的模块 2.4 导入数字开头或者带空格的模块 3. 编写自定义模块 3.1 给自定义模块编写测试代码 3.2 给自定义模块模块编写说明文档 4. 模块的搜索…

1215. 小朋友排队(树状数组应用 -- 逆序对个数)

题目如下&#xff1a; 思路 or 题解 我们可以得出交换的次数 > 逆序对个数 kkk 我们可以发现 所有 位置 左边大于它的个数 右边小于它的个数和 kik_iki​ 等于 k∗2k*2k∗2 我们可以简单证明出(感觉出)&#xff1a;答案就是 ∑1n(1ki)∗ki2\sum^n_1 \frac{(1 k_i) * k_i}…

JavaScript 错误

文章目录JavaScript 错误 - throw、try 和 catchJavaScript 错误JavaScript 抛出&#xff08;throw&#xff09;错误JavaScript try 和 catchThrow 语句实例实例JavaScript 错误 - throw、try 和 catch try 语句测试代码块的错误。 catch 语句处理错误。 throw 语句创建自定义错…

string的使用介绍

目录 标准库中的string类 string类(了解) 编码介绍 string类的常用接口说明 Member functions 测试一&#xff1a;创建对象 测试二&#xff1a;遍历字符串 Iterators 测试三&#xff1a;反向迭代器(Iterators) Capacity 测试四&#xff1a;容器相关(Capacity) 测试…

Redis企业云如何通过缓存轻松扩展到亿级请求?

你是否在春运抢票过程中遇到12306 APP瘫痪&#xff1f; 你是否在双十一抢好物的时候显示系统繁忙&#xff1f; 你是否在微博刷某个爆了的娱乐新闻时显示页面走丢了&#xff1f; 前几天热搜上好像又说小红书又崩溃了&#xff1f; 当用户请求量过高&#xff0c;数据库无法支撑时&…