深入理解Docker

文章目录

  • 1 Docker理论
    • 1.1 背景知识
    • 1.2 是什么
    • 1.3 Docker基本三要素
    • 1.4 镜像原理
    • 1.5 安装教程
  • 2 Docker常用命令
    • 2.0 防火墙相关命令
    • 2.1 镜像命令
    • 2.2 容器命令
    • 2.3 进阶命令
  • 3. 实战之Docker部署springboot项目
    • 步骤一:Springboot项目配置
      • 1.1 添加docker的maven依赖
      • 1.2 新建Dockfile构建镜像
      • 1.3 执行构建命令
    • 步骤二 启动docker镜像
    • 步骤三:访问测试
    • 坑:镜像无法启动
  • 4. 实战之Dockerfile编写指南

1 Docker理论

1.1 背景知识

​ **传统软件开发与运维痛点:**一款产品从开发到上线,从操作系统到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验。Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装? 也就是说,安装的时候,把原始环境一模一样地复制过来,消除协作编码时“在我的机器上可正常工作,在他人机器上不能运行”的问题。
从而打破之前开发人员只提供代码(代码即应用)的方式,改为提交Docker镜像包括(运行文档、配置环境、运行环境、运行依赖包、操作系统发行环境),即镜像即应用。

1.2 是什么

​ Docker是基于Go语言实现的云开源项目。Docker的主要目标是"Build,Ship and Run Any App,Anywhere",也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP (可以是一个WEB应用或数据库应用等)及其运行环境能够做到“一次封装,到处运行”。

​ Linux容器技术的出现就解决了这样一个问题,而Docker就是在它的基础上发展过来的。将应用运行在Docker容器上面,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署,大大简化了操作。

在这里插入图片描述

与虚拟机的区别?
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在Windows系统里面运行Linux系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。

虚拟机的缺点:
1、资源占用多 2、冗余步骤多 3、启动慢(分钟级别)

在这里插入图片描述

1.3 Docker基本三要素

仓库Repository + 镜像Image + 容器Container

在这里插入图片描述

仓库Repository—>镜像Image(类Person)–>容器Container(对象p1、p2)

  1. 仓库Repository是存放镜像文件的场所,仓库Repository与仓库注册器Registry是有区别的,仓库注册服务器上往往存放多个仓库,每个仓库有多个镜像,每个镜像有不同的标签tag(仓库分为公开仓库public和私有库private,最大的仓库Docker Hub,但由于其服务器在国外,从中拉去镜像速度很慢,国内一般使用的是阿里云、网易云。)
  2. 镜像Image就是从docker Hub仓库拉取到本地的一个只读的模版,镜像Image用来创建容器Container,一个镜像可以创建多个容器
    镜像Image(类)—>容器Container(对象)
  3. Docker本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎image镜像文件。只有通过这个镜像文件才能生成Docker容器(集装箱)。

1.4 镜像原理

在这里插入图片描述

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

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

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

1.5 安装教程

1. Docker官网:https://www.docker.com
2. Docker Hub官网:https://hub.docker.com
3. MAC安装教程:https://docs.docker.com/desktop/install/mac-install/
4. LinuxC安装教程
# 1.移除以前docker相关包
	yum remove docker* 															
# 2.配置yum源
    sudo yum install -y yum-utils
    sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

# 3.安装docker并启动
    sudo yum install -y docker-ce docker-ce-cli containerd.io  					# 安装docker及其组件
    yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7  containerd.io-1.4.6 # 以下是在安装k8s的时候使用,暂时不安装
    systemctl enable docker --now		# 启动docker,并设置开机自启动,首次优先使用该命令
    service docker status				# 查看状态
    service docker start        		# 启动
    service docker stop					# 停止

# 4.配置加速
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2"
    }
    EOF

    sudo systemctl daemon-reload
    sudo systemctl restart docker

2 Docker常用命令

2.0 防火墙相关命令

sudo firewall-cmd --list-all --zone=public                         # 查看防火墙对外提供访问的接口
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent      # 开放TCP端口80(HTTP)
sudo firewall-cmd --zone=public --remove-port=80/tcp --permanent   # 关闭TCP端口80(HTTP
sudo firewall-cmd --permanent --query-port=80/tcp                  # 查看端口是否开启
service firewalld status
service firewalld stop
service firewalld start
service firewalld restart

2.1 镜像命令

1 帮助命令:
	docker version
	docker info
	docker --help

2 镜像命令:
	1、列出本地镜像:docker images [-options]
		-a:列出本地所有镜像
		-q:只显示镜像ID
		--digests:显示镜像的摘要信息
		--no-trunc:显示完整的镜像信息
		docker images -a
		docker images -q
	2、查询DockerHub镜像:docker search [-options] 镜像名
		docker search tomcat:列出tomcat的镜像
		docker search --no-trunc tomcat:显示完整的镜像描述
	3、下载镜像到本机:docker pull 镜像名
        docker pull tomcat   		下载最新镜像tomcat,等同于docker pull tomcat:latest
        docker pull redis:6.2.4 	下载指定版本镜像
	4、删除本机镜像:docker rmi -f 镜像名/镜像id
		docker rmi [-f] tomcat

在这里插入图片描述

2.2 容器命令

容器命令:有镜像才能实例化容器(提前下载一个centos镜像仅有200MB)
	1、新建并启动一个容器:docker run [-options] 具体镜像名称:版本号 /bin/bash:
		--name:容器的新别名
		-i:以交互方式启动容器,通常与-t同时使用
		-t:为容器分配一个伪输入终端
		-d:以守护进程方式启动容器

以交互方式启动容器(为主):前台启动
		docker run –it --name my-centos centos:7 /bin/bash
以守护进程方式启动容器:运行在后台
		docker run -d --name=mynginx --restart=always -p 88:80 nginx

	2、列出所有正在运行的容器: docker ps [-options] 
        -l:显示最近创建的容器
        -n 2:显示最近2个创建的容器
        -a:显示当前多元的正在运行的容器+历史上运行过的
        -q:静默模式,只显示容器编号
        --no-trunc:不截断输出显示
    
    3、退出容器
        exit:			在容器内,关闭该容器并推出
        ctrl+P+Q: 在容器内,关闭该容器但是不推出
	
    4、停止容器				docker stop 容器名称或容器id
    5、强制停止容器		   docker kill容器名称或容器id
    6、重启容器	 			docker restart 容器名称或容器id
    7、删除容器				docker rm 容器名称或容器id
    8、查看容器日志		   docker logs [-options] 容器名称或容器id
    	docker logs -f 3063af3e3f86    

2.3 进阶命令

1、进容器内部
	docker exec -it 容器id  /bin/bash  # 在新的容器中打开新的命令终端,可以启动新的进程
2、挂载数据到外部修改
	docker run --name=mynginx \ 
	-d --restart=always \
	-p  88:80 \
	-v /data/html:/usr/share/nginx/html:ro \ # 修改页面只需要去主机的 /data/html
	nginx:latest 
3、镜像分享方案一
    docker save -o mynginx.tar nginx # 将镜像保存成压缩包
    docker load -i abc.tar 			 # 别的机器将压缩包加载为镜像
4、镜像分享方案二【需要docker hub账号】
	docker commit -m "首页变化" 341d81f7504f guignginx:v1.0  # 将自己修改好的镜像提交
	在docker hub 注册仓库
	docker tag guignginx:v1.0 leifengyang/guignginx:v1.0 	# 把旧镜像的名字,改成仓库要求的新版名字
	docker login  							# 登录到docker hub
	docker push leifengyang/guignginx:v1.0  # 推送
	docker logout 							# 推送完成镜像后退出
	docker pull leifengyang/guignginx:v1.0  # 别的机器下载
5、查看容器运行情况
	docker top 容器名称或容器id   # 查看容器内运行的进程
	docker inspect 容器名称或容器id # 查看容器内部细节
	docker attach 容器名称或容器id # 进入正在运行的容器并以命令行交互, 不会启动新的进程
6、从容器内拷贝文件到主机上:		
	docker cp 容器id: 容器路径 目的主机路径

在这里插入图片描述

3. 实战之Docker部署springboot项目

需求:

  1. 手动部署:本地IDE打包成jar,在docker环境中创建java环境容器,将jar包使用命令行拷贝至docker容器中,启动。
  2. 自动部署:通过Maven插件配置参数自动部署。(优先选这个)

步骤一:Springboot项目配置

1.1 添加docker的maven依赖

		<plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.2</version>
                <configuration>
                    <imageName>docker/${project.artifactId}</imageName> <!-- 镜像名称  -->
                    <dockerDirectory>src/main/docker</dockerDirectory>  <!-- Dockerfile文件存放目录:后续改为项目根目录,后续Dockfile文件一定要放在这 -->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>

            <!--这个插件,可以将应用打包成一个可执行的jar包-->
  					<!--千万不能丢掉,不然web项目没有main入口-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.5.2</version>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>

1.2 新建Dockfile构建镜像

# 基于openjdk 镜像,如果镜像不是本地的会从 DockerHub 进行下载
FROM openjdk:8

# VOLUME 指向了一个/tmp的目录,由于 SpringBoot使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。
# 这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
VOLUME /tmp

# 作者
MAINTAINER zhupeng

# 将本地JAR包打包到容器中,并重命名
ADD springboot-1.0-SNAPSHOT.jar app.jar

# 声明需要暴露的端口 在Dockerfile中声明了那些端口是需要开放的,在构建容器时通过-p可以随机映射端口,如果EXPOSE没有指定端口,那么使用-p参数无效。本配置只是声明,一般我们需要在构建docker容器时使用-p(小写的p)指定开放的端口。
EXPOSE 8080

# 配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","app.jar"]

1.3 执行构建命令

mvn clean package -Dmaven.test.skip=true docker:build # 前提要有docker环境

PS:如果还win执行mvn指令:mvn clean package ‘-Dmaven.test.skip=true’

在这里插入图片描述

步骤二 启动docker镜像

 docker images -a
 docker run -d --name my-springboot -p 8080:8080 docker/springboot-multipart [务必指定暴露端口]
 
 docker ps -a
 docker logs -f 976e5ee13513ed3

在这里插入图片描述

步骤三:访问测试

http://10.1.42.71:8080/test/show

在这里插入图片描述

坑:镜像无法启动

如果没连接数据库的话,是可以正常启动的,但是如果application.yml连接了数据库,那就会无法启动。

Host '10.1.42.71' is not allowed to connect to this MySQL server" MySQL不允许远程登录

解决方案:
1. update user set host = '%' where user = 'root'; 会警告报错
2. UPDATE `mysql`.`user` SET `Host` = '%' WHERE (`Host` = 'localhost') and (`User` = 'root');
   或者手动改

use mysql;
Select user from mysql.user; MySQL 服务器中所有用户的列表
mysql -u root -h 10.1.42.71 -p: MySQL远程登录

4. 实战之Dockerfile编写指南

https://zhuanlan.zhihu.com/p/143109114

Dockerfile中文名叫镜像描述文件,是一个包含用于组合镜像目录的文本文档,也可以叫“脚本”。他通过读取Dockerfile中的指令安装步骤自动生成镜像。

补充:文件名称必须是:Dockerfile

基础命令

# 1. FROM
# 制作基础镜像:基于openjdk 镜像
FROM openjdk:8

# 2. MAINTAINER
# 谁创造了它(作者信息)
MAINTAINER zhupeng

# 3. WORKDIR
# 类似于Linux中的cd命令:cd高级的地方在于,若发现没有这个目录,就自动创建出来,建议使用绝对路径
WORKDIR /usr/local/testdir

# 4.COPY
# 文件拷贝
# 案例一:将1.txt拷贝到根目录下。它不仅仅能拷贝单个文件,还支持Go语言风格的通配符,比如如下:
COPY 1.txt /
# 案例二:拷贝所有 abc 开头的文件到testdir目录下
COPY abc* /testdir/
# 案例三:? 是单个字符的占位符,比如匹配文件 abc1.log
COPY abc?.log /testdir/

# 5.ADD
# 往它肚子里放点文件(会自动解压)
ADD springboot-1.0-SNAPSHOT.jar app.jar
# 案例一:将1.txt拷贝到根目录的abc目录下。若/abc不存在,则会自动创建
ADD 1.txt /abc
# 案例二:将test.tar.gz解压缩然后将解压缩的内容拷贝到/home/work/test
ADD test.tar.gz /home/work/test
# docker官方建议当要从远程复制文件时,尽量用curl/wget命令来代替ADD。因为用ADD的时候会创建更多的镜像层。镜像层的size也大。

# ADD/COPY对比
# 1.二者都是只复制目录中的文件,而不包含目录本身。
# 2.COPY能干的事ADD都能干,甚至还有附加功能。
# 3.ADD可以支持拷贝的时候顺带解压缩文件,以及添加远程文件(不在本宿主机上的文件)
# 4.只是文件拷贝的话可以用COPY,有额外操作可以用ADD代替。


# 6.ENV
# 设置环境常量,方便下文引用
ENV JAVA_HOME /usr/local/jdk1.8
RUN ${JAVA_HOME}/bin/java -jar xxx.jar

# 7.RUN
# RUN指令是在构建镜像时运行,在构建时能修改镜像内部的文件[docker::build]
# SHELL命令格式:RUN yum -y install vim
# EXEC命令格式:	RUN ["yum","-y","install","vim"]

# SHELL:当前shell是父进程,生成一个子shell进程去执行脚本,脚本执行完后退出子shell进程,回到当前父进程。
# EXEC:用EXEC进程替换当前进程,并且保持PID不变,执行完毕后直接退出,不会退回原来的进程。
# 总结:也就是说shell会创建子进程执行,EXEC不会创建子进程。推荐EXEC命令格式

# 8.CMD
# 1.容器启动时执行,而不是镜像构建时执行[docker run]
# 2.Dockerfile中只有最后一个ENTRYPOINT会被执行,推荐用EXEC格式。
# 3.重点在于如果容器启动的时候有其他额外的附加指令,则CMD指令不生效。

# 9.ENTRYPOINT
# 容器创建时执行,而不是镜像构建时执行。
# Dockerfile中只有最后一个ENTRYPOINT会被执行,推荐用EXEC格式。
ENTRYPOINT ["java","-jar","app.jar"]

# 给我一个存放行李的地方(目录挂载):将本地文件夹挂载到当前容器
VOLUME /tmp

# 声明需要暴露的端口
EXPOSE 8080

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue项目中使用antvX6新手教程,附demo案例讲解(可拖拽流程图、网络拓扑图)

前言&#xff1a; 之前分别做了vue2和vue3项目里的网络拓扑图功能&#xff0c;发现对antv X6的讲解博客比较少&#xff0c;最近终于得闲码一篇了&#xff01; 需求&#xff1a; 用户可以自己拖拽节点&#xff0c;节点之间可以随意连线&#xff0c;保存拓扑图数据后传给后端&…

力扣61:旋转链表

题目 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2输出&#xff1a;[4,5,1,2,3] 示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4输出&#xff1a;…

【硬件相关】Mellanox网络配置及参数优化

文章目录 一、前言1、硬件配置2、网卡信息 二、驱动安装1、驱动介绍2、软件架构2.1、mlx4 VPI Driver2.2、mlx5 Driver 3、驱动安装3.1、常规安装3.2、驱动编译方法一方法二 4、RDMA配置 三、交换机配置四、mlnx-tools管理工具1、软件安装2、软件使用ibdev2netdeva、说明b、用法…

【MySQL系列】在 MacOS 上安装 MySQL

在 MacOS 上有两种方式安装 MySQL 服务器&#xff1a;通过 brew 安装和通过安装包安装。 文章目录 1、通过 brew 安装 MySQL1.1、安装 MySQL1.2、启动 MySQL 服务器1.3、配置 MySQL 服务器1.4、MySQL 服务器管理命令 2、通过安装包安装 MySQL2.1、下载安装包2.2、安装 MySQL2.3…

Vue3:使用 Composition API 不需要 Pinia

在 Vue.js 开发的动态环境中&#xff0c;在单个组件中处理复杂的业务逻辑可能会导致笨重的文件和维护噩梦。虽然 Pinia 提供集中式状态管理&#xff0c;但仅依赖它来处理复杂的业务逻辑可能会导致代码混乱。本文探讨了使用 Composition API 的替代方法&#xff0c;说明开发人员…

mysql学习笔记5——对表的修改操作

对表的列进行操作 对表可以进行创建create与删除drop&#xff0c;同时可以对表进行修改alter 修改字段 添加字段 删除具体的某一列 添加列时可以指定添加位置 对表的数据进行操作 select查询操作可以指定查询条件 删除具体数据&#xff08;而非删除表中某一列某一行&#xf…

【重要公告】对BSV警报系统AS的释义

​​发表时间&#xff1a;2024年2月15日 由BSV区块链协会开发并管理的BSV警报系统&#xff08;Alert System&#xff0c;以下简称“AS”&#xff09;是BSV网络的重要组件。它是一个复杂的系统&#xff0c;主要职能是在BSV区块链网络内发布信息。这些信息通常与网络访问规则NAR相…

ChatGPT论文指南|ChatGPT如何助力论文中的数据分析!【建议收藏】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼&#xff1a; ChatGPT论文指南|ChatGPT如何助力论文中的数据分析&#xff01;【建议收藏】 小编在之前的论文写作流程中&#xff0c;介绍了大量论文文字工作&#xff…

VUE引入高德地图区域划分district结果为空(Cannot read properties of undefined (reading ‘0‘))

1.错误 Uncaught TypeError: Cannot read properties of undefined (reading 0) 通过debugger去看status、result结果status为no_data,而result为空 2.原因 大概率就是key过期了或者配置错了 3.正确配置 </script> <!-- 注意&#xff1a;导入密钥要在接口上面&…

2024.3.4 作业

1、流式域套接字 1>tcp服务端实现 #include<myhead.h> int main(int argc, const char *argv[]) {//1、创建套接字int sfd socket(AF_UNIX, SOCK_STREAM, 0);if(sfd -1){perror("socket error");return -1;}//2、判断套接字文件是否存在&#xff0c;如果…

史上最细,企业性能测试步骤详细,测试老鸟带你一篇打通!

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试流程 …

总线要点笔记

1. AXI/AHB/APB差异 AMBA (Advanced Microcontroller Bus Architecture) 高级处理器总线架构 AHB (Advanced High-performance Bus) 高级高性能总线 ASB (Advanced System Bus) 高级系统总线 APB (Advanced Peripheral Bus) 高级外围总线 AXI (Advanced eXtensible Interface) …

【洛谷 P8682】[蓝桥杯 2019 省 B] 等差数列 题解(数学+排序+差分)

[蓝桥杯 2019 省 B] 等差数列 题目描述 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列&#xff0c;只记得其中 N N N 个整数。 现在给出这 N N N 个整数&#xff0c;小明想知道包含这 N N N 个整数的最短的等差数列有几项&#xff1f; 输…

探究大语言模型如何使用长上下文

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文链接&#xff1a;https://doi.org/10.1162/tacl_a_00638 论文标题&#xff1a;Lost in the Middle: How Language Models Use Long Contexts 论文发表期刊&#xff1a;Transactions of the Assoc…

【Apple Vision Pro应用】Cinephile——Cinema Mode for Local Video(苹果眼睛视频播放器)

Cinephile 为您提供了一个完全无干扰、无限制的无限空间&#xff0c;让您尽享视频的精彩。它创造了一种身临其境的环境&#xff0c;您可以在能够想象到的最大屏幕上&#xff0c;从任何角度或位置观看内容。 您可以根据个人喜好自由调整视频的大小和位置。添加视频中的环境光&am…

MoonBit 新增 += 运算符,引入 super trait 和 List 字面量机制

MoonBit更新 1. 添加了 系列语句 包括、-、*、/&#xff0c;支持运算符重载&#xff1a; fn init {let array [1,2,3,4]array[2] * 10println(array) // [1, 2, 30, 4] }fn init {let mut a 1a 20println(a) // 21 } struct Foo {data : Array[Int] } derive(Debug)fn o…

转载-七种Java常用序列化框架的选型与对比

七种Java常用序列化框架的选型与对比 本文章转自&#xff1a;乐字节 文章主要讲解&#xff1a;Java常用序列化框架 获取更多前端相关资料可以点击链接加入群聊【Java技术交流群】&#xff1a;正在跳转暗号&#xff1a;166 转载地址&#xff1a;七种Java常用序列化框架的选型…

Linux设备模型(九) - bus/device/device_driver/class

一&#xff0c;设备驱动模型 1&#xff0c;概述 在前面写的驱动中&#xff0c;我们发现编写驱动有个固定的模式只有往里面套代码就可以了&#xff0c;它们之间的大致流程可以总结如下&#xff1a; 实现入口函数xxx_init()和卸载函数xxx_exit() 申请设备号 register_chrdev_r…

软件测试的基本流程是什么?软件测试流程详细介绍

软件测试和软件开发一样&#xff0c;是一个比较复杂的工作过程&#xff0c;如果无章法可循&#xff0c;随意进行测试势必会造成测试工作的混乱。为了使测试工作标准化、规范化&#xff0c;并且快速、高效、高质量地完成测试工作&#xff0c;需要制订完整且具体的测试流程。 01…

中国各省绿色金融试点DID数据集(2010-2023)

一、数据简介 最新的2010-2023年中国31省绿色金融试点DID数据&#xff0c;供大家研究使用。 数据说明&#xff1a;内含绿色金融改革创新试验区名单&#xff0c;将试验区获批当年及以后的政策虚拟变量项是否试点赋值为1&#xff0c;获批之前赋值为0。其中赣江新区、贵安新区为国…