【Docker】镜像与docker数据卷
文章目录
- 一、镜像
- 1、镜像
- 2、镜像原理之联合文件系统
- 3、镜像原理之分层
- 4、commit镜像
- 二、数据卷
- 1、数据卷
- 2、-v使用数据卷
- 3、实战:MySQL 同步数据
- 4、docker volume相关指令
- 5、匿名和具名挂载
- 6、数据卷之Dockerfile
- 7、数据卷容器
一、镜像
1、镜像
镜像是一种轻量级、可执行的独立软件包
,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时库、环境变量和配置文件。
所有应用,直接打包docker镜像,就可以直接跑起来!而镜像的获取,可以:
- 从远程仓库下载
- 拷贝或docker save -o 导出
- 通过DockerFile自己制作
2、镜像原理之联合文件系统
UnionFs (联合文件系统):
Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加
,同时可以将不同目录挂载到同一个虚拟文件系统下( unite several directories into a single virtual filesystem)。Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(基础镜像没有父镜像),可以制作各种具体的应用镜像。
Docker镜像加载原理:
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
- boots(boot file system):主要包含 bootloader和 Kernel, bootloader主要是引导加 kernel,Linux刚启动时会加bootfs文件系统,在 Docker镜像的最底层是 boots。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs转交给内核,此时系统也会卸载bootfs
- rootfs(root file system):在 bootfs之上。包含的就是典型 Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。 rootfs就是各种不同的操作系统发行版,比如 Ubuntu, Centos等等
平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?
对于个精简的OS,rootfs可以很小,只需要包合最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的Linux发行版, boots基本是一致的, rootfs会有差別,因此不同的发行版可以公用bootfs
3、镜像原理之分层
随便下载一个镜像,可以看到是在一层一层的下载:
Docker镜像采用这种分层结构,好处是可以
资源共享
。比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像
,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
docker inspect redis
# 在镜像元数据信息中看到分层的相关数据
[
....
},"RootFS": {"Type": "layers","Layers": ["sha256:c2adabaecedbda0af72b153c6499a0555f3a769d52370469d8f6bd6328af9b13","sha256:744315296a49be711c312dfa1b3a80516116f78c437367ff0bc678da1123e990","sha256:379ef5d5cb402a5538413d7285b21aa58a560882d15f1f553f7868dc4b66afa8","sha256:d00fd460effb7b066760f97447c071492d471c5176d05b8af1751806a1f905f8","sha256:4d0c196331523cfed7bf5bafd616ecb3855256838d850b6f3d5fba911f6c4123","sha256:98b4a6242af2536383425ba2d6de033a510e049d9ca07ff501b95052da76e894"]},"Metadata": {
....
]
所有的 Docker镜像都起始于一个基础镜像层,当进行修改或加新的内容时,就会在当前镜像层之上,创建新的镜像层。
- 基于 Ubuntu Linux16.04创建一个新的镜像,这就是新镜像的第一层
- 如果在该镜像中添加 Python包,就会在基础镜像层之上创建第二个镜像层
- 如果继续添加一个安全补丁,就会创健第三个镜像层该像当前已经包含3个镜像层
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。下图中,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版。
这种更新情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
下图展示了与系统显示相同的三层镜像。所有镜像层堆并合井,对外提供统一的视图。
Docker 镜像都是
只读
的,当容器启动时,一个新的可写层加载到镜像的顶部!这一层就是我们通常说的
容器层
,容器之下的都叫镜像层!
4、commit镜像
指令:
docker commit 提交容器成为一个新的副本# 命令和git原理类似
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[版本TAG]
示例:修改tomcat容器,并提交成一个镜像
# 1、启动一个默认的tomcat
[root@9527 ~] docker run -d -p 8080:8080 tomcat
de57d0ace5716d27d0e3a7341503d07ed4695ffc266aef78e0a855b270c4064e# 2、发现这个默认的tomcat 是没有webapps应用,官方的镜像默认webapps下面是没有文件的!
[root@9527 ~] docker exec -it de57d0ace571 /bin/bash
root@de57d0ace571:/usr/local/tomcat# # 3、从webapps.dist拷贝文件进去webapp
root@de57d0ace571:/usr/local/tomcat: cp -r webapps.dist/* webapps
root@de57d0ace571:/usr/local/tomcat: cd webapps
root@de57d0ace571:/usr/local/tomcat/webapps: ls
ROOT docs examples host-manager manager# 4、将操作过的容器通过commit调教为一个镜像!我们以后就使用我们修改过的镜像即可,而不需要每次都重新拷贝webapps.dist下的文件到webapps了,这就是我们自己的一个修改的镜像
[root@9527 ~] docker commit -a="9527code" -m="add webapps app" de57d0ace571 tomcat02:1.0
sha256:d5f28a0bb0d0b6522fdcb56f100d11298377b2b7c51b9a9e621379b01cf1487e[root@9527 ~] docker images|grep -i tomcat
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 d5f28a0bb0d0 14 seconds ago 652MB
tomcat latest 1b6b1fe7261e 5 days ago 647MB
# 看到镜像大小比官方的大一点,因为我加了几个文件
如果你想要
保存当前容器的状态
,就可以通过commit来提交,获得一个镜像
,就好比我们我们使用虚拟机的快照。
二、数据卷
1、数据卷
如果数据存储在容器中,那删除容器,数据就会丢失,因此需要对数据进行持久化。基于此,Docker有数据卷技术,实现了:
- Docker容器中产生的数据同步到本地
- 容器之间可以数据共享
如下图中,将容器中的/usr/mysql目录映射到宿主机的/home/mysql目录:(其实就是挂载,把容器内的目录,挂载到宿主机上面)
Volume是外部默认的联合文件系统或者是存在于宿主文件系统中正常的文件或文件夹。
总结一句话:容器的持久化和同步操作!容器间也可以共享数据!
2、-v使用数据卷
docker run -it -v 主机目录:容器目录 ...[root@9527 home] docker run -it -v /home/ceshi:/home centos /bin/bash
使用docker inspect 查看容器元数据信息中的挂载信息:
此时,在容器内创建文件,宿主机目录中同步数据成功。在宿主机创建文件,容器中对应目录也同步。
停止容器 ⇒ 主机上修改文件 ⇒ 启动容器
⇒ 容器内的数据依旧是同步的:
从此,对于上篇中的nginx、tomcat…,只需要修改对应的本地目录,容器内的数据也会自动同步更新。
3、实战:MySQL 同步数据
# 获取镜像
[root@9527 home] docker pull mysql:5.7# 运行容器, 需要做数据挂载!
# 安装启动mysql,需要配置密码(注意)
# 官方测试指令 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag# 启动我们的
-d # 后台运行
-p # 端口映射
-v # 卷挂载。可指定多个
-e # 环境配置
--name # 容器的名字
[root@9527 home] docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
9552bf4eb2b69a2ccd344b5ba5965da4d97b19f2e1a78626ac1f2f8d276fc2ba# 启动成功之后,我们在本地使用navicat链接测试一下
# navicat链接到服务器的3310 ---> 3310和容器的3306映射,这个时候我们就可以连接上mysql了# 在本地测试创建一个数据库,查看本地目录中,数据持久化同步成功。
此时彻底删除容器:
docker rm -f mysql01
本地目录中的数据不受影响,这就实现了容器数据持久化的功能!
4、docker volume相关指令
[root@9527 ~] docker volume helpUsage: docker volume COMMANDManage volumesCommands:create Create a volumeinspect Display detailed information on one or more volumesls List volumesprune Remove all unused local volumesrm Remove one or more volumesRun 'docker volume COMMAND --help' for more information on a command.
- docker volume ls 列出所有的数据卷
# 只需要展示数据卷的名称,使用-q
[root@9527 ~] docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
- docker volume create 创建一个数据卷
[root@9527 ~] docker volume create centos-volume
- docker volume inspect 查看卷的信息
[root@9527 ~] docker volume inspect centos-volume
- docker volume prune 移除未使用的数据卷
[root@9527 ~] docker volume prune
- docker volume rm 移除一个或多个数据卷,不能移除被容器使用的数据卷
# -f, --force Force the removal of one or more volumes
[root@9527 ~]# docker volume rm 8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496
Error response from daemon: remove 8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496:
volume is in use - [857601f85a5adf1e1305f2f6a7c317431af6841d750b7dd947a03b0725e0ae49]# 需要先移除该容器(只停止是不行的)
5、匿名和具名挂载
匿名挂载:-v 后面只写了容器内的路径
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx # -P 随机指定端口# 查看所有volume的情况
[root@9527 ~] docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local 36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882# 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径!
具名挂载:-v后面给卷起个名字,注意没有/,更不是宿主机的本地目录路径。即-v 卷名:容器内的路径
# 具名挂载
[root@9527 ~] docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17
[root@9527 ~] docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26da1ec7d499 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:32769->80/tcp nginx02
486de1da03cb nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp nginx01
[root@9527 ~] docker volume ls
DRIVER VOLUME NAME
local 561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local juming-nginx# 通过-v 卷名:容器内的路径
# 查看一下这个卷
[root@9527 ~] docker volume inspect juming-nginx
[{"CreatedAt": "2020-08-12T18:15:21+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data","Name": "juming-nginx","Options": null,"Scope": "local"}
]
所有docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxxx/_data
具名挂载可以方便的找到我们的一个卷,大多数情况下使用的是具名挂载。区别:
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-----------------
-v 容器内路径 // 匿名挂载
-v 卷名:容器内路径 //具名挂载
-v /主机路径:容器内路径 // 指定路径挂载
关于权限ro、rw:
# 通过 -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就说明这个路径只能通过宿主机来操作,容器内容无法操作
6、数据卷之Dockerfile
Dockerfile就是用来构建docker镜像的构建文件(命令脚本),通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。
# 创建一个dockerfile文件, 名字可以随机,但建议Dockerfile
# 文件的内容 指定(大写) 参数FROM centosVOLUME ["volume01", "volume02"] # 代表容器内的两个目录,即匿名挂载CMD echo "----end----"
CMD /bin/bash# 这里的每一个命令都是镜像的一层!
开始构建:
拿构建的镜像启动容器:
这个卷和外部宿主机有一个同步的目录:
inspect查看容器元信息中数据卷的映射关系:
这种方式我们未来使用的十分多,假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!
7、数据卷容器
docker02挂载了docker01,docker01就叫数据卷容器。
# 使用上面自己构建的镜像启动两个容器docker01、docker02
docker run -it --name docker01 code-9527/centos:1.0
# docker02挂载docker01
docker run -it --name docker02 --volumes-from docker01 code-9527/centos:1.0
同样的,在docker02中创建文件,docker01中也能同步成功。即--volumes-from实现了容器间数据的共享。
# 也可以再挂一个docker03
docker run -it --name docker03 --volumes-from docker01 code-9527/centos:1.0
此时,docker02和docker03都挂载于docker01,删除docker01,02和03的数据还是能正常访问,这里是拷贝的关系!
基于以上的测试,就可以实现多个mysql容器数据的共享:
[root@9527 home] docker run -d -p 3344:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7[root@9527 home] docker run -d -p 3345:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
总结:
容器之间配置信息的传递, 数据卷容器的生命周期一直持续到没有容器使用为止(复制拷贝的关系)
且一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
相关文章:
【Docker】镜像与docker数据卷
文章目录 一、镜像1、镜像2、镜像原理之联合文件系统3、镜像原理之分层4、commit镜像 二、数据卷1、数据卷2、-v使用数据卷3、实战:MySQL 同步数据4、docker volume相关指令5、匿名和具名挂载6、数据卷之Dockerfile7、数据卷容器 一、镜像 1、镜像 镜像是一种轻量级…...
机器学习小结之KNN算法
文章目录 前言一、概念1.1 机器学习基本概念1.2 k 值1.3 距离度量1.4 加权方式 二、实现2.1 手写实现2.2 调库 Scikit-learn2.3 测试自己的数据 三、总结3.1 分析3.2 KNN 优缺点 参考 前言 KNN (K-Nearest Neighbor)算法是一种最简单,也是一个很实用的机器学习的…...
函函函函函函函函函函函数——two
🤩本文作者:大家好,我是paperjie,感谢你阅读本文,欢迎一建三连哦。 🥰内容专栏:这里是《C知识系统分享》专栏,笔者用重金(时间和精力)打造,基础知识一网打尽,…...
SpringCloud学习笔记06
九十五、Cloud Alibaba简介 0、why会出现SpringCloud alibaba Spring Cloud Netflix项目进入维护模式 1、是什么 官网:spring-cloud-alibaba/README-zh.md at 2.2.x alibaba/spring-cloud-alibaba GitHub 2、能干嘛 3、去哪下 spring-cloud-alibaba/README-…...
学系统集成项目管理工程师(中项)系列14_采购管理
1. 概念和术语 1.1. 采购是从项目团队外部获得产品、服务或成果的完整的购买过程 1.2. 三大类 1.2.1. 工程 1.2.2. 产品/货物 1.2.3. 服务 2. 主要过程 2.1. 编制采购管理计划 2.2. 实施采购 2.3. 控制采购 2.4. 结束采购 3. 合同 3.1. 包括买方和卖方之间的法律文…...
PMP课堂模拟题目及解析(第3期)
21. 一家农业设备制造商因一个缺陷部件而召回数千个产品。这个问题导致许多客户不满,公司花费 500 万美元来修理和更换零件。哪一种成本预算类型可以防止这个问题? A. 非一致性成本 B. 一致性成本 C. 矩阵图 D. 多标准决策分析 22. 一位团队成员…...
华为OD机试 - 微服务的集成测试( Python)
题目描述 现在有n个容器服务,服务的启动可能有一定的依赖性(有些服务启动没有依赖),其次服务自身启动加载会消耗一些时间。 给你一个 n x n 的二维矩阵useTime,其中 useTime[i][i]=10 表示服务i自身启动加载需要消耗10s useTime[i][j] = 1 表示服务i启动依赖服务j启动完…...
SLAM面试笔记(4) — 企业面试汇总
目录 1 大疆 一面(50min) 二面(30min) 三面(30min) 2 华为 一面(30min) 二面(30min) 三面(30min) 3 海康 一面(…...
五大新兴产业中,有三个中国出口全球占比居首-机器视觉工程师正处于需求旺盛阶段
五大新兴产业包含生物保健和电动汽车,新一代半导体、新一代显示器、二次电池。 在五大新兴产业中的三大领域——新一代半导体、新一代显示器、二次电池,中国对外出口在全球所占比重最高。 电动汽车,汽车行业一直对机器视觉工程师有着强烈的需求,无论比亚迪,特斯拉等等…...
网络安全监管
网络安全监管 网络安全法律体系建设计算机犯罪、信息安全等基本概念我国立法体系及网络安全法我国的立法体系网络安全法出台背景基本概念安全法主要结构第一章 总则第二章 网络安全支持与促进第三章 网络运行安全第四章 网络信息安全第五章 监测预警与应急处置第六章 法律责任 …...
【code review】代码评审的18个军规(建议收藏)
文章目录 背景1. 添加必要的注释2.日志打印规范3. 命名规范4.参数校验5. 判空处理6. 异常处理规范7. 模块化,可扩展性8. 并发控制规范9. 单元测试规范10. 代码格式规范11. 接口兼容性12. 程序逻辑是否清晰,主次是否够分明13. 安全规范14. 事务控制规范15. 幂等处理规…...
PyQt5桌面应用开发(5):对话框
本文目录 PyQt5桌面应用系列对话框QDialogQDialog的基本用法按钮组 QMessageBox综合展示的例子结论 PyQt5桌面应用系列 PyQt5桌面应用开发(1):需求分析 PyQt5桌面应用开发(2):事件循环 PyQt5桌面应用开发&a…...
整洁的代码
文章目录 为什么要写整洁的代码什么是整洁的代码可读性运行效率扩展性 怎么写整洁的代码注释&命名函数&类代码结构 为什么要写整洁的代码 为什么要写整洁的代码,回答这个问题之前,也许应该想想写糟糕的代码的原因 是想快点完成吗?还是要赶时间吗?有可能.或许你觉得…...
Redis集群常用命令及说明
一、集群的特点 1、集群架构特点 (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽; (2)节点的fail是通过集群中超过半数的节点检测失效时才生效…...
使用edge浏览器,白嫖ChatGPT的保姆级教程来了
前言 嗨,大家好,我是希留,一个被迫致力于全栈开发的老菜鸟。 人工智能大浪潮已经来临,对于ChatGPT,我觉得任何一个玩互联网的人,都应该重视起来,用起来。但是国内使用需要解决科学上网、注册、…...
新人入职,都用这三招,让你安全度过试用期
刚入职工作 3招让你安全度过试用期 给新手小伙伴们分享几招 让你们能在试用期的时候平滑去度过 那么第一第一点就是 能自己解决的千万不要去问 千万不要去问 因为往往我们在去面试的时候 我们往往都是备足了很多的资料 备足了很多的面试题库 然后呢 你在给人家面试的时候总有一…...
小程序上车,车载小程序的信息安全是否可靠?
随着智能交通和车联网技术的快速发展,越来越多的车载应用程序(APP)进入人们的视野,从而推动了车载业务生态的不断发展。然而,车载应用程序的安全问题也引起了人们的广泛关注。为此,小程序容器技术作为一种有…...
华为OD机试 - 识图谱新词挖掘(Python)
题目描述 小华负责公司知识图谱产品,现在要通过新词挖掘完善知识图谱。 新词挖掘:给出一个待挖掘问题内容字符串Content和一个词的字符串word,找到content中所有word的新词。 新词:使用词word的字符排列形成的字符串。 请帮小华实现新词挖掘,返回发现的新词的数量。 …...
( 数组和矩阵) 378. 有序矩阵中第 K 小的元素 ——【Leetcode每日一题】
❓378. 有序矩阵中第 K 小的元素 难度:中等 给你一个 n x n n x n nxn 矩阵 m a t r i x matrix matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 …...
HBase架构篇 - Hadoop家族的天之骄子HBase
HBase的基本组成结构 表(table) HBase 的数据存储在表中。表名是一个字符串。表由行和列组成。 行(row) HBase 的行由行键(rowkey)和 n 个列(column)组成。行键没有数据类型&…...
STL及常用容器vector、list和deque的介绍
vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随机存取,即[]操作符,即可以以数组下标的方式来访问或遍历。但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需…...
SpringBoot统一功能处理(统⼀⽤户登录权限验证、统⼀异常处理、统⼀数据格式封装)
统⼀⽤户登录权限验证 1、最初的用户登录效验:在每个方法里面获取session和 session 中的用户信息,如果存在用户,那么就认为登录成功了,否则就登录失败了。 2、第二版用户登录效验:提供了统一的方法,在每个需要验证的方法中调用…...
华为实习笔试复盘(1)配送站和客户问题
写在前面 自己玩了很多项目,但是最近准备秋招的过程中,发现自己对于算法和编程语言的基本功夫实在是太欠缺了。 投递了华为的实习岗位,4.26参加机考,一做题就发现了自己很多地方都不会。这里写下笔试后的复盘以警醒自己。 题目 …...
alibaba yalantingLibs struct_pack代码梳理
这里写目录标题 struct_pack 接口序列化序列化对象到新字节容器序列化对象到容器尾部将序列化结果保存到指针指向的内存中多参数序列化将序列化结果保存到输出流自定义类型序列化序列化到自定义的输出流 反序列化基本反序列化从指针指向的内存中反序列化反序列化到已有对象多参…...
JavaWeb( 二 ) URL
1.4.URL统一资源定位符 URL代表Uniform Resource Locator 统一资源定位符,也叫 URL地址 。是用于标识和定位Web上资源的地址,通常用于在Web浏览器中访问网站和文件。 URL由若干部分组成,scheme:// host : port / path 例如: htt…...
Python斐波那契数列
斐波那契数列是一个经典的数学问题,在 Python 中可以使用多种方法来实现,下面是几个常见的实现方式: 1. 使用递归 python def fibonacci_recursive(n): if n < 1: return n else: return fibonacci_recursive(n…...
华为OD机试 - 模拟商场优惠打折(Python)
题目描述 模拟商场优惠打折,有三种优惠券可以用,满减券、打折券和无门槛券。 满减券:满100减10,满200减20,满300减30,满400减40,以此类推不限制使用; 打折券:固定折扣92折,且打折之后向下取整,每次购物只能用1次; 无门槛券:一张券减5元,没有使用限制。 每个人…...
【JAVA程序设计】(C00132)基于SSM的固定资产管理系统
基于SSM的固定资产管理系统 项目简介项目获取开发环境项目技术运行截图 项目简介 本系统为基于SSM的固定资产管理系统,本系统分为二种用户:超级管理员和普通管理员; 超级管理员功能: 首页查看、设备管理、平台账户管理、设备台账…...
简单的无理函数的不定积分
前置知识: 直接积分法有理函数的不定积分 简单的无理函数的不定积分 对无理函数积分的基本方法就是通过换元将其化为有理函数的积分。下面讲讲几类无理函数积分的求法。 注: R ( u , v ) R(u,v) R(u,v)是由 u , v u,v u,v与常数经过有限次四则运算得…...
《国际联网安全保护管理办法》
1.基本信息 (1997年12月11日国务院批准 1997年12月16日公安部令第33号发布 根据2011年1月8日《国务院关于废止和修改部分行政法规的决定》修订) 2.办法内容 第一章 总 则 第一条为了加强对计算机信息网络国际联网的安全保护,维护公共…...
怎么用adobe软件做网站/微信引流主动被加软件
本节书摘来自异步社区《深入解析IPv6(第3版)》一书中的第1章,第1.2节,作者: 【美】Joseph Davies 更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.2 IPv4地址空间受限的后果 由于IPv4的地址相对比较稀缺,人…...
wordpress 通用代码/seo网站分析工具
本科生毕业论文 基于Java(springboot框架)图书馆管理系统 开题报告 学 院: 专 业: 计算机科学与技术 年 级: 学生姓名: …...
海洋cms做电影网站好做吗/推广优化网站排名
昨天在项目中需要对日志的查询结果进行导出功能。 日志导出功能的实现是这样的,输入查询条件,然后对查询结果进行导出。由于日志数据量比较大。多的时候,有上亿条记录。 之前的解决方案都是多次查询,然后使用limit 限制每次查询的…...
兼职做彩平网站/黑马培训
web开发中,我们经常需要将一个表的数据插入到另外一个表,有时还需要指定导入字段,设置只需要导入目标表中不存在的记录,虽然这些都可以在程序中拆分成简单sql来实现,但是用一个sql的话,会节省大量代码。下面…...
兰州迅豹网络/网站做优化一开始怎么做
Redisson官方文档 GetMapping("/hello")public String testRedissonClient(){//根据名字获取锁 只要锁名一样 就是同一把锁 第一个线程拿到这个锁 加锁 第二个线程拿到的就是 一个正在运行的加了锁的锁RLock mylock redissonClient.getLock("my-lock"…...
wordpress代码 lt/深圳网络营销推广培训
历史概况 1995年,Mat Nelson进入IBM,开始接触JAVA。 2000年,随着JAVA语言成熟, Mat Nelson这个狂热的玩家看到了创建这个“他一直想玩”的游戏的机会,着手开始创建Robocode。 2001年, IBM以 alpha…...