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

docker 入门篇

docker为什么会出现?

一款产品:开发---->运维,两套环境!应用环境,应用配置!
常见问题:我的电脑可以运行,版本更新,导致服务不可用。
环境配置十分的麻烦,每个机器都需要部署环境(redis集群,es等。。。。)。
不能跨平台。
发布项目(jar+mysql+redis。。。),项目能不能带上环境去发布。
传统:开发jar,运维来做!
现在:开发打包部署上线,一套流程。

以上问题,docker提出解决方法。
java —>jar(环境)---->(打包项目带上环境)镜像---->(docker)---->下载镜像---->运行。
docker的核心思想:隔离,打包装箱,每个箱子互相隔离

文档:https://docs.docker.com/
仓库:https://hub.docker.com/

Docker的优点如下:
1、简化程序:Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,使开发者可以直接将自己的成果放入Docker中进行管理。
2、节省开支

docker能干嘛

之前的虚拟机技术

在这里插入图片描述

缺点:

  1. 资源占用多
  2. 冗余步骤多
  3. 启动慢

容器化技术

在这里插入图片描述
与传统的虚拟机不同:

  • 传统的虚拟机:运行一个完成的操作系统,在这个系统中安装和运行。
  • 容器化:应用直接运行在宿主机的内核上,容器自己没有内核, 每个容器间,相互隔离,互不影响。

docker的组成

在这里插入图片描述

  • 镜像(Images): docker镜像相当于模板(对象),通过镜像来创建容器。镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。
  • 容器(Containers): docker镜像相当于(对象的实例化),独立运行一个或一组应用,服务最终运行在容器里面。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器运行时,以镜像为基础层,在其上创建一个当前容器的存储层,这个为容器运行时读写而准备的存储层为容器存储层。容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。
  • 仓库(Registry): 存放镜像的地方。
    在这里插入图片描述

docker是怎么工作的?

docker是一个client-server的服务,docker的守护进程运行在主机上,通过socket从客户端访问。docker-server是接受docker-client的指令。
在这里插入图片描述

docker为什么比vm快?

  • docker有着比虚拟机更少的抽象层;
  • docker利用的是宿主机的内核,vm需要的是Guest OS
    在这里插入图片描述
    所以运行容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核。

docker常用指令

万能指令

docker version   # 版本信息
docker info        # 系统信息,镜像和容器数
docker --help     # 帮助指令

帮助文档:https://docs.docker.com/engine/reference/commandline/

镜像命令

docker image [选项] 显示本地镜像

  • -a --all 显示所有镜像
  • -q --quit 只显示id

在这里插入图片描述REPOSITORY : 镜像仓库源>
TAG:标签
IMAGE ID:镜像id
CREATED:创建时间
SIZE:大小 选项

搜索镜像 docker search 镜像名 [选项]

  • –filter=STARS=3000 搜索出来的命令大于3000

  • NAME:镜像仓库名称。
  • DESCRIPTION:镜像仓库描述。
  • STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,ars0
  • OFFICAL:表示是否为官方仓库,该列标记为[0K]的镜像均由各软件的官方项目组创建和维护。
  • AUTOMATED:表示是否是自动构建的镜像仓库。

拉取镜像 docker pull 镜像名[:tag]

[root@Centos7 /]# docker pull mysql
Using default tag: latest                          #  不写tag,默认最新
latest: Pulling from library/mysql
d67a603b911a: Pull complete               #分层下载 docker image 核心 联合系统
0cf69c8f1492: Pull complete
a5ee239a0d3a: Pull complete
0f166cb3e327: Pull complete
882d294bf188: Pull complete
2649fc7eb806: Pull complete
bddb3394e2e3: Pull complete
93c83d9a2206: Pull complete
99d7f45787c0: Pull complete
234663a2e3ee: Pull complete
74531487bb7b: Pull complete
Digest: sha256:d4055451e7f42869e64089a60d1abc9e66eccde2910629f0dd666b53a5f230d8    #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest     # 真实地址


  • docker rmi -f 镜像名/镜像id 删除镜像
    • 删除所有 docker rmi -f $(docker images -q) 删除所有镜像。

骚操作:

  • docker image prune #删除没有使用的镜像
  • docker image inspect #显示一个或多个镜像的元数据

构建镜像 docker build

  • -f #通过什么文件来构建,后面接构建文件的地址
  • -t #生成文件的版本

容器命令

说明:有对象才可以实例化,有了对象才可以创建容器。

启动和停止容器

docker start 容器id	#启动容器
docker restart 容器id	#重启容器
docker stop 容器id	#停止当前正在运行的容器
docker kill 容器id	#强制停止当前容器

docker container prune 删除所有未使用容器
docker inspect 容器id (可查看容器的ip和基本信息)

新建并启动容器 docker run [可选参数] 镜像id

分析run指令

在这里插入图片描述

–name=“容器名” # 容器名字 区分容器
-d      # 后台运行
-it      # 交互模式,进入容器
-p 主机端口:容器端口      # -p 8000:8000 指定容器端口
-P     # 随机端口
-v 主机目录:容器目录      # 挂在数据卷
–net选项:指定网络模式,该选项有以下可选参数:

  • –net=bridge:默认选项,表示连接到默认的网桥(桥接)。(docker有自己的ip,可以在宿主机上通过curl docker容器ip:端口来访问容器类项目,浏览器上不行,,相当于内网)
    –net=host:容器使用宿主机的网络(和宿主机共用一个网络,比如宿主机:192.168.10.21,docker:192.168.10.1)。
    –net=container:NAME-or-ID:告诉Docker让新建的容器使用已有容器的网络配置。
    –net=none:不配置该容器的网络,用户可自定义网络配置。

例子:
1.docker run -d mysql   #后台启动容器(docker容器使用后台启动,必须有前台进程(比如:进入容器-it,docker发现容器没有应用,会退出)
2. docker run -it -d mysql /bin/bash      #后台启动并进入容器
3.docker run --name=“mysql” -p 3306:3306 -d mysql      #后台启动一个name=mysql,port=3306的容器

查看运行的容器 docker ps [选项] 容器

  • -a     # 查看运行过的容器
  • -n=?   #最近创建的容器

退出容器

  • exec      #直接退出并停止容器
  • ctrl+p+q    #直接退出,但不停止容器

删除停止的容器 docker rm 容id

该命令只能删除已停止的容器,如需删除正在运行的容器,可使用-f参数

  • docker ps -f $(docker ps ‐a -q) # 删除所有容器,包括停止的。

进入容器

  • docker exec -it 容器id /bin/bash      #进入容器打开一个新的终端。
  • docker attach 容器id     # 进入容器正在执行的终端。

容器与宿主机相互复制文件

从容器里面拷文件到宿主机:

  • docker cp 容器id:要拷贝的文件在容器里面的路径 宿主机的相应路径

从宿主机拷文件到容器里面:

  • docker cp 要拷贝的宿主机文件路径 容器id:要拷贝到容器里面对应的路径

其他指令

  • docker logs -tf --tail n 容器id  # 查看尾部n行日志
    • tf 显示日志
    • tail 尾部
  • docker top 容器id   # 查看docker内部的进程信息
  • docker [image/container] inspect 容器id/镜像id   # 查看容器或者镜像元数据
  • docker volume --help  #查看一下卷的帮助文档
  • docker volume ls # 查看一下所有本地的volume卷

容器可视化面版

方式一

#搜索并下载镜像
docker search portainer
docker pull portainer/portainer
#单机方式运行
docker run -d \
-p 9000:9000 \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock   \
--name Prtainer portainer/portainer

方式二

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/dokcer.sock --privileged=true portainer/portainer

镜像详解

镜像是什么

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境,配置文件等。所有的应用,直接打包docker
镜像,就可以直接运行。

如何得到镜像:

  • 从远程仓库下载
  • 朋友拷贝
  • 自己制作一个Dockerfile

docker镜像加载的原理

我们下载镜像的时候看到是一层层。
UnionFS(联合文件系统):分层,轻量并且高性能的文件系统,它支持文件系统的修改作为一次提交来一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下。Union文件系统时docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次通过加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有的底层的文件和目录

举例:
在这里插入图片描述
比如下载mysql镜像redis镜像,由上图可知,两个镜像都依赖A文件系统。所以下载**mysql镜像**会下载A,B,C文件系统,而下载redis镜像的时候,因为A文件系统已经下载过,不会下载,只会加载D,R文件系统,和已经下载好的文件系统组成redis镜像

docker镜像是一层层的文件系统。
bootfs(boot file system)主要包含bootloaderkernel,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,在docker镜像的最底层就是bootfs。这一层与我们典型的linux系统是一样的,包含加载器和内核。当bootfs加载完成之后整个内核就会存在内存中,此时内存的使用权已由bootfs转交内核,此时系统也会卸载bootfs。(可以理解成系统开机加载的过程)

rootfs(root file system)bootfs之上,包含就是典型的linux系统中的/dev,/proc,/bin,etc等标准目录和文件rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等。
在这里插入图片描述
对于一个精简的os(生成的容器),rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了。因为底层直接用hostkernel(内核),自己只需要提供rootfs就可以了。

docker分层理解

在这里插入图片描述
上面我们说docker镜像由多个文件系统组成,由上图也可知,已经下载的文件系统不会被再次下载。
思考:为什么docker需要采用这样的分层方法?

查看镜像元数据: docker images inspect redis:latest

在这里插入图片描述
所有的docker镜像都起始于一个基础的镜像层,当进行修改或者新增内容时,就会在当前镜像层之上,创建新的镜像层。
举例:基于Ubuntu Linux16.04创建一个新的镜像,这就是新镜像的第一层。如果在镜像中加入python包,就会在基础镜像层之上创建第二个镜像层,如果继续添加一个安全补丁,就会创建第三层镜像层。
在这里插入图片描述

在添加额外的镜像时,镜像始终保持是当前所有镜像的组合。
例如:每个镜像层包含三个文件,这个镜像包含6个文件
在这里插入图片描述

在这里插入图片描述
这种情况下,上层镜像中的文件覆盖了底层镜像中的文件,这样使得文件的更新版本作为一个新的镜像层添加到镜像中。docker通过快照的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
最终表现如下图。
在这里插入图片描述

注意

docker镜像默认都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层就是我们通常说的容器层,容器层之下的都叫镜像层。

容器数据管理

什么是容器数据卷?

docker的理念回顾:将应用和环境打包成一个镜像,如果数据都在容器中,那么当我们容器被删除的时候,数据就会丢失。需求:数据可以持久化。假如MYSQL数据库,如果容器被删除了,那么数据库内的数据就会丢失,因此我们希望:MySQL数据库中的数据可以存储在本地

容器之间可以有一个数据共享的技术,docker容器中产生的数据可以同步到本地。这就是数据卷,目录的挂载:就是将容器内的目录挂载到Linux上面

容器数据卷: 一个或多个容器专门指定绕过 Union File System 的目录,为持续性或共享数据提供一些有用的功能:

  • 数据卷可以在容器间共享和重用;
  • 数据卷数据改变是直接修改的(双向的);
  • 数据卷是持续性的,直到没有容器使用它们;

挂在容器卷方式

一: docker run -v

  • 第一步:docker run -v 主机目录:容器目录

例如:docker run -it -v /home/ceshi:/home centos /bin/bash

在这里插入图片描述
做完以上的操作,这个时候我们在容器内对/home目录下的操作会被同步到Linux/home/ceshi目录下。

  • 第二步:当容器启动起来的时候,我们在Linux的操作命令窗口处通过 docker inspect 容器id去查看卷的挂载信息。

在这里插入图片描述以上两个目录的数据会进行同步,例如我在主机内的ceshi目录下做一些操作增、删、改等等会同步到docker容器内的home目录下。
注意:容器挂了,可能导致部分数据没有挂在到宿主机目录上。 我就遇到这个问题。

具名挂载和匿名挂载

匿名挂载

通过**-v 容器内路径而没有指定卷名或者指定主机路径的挂载方式。
命令:
docker run -d -P --name nginx02 -v /etc/nginx nginx**

docker volume --help    # 查看一下卷的帮助文档

在这里插入图片描述
分别是:创建卷、查看卷、查看所有的卷、移除卷、移除卷

我们使用以下命令查看一下所有本地的volume卷信息:
命令:docker volume ls
在这里插入图片描述
通过以上我们发现,我们刚刚创建的匿名卷挂载,就是没有给它起名字,这是因为我们在运行的时候只指定了容器内的路径而没有指定容器外的路径和卷名,这里发现,这种就是匿名挂载,我们在**-v只写了容器内的路径**,没有写容器外的路径!

具名挂载

通过**-v 卷名:容器内路径而没有指定主机路径的挂载方式。
命令:
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx**

我们使用以下命令查看一下所有本地的volume卷信息。
命令:docker volume ls
在这里插入图片描述
我们通过**docker volume inspect juming-nginx命令查看一下这个卷的详细信息。
在这里插入图片描述
我们发现所有的docker容器内的卷,在没有指定目录的情况下都是在
/var/lib/docker/volumes/xxxx/_data**。

通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的具名挂载

 # 如何锁定是具名挂载还是匿名挂载,还是指定路径挂载-v  容器内路径                  # 匿名挂载-v  卷名:容器内路径             # 具名挂载-v  /宿主机路径:容器内路径       #指定路径挂载

扩展

# 通过 -v 容器内路径:ro    rw   改变读写权限ro      readonly         # 只读rw     readwrite        # 可读可写# 一旦设置了容器权限,容器对我们挂载出的内容就会有限定了
docker run -d  -p --name  nginx02  -v  juming-nginx:/etc/nginx:ro  nginx
docker run -d  -p --name  nginx02  -v  juming-nginx:/etc/nginx:rw  nginx # ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的。

二:数据卷之初识Dockerfile

Dockerfile就是用来创建docker镜像的构建文件,是一个命令脚本,下面我们来初步体验一下Dockerfile
通过这个脚本可以生成镜像,镜像是一层一层的,脚本也是一个一个的命令,每个命令都是一层(重要)。

  • 第一步:在home目录下创建一个docker-test-volume目录用于存放脚本测试文件。
命令:mkdir docker-test-volume     # 创建一个目录
命令:cd docker-test-volume          # 进入该目录# 创建一个dockerfile文件,名字可以随意,建议Dockerfile
命令:vim Dockerfile01                   # 编写脚本 # 文件中的内容,指令需要大写
FROM  centos                       # 用什么作为基础
VOLUME  ["volume01","volume02"]    # 挂载卷的目录,这里没有指定
CMD echo "-------end-------"       # 生成完之后发一段消息
CMD /bin/bash                      # 生成完之后默认是走的控制台
# 这里的每个命令就是镜像的一层  4层
  • 第二步:构建脚本生成镜像 docker build -f /home/docker-test-volume/dockerfile01 -t oldou/centos:1.0 .
    • -f 通过什么文件来构建,后面接构建文件的地址
    • -t 生成文件的版本

在这里插入图片描述

  • 第三步:启动自己的容器 docker run -it db89686baa5c /bin/bash

  • 第四步:查看一下卷挂载的路径

    • 命令:docker ps # 先查看一下启动的id
    • 命令:docker inspect 启动的id # 根据容器启动的ID查看信息

在这里插入图片描述

  • 第五步:进入这个路径查看一下卷信息,cd /var/lib/docker/volumes/642be56674ca60230a61455cdb8b06e8968ea7dd11236129a906c1cafaa7fe73/_data

在这里插入图片描述

结论:Dockerfile这种方式的使用非常多见,因为我们通常会构建自己的镜像。假如我们构建镜像的时候没有挂载卷,这个时候就需要手动镜像挂载,就需要使用**-v 卷名:容器内路径**。

DockerFile的学习

dockerfile的介绍

Dockerfile是用来构建dokcer镜像的文件,是一个命令参数脚本。
构建步骤∶

  • 编写一个dockerfile文件
  • docker build构建成为一个镜像
  • docker run运行镜像
  • docker push发布镜像(DockerHub、阿里云镜像仓库)

DockerFile 的构建过程

  • 每个保留关键字(指令)都必须是大写字母;
  • 执行顺序是从上往下依次执行;
  • #表示注释;
  • 每一个指令都会创建提交一个新的镜像层,并提交。

在这里插入图片描述

Dockfile的指令

FROM:指定基础镜像,一切都是从这里开始构建;
MAINTAINER:指定维护者信息;
RUN:镜像构建的时候需要运行的命令;
ADD:步骤,添加内容;
WORKDIR:镜像的工作目录;
VOLUME:挂载的目录;
EXPOSE:保留端口配置;
CMD:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代;
ENTRYPOINT:指定这个容器启动的时候要运行的命令,可以追加命令;
ONBUILD:当构建一个被继承,DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令;
COPY:类似ADD,将我们文件拷贝到镜像中;
ENV:构建的时候设置环境变量;
以前的话我们都是用的别人的镜像,现在我们知道了这些指令以后就开始自己来制作一个镜像。

实战:

CMD 和 ENTRYPOINT区别【了解】

CMD: 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT: 指定这个容器启动的时候要运行的命令,可以追加命令。

发布镜像到DockerHub

  • DockerHub地址:https://hub.docker.com/ 需要注册自己的账号。
    在这里插入图片描述

  • 我们在服务器上登录完毕后,就可以提交自己的镜像了,就是一步,如下所示:查看登录命令:docker login --help
    在这里插入图片描述

  • 登录一下:docker login -u 用户名 回车输出密码
    在这里插入图片描述

  • 登录成功之后就开始push我们的镜像到服务器上。首先我们先给镜像改个名字:命令:docker tag 镜像id oldou/diytomcat:1.0
    在这里插入图片描述

  • 接下来便开始上传格式:docker push 作者名/需要上传的镜像名:版本号

  • 登出命令:docker logout

Docker所有流程小结

在这里插入图片描述

在这里插入图片描述

相关文章:

docker 入门篇

docker为什么会出现? 一款产品:开发---->运维,两套环境!应用环境,应用配置! 常见问题:我的电脑可以运行,版本更新,导致服务不可用。 环境配置十分的麻烦,…...

MapReduce的shuffle过程详解

shuffle流程概括 因为频繁的磁盘I/O操作会严重的降低效率,因此“中间结果”不会立马写入磁盘,而是优先存储到Map节点的“环形内存缓冲区”,在写入的过程中进行分区(partition),也就是对于每个键值对来说&a…...

【软件使用】MarkText下载安装与汉化设置 (markdown快捷键收藏)

一、安装与汉化 对版本没要求的可以直接选择 3、免安装的汉化包 1、下载安装MarkText MaxText win64 https://github.com/marktext/marktext/releases/download/v0.17.1/marktext-setup.exe 使用迅雷可以快速下载 2. 配置中文语言包 中文包下载地址:GitHub - chi…...

LeetCode笔记:Biweekly Contest 99

LeetCode笔记:Biweekly Contest 99 1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接:https://leetcode.com/contest/biweekly-contest-99 1. 题目一…...

初探富文本之CRDT协同实例

初探富文本之CRDT协同实例 在前边初探富文本之CRDT协同算法一文中我们探讨了为什么需要协同、分布式的最终一致性理论、偏序集与半格的概念、为什么需要有偏序关系、如何通过数据结构避免冲突、分布式系统如何进行同步调度等等,这些属于完成协同所需要了解的基础知…...

团队死气沉沉?10种玩法激活你的项目团队拥有超强凝聚力

作为项目经理和PMO,以及管理者最头疼的是团队的氛围和凝聚力,经常会发现团队死气沉沉,默不作声,你想尽办法也不能激活团队,也很难凝聚团队。这样的项目团队你很难带领大家去打胜仗,攻克堡垒。但是如何才能避…...

Spring三级缓存核心思想

spring在启动时候&#xff0c;会创建bean&#xff0c;并给bean填充属性&#xff0c;这事会使用到三级缓存 private final Map<String, Object> singletonObjects new ConcurrentHashMap<>(256); //一级缓存private final Map<String, Object> earlySingleto…...

深度学习算法训练和部署流程介绍--让初学者一篇文章彻底理解算法训练和部署流程

目录 1 什么是深度学习算法 2 算法训练 2.1 训练的原理 2.2 名词解释 3 算法C部署 3.1 嵌入式终端板子部署 3.3.1 tpu npu推理 3.3.2 cpu推理 3.2 服务器部署 3.2.1 智能推理 3.2.2 CPU推理 1 什么是深度学习算法 这里不去写复杂的概念&#xff0c;就用通俗的话说…...

计算机网络整理

TCP与UDP 介绍 HTTP&#xff1a;&#xff08;HyperText Transport Protocol&#xff09;是超文本传输协议的缩写&#xff0c;它用于传送WWW方式的数据&#xff0c;关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。 TCP:&#xff08;Transmission Contro…...

闲人闲谈PS之三十八——混合制生产下WBS-BOM价格发布增强

惯例闲话&#xff1a;最近中《三体》的毒很深&#xff0c;可能是电视剧版确实给闲人这种原著粉带来太多的感动&#xff0c;又一次引发了怀旧的热潮&#xff0c;《我的三体-罗辑传》是每天睡前必刷的视频&#xff0c;结尾BGM太燃了。闲人对其中一句台词感触很深——人类不感谢罗…...

Java 根类 Object

java.lang.Object 是 Java 类层次结构中的根类&#xff0c;所有类都直接或间接实现了此类的方法。 Object API 源码 package java.lang;public class Object {private static native void registerNatives();static {registerNatives();}public final native Class<?>…...

04_Apache Pulsar的可视化监控管理、Apache Pulsar的可视化监控部署

1.4.Apache Pulsar的可视化监控管理 1.4.1.Apache Pulsar的可视化监控部署 1.4.Apache Pulsar的可视化监控管理 1.4.1.Apache Pulsar的可视化监控部署 第一步&#xff1a;下载Pulsar-Manager https://archive.apache.org/dist/pulsar/pulsar-manager/pulsar-manager-0.2.0/…...

【算法】期末复盘,酒店住宿问题——勿向思想僵化前进

文章目录前言题目描述卡在哪里代码&#xff08;C&#xff09;前言 省流&#xff1a;一个人也可以住双人间&#xff0c;如果便宜的话。 害&#xff01;尚正值青春年华&#xff0c;黄金岁月&#xff0c;小脑瓜子就已经不灵光咯。好在我在考试的最后一分钟还是成功通过了这题&am…...

Java中的Comparator 与 Comparable详解

Comparator VS Comparable1. Comparator1.1 对一维数组进行排序1.2 对二维数组进行排序1.3 对对象数组进行排序2. Comparable3. 二者区别1. Comparator 通过源码发现Comparator是一个接口。 根据compare方法中的注释可以发现方法返回三种类型的值&#xff0c;正数、零、负数&a…...

计算机科学导论笔记(二)

三、数据存储 3.1 数据类型 计算机行业中使用术语“多媒体”来定义包含数字、文本、音频、图像和视频的信息。 位&#xff1a;bit&#xff0c;binary digit的缩写&#xff0c;是存储在计算机中的最小单位&#xff0c;它是0或1. 位模式&#xff1a;为了表示数据的不同类型&a…...

GEC6818开发板JPG图像显示,科大讯飞离线语音识别包Linux_aitalk_exp1227_1398d7c6运行demo程序,开发板实现录音

GEC6818开发板JPG图像显示 | 开发板实现录音一.GEC6818开发板JPG图像显示1.jpg图片特性2.如何解压缩jpg图片1.对jpegsrc.v8c.tar.gz进行arm移植2.进入~/jpeg-8c对jpeg库进行配置3.编译4.安装&#xff0c;将动态库存放到 /home/gec/armJPegLib5.清空编译记录6.自己查看下 /home/…...

如何判断树莓派通过GPIO与5G模块成功连接?

如果想要判断自己是否成功连接了树莓派与5G模块&#xff0c;可以通过以下方式进行判断&#xff1a; 查看设备连接状态&#xff1a;可以通过在树莓派终端中执行lsusb命令来查看USB设备的连接状态&#xff0c;如果5G模块被识别到&#xff0c;则会显示相关的设备信息。如果提示lsu…...

Java——包装类和List及ArrayList

目录 包装类&#xff08;Wrapped Class) 包装类的使用---装箱和拆箱 自动装箱和自动拆箱 Integer的易错题 javap反编译工具 List接口的使用 方法 ArrayList 使用 打印 区别 扩容机制 ArrayList练习 字符集合 杨辉三角 ​编辑 包装类&#xff08;Wrapped Class) Object 引用可…...

matlab - 程序流程控制、函数文件、特殊函数、调试与优化

学习视频MATLAB代码的两种执行方式&#xff1a;命令行、程序执行。1.程序流程控制1.1.m文件matlab中m文件分为两种&#xff1a;脚本文件&函数文件。脚本文件&#xff1a;实际上是一个命令的集合&#xff0c;可认为是命令行的改良版&#xff0c;方便我们去编写命令函数文件&…...

Toponogov 比较定理及其应用

1. Toponogov 比较定理的背景来源 Victor Andreevich Toponogov&#xff08;1930-2004&#xff09; 是苏联数学家&#xff0c;Toponogov 比较定理是他的博士论文题目&#xff0c;在1958年答辩。他证明这个定理是为了用于证明截面曲率假设下的分裂定理和最大直径定理&#xff0…...

力扣sql简单篇练习(二十二)

力扣sql简单篇练习(二十二) 1 上月播放的儿童适宜电影 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # Write your MySQL query statement belowSELECT titleFROM ContentWHERE kids_contentY AND content_typeMoviesAND c…...

【开源硬件】STM32F030R8T6系统板

【开源硬件】STM32F030R8T6系统板✅STM32F030R8T6系统板兼容极海APM32F030R8T6 &#x1f530;支持stm32cubemx工程配置成STM32F030R8T6生成的MDK工程&#xff0c;经过Keil编译后可以直接使用ST-Link v2烧录器上传到极海APM32F030R8T6芯片当中&#xff0c;完全做到平替使用&…...

ES之DSL查询文档基础查询

分类 query查询分类 总体规律就是逻辑性的&#xff0c;从外层的你干嘛&#xff0c;到下一层的查询类型&#xff0c;再到下一层的查询字段&#xff08;如果需要的话&#xff09;和然后是查询内容 查询所有 语法 get /索引库名/_serarch {"query":{"查询条件…...

数据结构与算法之堆排序

目录堆排序概述代码实现时间复杂度堆排序概述 堆排序&#xff08;Heap Sort&#xff09;是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构&#xff0c;每个结点的值都大于或等于其左右孩子结点的值&#xff0c;称为大顶堆&#xff1b;或者每个结点…...

Vue3 中的模板语法

目录前言一、什么是模板语法&#xff1f;二、内容渲染指令1. v-text2. {{ }} 插值表达式3. v-html三、双向绑定指令1. v-model2. v-model的修饰符四、属性绑定指令1. 动态绑定多个属性值2. 绑定class和style属性五、条件渲染指令1. v-if、v-else-if、v-else2. v-show3. v-if和v…...

Redis十大类型——Hash常见操作

Redis十大类型——Hash常见操作命令操作简列存放及获取获取健值对长度元素查找列出健值对对数字进行操作赋值hsetnx很明显咯它也是以健值对方式存在的&#xff0c;只不过value也就是值&#xff0c;在这里也变成了一组简直对。 &#x1f34a;个&#x1f330;&#xff1a; 想必多…...

Python采集本地二手房,一键知晓上万房源信息

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 所以今天教大家用Python来采集本地房源数据&#xff0c;帮助大家筛选好房。 话不多说&#xff0c;让我们开始愉快的旅程吧~ 更多精彩内容、资源皆可点击文章下方名片获取此处跳转 本文涉及知识点 采集基本流程 requests 发送…...

Ubuntu 18.04 出现GLIBC_2.28 not found的解决方法(亲测有效)

关于/lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.28’ not found出现报错&#xff0c;建议不要使用源码包去编译并升级。在下文有分享一个使用官方的Debian软件包去升级使用的方法。仅供参考&#xff01; 环境 # uname -a Linux Ubuntu 5.4.0-144-generic #161~18.04.…...

Java文档搜索引擎总结

Java文档搜索引擎总结项目介绍项目使用的技术栈前端页面展示后端逻辑部分索引部分搜索模块部分Web模块部分项目介绍 Java文档搜索引擎项目是一个SSM项目&#xff0c;该项目的前端界面部分是由搜索页面和展示页面组成&#xff0c;后端部分索引模块&#xff08;ScanAnalysis、in…...

Linux内核学习笔记——页表的那些事。

目录页表什么时候创建内核页表变化什么时候更新到用户页表源码分析常见问题解答问题一&#xff1a;页表到底是保存在内核空间中还是用户空间中&#xff1f;问题2&#xff1a;页表访问&#xff0c;软件是不是会频繁陷入内核&#xff1f;问题3&#xff1a;内存申请&#xff0c;软…...