docker存储驱动

目录

一、写时复制和用时分配

二、联合文件系统

2.1、aufs

​编辑

2.2、分层的问题

2.3、overlay

2.4 文件系统区别

三、容器跑httpd案例

3.1、案例1:端口映射

3.2、案例2:制作httpd应用镜像

3.3、案例3:docker数据卷挂载

3.4、案例4:官方httpd镜像运行

四、容器中运行应用

4.1、官方mariadb镜像运行

4.2、系统镜像自定义mariadb环境

4.3、官方nginx镜像运行容器


一、写时复制和用时分配

我们知道一个镜像可以跑多个容器,如果每个容器都去复制一份镜像内的文件系统,那么将会占用大量的存储空间。docker使用了写时复制cow(copy-on-write)和用时分配(allocate-on-demand)技术来提高存储的利用率。可以理解为kvm的创建虚拟机链接
1、写时复制:
写时复制技术可以让多个容器共享同一个镜像的文件系统,所有数据都从镜像中读取
只有当要对文件进行写操作时,才从镜像里把要写的文件复制到自己的文件系统进行修改。所以无论有多少个容器共享同一个镜像,所做的写操作都是对从镜像中复制到自己的文件系统中的复本上进行,并不会修改镜像的源文件
多个容器操作同一个文件,会在每个容器的文件系统里生成一个复本,每个容器修改的都是自己的复本,相互隔离,相互不影响
2、用时分配:
启动一个容器,并不会为这个容器预分配一些磁盘空间,而是当有新文件写入时,才按需分配新空间

二、联合文件系统

联合文件系统(UnionFS)就是把不同物理位置的目录合并mount到同一个目录中
比如你可以将一个光盘与一个硬盘上的目录联合挂载到一起,然后对只读的光盘文件进行修改,修改的文件不存放回光盘进行覆盖,而是存放到硬盘目录。这样做达到了不影响光盘原数据,而修改的目的。
思考:把光盘看作是docker里的image,而硬盘目录看作是container,你再想想看?
docker就支持aufs和overlay两种联合文件系统。

2.1、aufs

Docker最开始采用AUFS作为文件系统,也得益于AUFS分层的概念,实现了多个Container可以共享同一个image。
aufs(Another UnionFS),后来叫Alternative UnionFS,后来可能觉得不够霸气,叫成AdvanceUnionFS.
 

除了最上面的一层是读写层之外,下面的其他层都是只读的镜像层

多个容器共享同一个基础镜像之后,修改其他容器内镜像需要的内存其实就是基础镜像内存自动 分配且独立的。例如修改了阿帕奇记录需要3M基础镜像不会变,容器则会记录修改的内容
 

容器中修改的镜像内容不会覆盖原来的镜像

2.2、分层的问题

分层实际上是记录每次修改的内容,如果修改次数太多了会占用存储空间去记录

例如:vim 一个文件第一次写入1,第二次把1改成2,实际上是记录修改内容的存储空间是不变的

但是如果分层记录互不影响的话,会记录每次修改的内容导致占用存储空间

2.3、overlay

由于AUFS未并入Linux内核,且只支持Ubuntu,考虑到兼容性问题,在Docker 0.7版本中引入了存储驱动。目前,Docker支持AUFS,OverlayFS,Btrfs,Device mapper,ZFS五种存储驱动.
目前,在ubuntu发行版上默认存储方式为AUFS,

CentOS发行版上的默认存储方式为overlay或overlay2

Overlay是Linux内核3.18后支持的(当前3.10内核加载模块也可以使用),也是一种Union FS,和AUFS的多层不同的是Overlay只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的容器层和镜像层..OverlayFS底层目录称为lowerdir,高层目录称为upperdir。合并统一视图称为merged。当需要修改一个文件时,使用cow将文件从只读的Lower复制到可写的upper进行修改,结果也保存在Upper层。在Docker中,底下的只读层就是image,可写层就是Container
下图分层图,镜像层是lowdir,容器层是upperdir,统--的视图层是merged层.
视图层就是给用户提供了一个统一的视角,隐藏了多个层的复杂性,对用户来说只存在一个文件系统。

如果upperdir和lowerdir有同名文件时会用upperdir的文件读文件的时候,文件不在upperdir则从lowerdir读
如果写的文件不在uppderdir在lowerdir,则从lowerdir里面copy到upperdir。
不管文件多大,copy完再写,删除或者重命名镜像层的文件都只是在容器层生成whiteout文件标志(标记为删除,并不是真的删除)
 

2.4 文件系统区别

aufs:使用多层分层
overlay:使用2层分层,共享数据方式是通过硬连接,只挂载一层,其他层通过最高层通过硬连接形式共享(增加了磁盘inode的负担)
overlay2:使用2层分层,驱动原生地支持多层lower overlay镜像(最多128层),与overlay驱动对比,消耗更少的inode(索引)
 

三、容器跑httpd案例

3.1、案例1:端口映射

利用官方centos镜像运行容器跑httpd服务,因为官方centos镜像里默认并没有安装httpd服务,所以需要我们自定义安装
docker内部跑httpd启动80端口,需要与docker_host(宿主机)进行端口映射,才能让客户端通过网络来访问
1,运行容器httpd1; -p 8000:80的意思是把容器里的80端口映射为docker_host(宿主机)的8000端口
 

查看容器的dns,容器和docker宿主机之间通过虚拟的交换机链接

在docker宿主机上查看IP可以使用inspect

容器内核 和宿主一样

容器实际上只是一个宿主机的进程所以无法使用systemctl启动,无法模拟systemd

使用宿主机curl ip 查看

端口映射必须打开ip_forward

测试可以使用另一台电脑的浏览器访问宿主机IP:8000

因为宿主机中的容器IP不可能一样,防止端口冲突问题就必须做端口映射

另一台电脑中可能也有相同的容器IP

3.2、案例2:制作httpd应用镜像

cenots镜像里并没有httpd,所以需要安装.但是如果每次启动一个容器都要安装一遍httpd是让人受不了的.所以我们在一个容器里安装一次,把想自定义的全做了,然后将此容器commit成一个新的镜像。
以后就用这个新镜像运行容器就可以不用再重复装环境了。

自定义修改阿帕奇的家目录必须注意不能改错,只能跳着改两个地方

修改完家目录之后创建家目录然后随便编辑内容再启动httpd服务,由于lsof、netstat命令没有

只能用ss命令查看80端口

将搭建好的环境commit成新的镜像(此镜像相当于是自定义的,生产环境中可以按需求push到镜像仓库)
后面那个标签自定义

-D FOREGROUND 参数需要自己查找 就是阿帕奇的容器启动参数

将commit提交的镜像启动一个新的容器,并将端口80映射到宿主机的8001

使用另一台电脑的浏览器访问宿主机ip:8001测试

加-d 是隐藏后台输出的信息 避免卡住终端

3.3、案例3:docker数据卷挂载

有以下需求:

容器内配置文件需要修改
容器内数据(如:如httpd家目录内的数据)需要保存
不同容器间数据需要共享(如:两个httpd容器家目录数据共享)

当容器删除时,里面的相关改变的数据也会删除,也就是说数据不能持久化保存。
我们可以将服务的配置文件,数据目录,日志目录等与宿主机的目录映射,把数据保持到宿主机上实现数据持久化

宿主机的目录也可以共享给多个容器使用

将宿主机的目录(数据卷、配置文件)挂载到容器中(解耦作用)头和身体是耦合的 手和指甲可以解耦

往宿主机中发布或更新项目就能实在cicd 解耦之后不用管容器了和容器分离 实现数据持久化

可以一次性挂载多个-v 命令

挂载配置文件

通过系统镜像自定义应用或者直接使用应用镜像

3.4、案例4:官方httpd镜像运行

四、容器中运行应用

4.1、官方mariadb镜像运行

在docker官方仓库pull需要的数据库即可,参考操作文档安装就行

启动容器没反应大概率是因为端口被占用了,使用lsof -i 3306 排查

在容器中运行mysql发现密码没有传入

使用宿主机远程链接容器中的数据库

因为数据库版本原因导致远程访问授权方式不一样,可以参考文档就行配置授权

4.2、系统镜像自定义mariadb环境

-d命令是后台运行容器  容器不会立刻和终端进行交互 必须使用attach命令进行交互

&后台配置参数这些无法实现自动化 必须每次都传参一次才行

4.3、官方nginx镜像运行容器

需要注意的就是官方文档中的nginx版本

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

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

相关文章

【hot100】跟着小王一起刷leetcode -- 49. 字母异位词分组

【【hot100】跟着小王一起刷leetcode -- 49. 字母异位词分组 49. 字母异位词分组题目解读解题思路代码实现 总结 49. 字母异位词分组 题目解读 49. 字母异位词分组 ok,兄弟们,咱们来看看这道题,很明显哈,这里的关键词是字母异位…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-27-处理单选和多选按钮-番外篇

1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo,然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何使用playwright来处理单选按钮和多选按钮进行自动化测试,想必大家都已经掌握的八九不离十了吧。这一篇其实也很简单&#xff1a…

浅谈 TCP 三次握手

文章目录 三次握手 三次握手 首先我们需要明确,三次握手的目的是什么? 是为了通信双方之间建立连接,然后传输数据。 那么建立连接的条件是什么呢? 需要确保通信的双方都确认彼此的接收和发送能力正常,满足这个条件&a…

今天面了个字节拿 38K 出来的测试,让我见识到了基础的天花板

最近内卷严重,各种跳槽裁员,相信很多小伙伴也在准备金九银十的面试计划。 作为一个入职5年的老人家,目前工资比较乐观,但是我还是会选择跳槽,因为感觉在一个舒适圈待久了,人过得太过安逸,晋升涨…

Jeecg项目部署

说明:Jeecg是一款低代码开发平台,简单说是一款现成的项目,该项目集成了许多功能,我们可以在这个项目之上开发自己的业务代码。 本文介绍Jeecg项目的部署,包括后端jeecg-boot项目、前端vue3项目。前端项目在本地Window…

Java的编程之旅19——使用idea对面相对象编程项目的创建

在介绍面向对象编程之前先说一下我们在idea中如何创建项目文件 使用快捷键CtrlshiftaltS新建一个模块,点击“”,再点New Module 点击Next 我这里给Module起名叫OOP,就是面向对象编程的英文缩写,再点击下面的Finish 点Apply或OK均可 右键src…

2024Python自动化测试面试必备知识点!

在准备 Python 自动化测试面试时,以下是一些必备的知识点,可以帮助您在面试中展现实力: 软件测试基础: 熟悉软件测试的基本概念,包括测试类型(功能测试、性能测试、安全测试等)、测试方法&#…

数据安全治理实践路线(中)

数据安全建设阶段主要对数据安全规划进行落地实施,建成与组织相适应的数据安全治理能力,包括组织架构的建设、制度体系的完善、技术工具的建立和人员能力的培养等。通过数据安全规划,组织对如何从零开始建设数据安全治理体系有了一定认知&…

微服务篇之任务调度

一、xxl-job的作用 1. 解决集群任务的重复执行问题。 2. cron表达式定义灵活。 3. 定时任务失败了,重试和统计。 4. 任务量大,分片执行。 二、xxl-job路由策略 1. FIRST(第一个):固定选择第一个机器。 2. LAST&#x…

西门子S7-1500作为智能设备共享功能

本章节介绍了共享设备的功能,优势,使用要求,使用规则,如何将智能设备作为共享设备,实现一个智能设备同时与2个IO控制器进行通信的示例,以及常见问题。 一、共享设备功能概述 信号模块可以被不同的IO控制器…

【MIT-PHP-推荐】imi-ai 是一个 ChatGPT 开源项目

mi-ai 是一个 ChatGPT 开源项目,支持聊天、问答、写代码、写文章、做作业等功能。 项目架构合理,代码编写优雅,简单快速部署。前后端代码完全开源,不管是学习自用还是商用二开都很适合。 本项目现已支持 ChatGPT 聊天 AI 和 Emb…

都说了别用BeanUtils.copyProperties,这不翻车了吧

分享是最有效的学习方式。 博客:https://blog.ktdaddy.com/ 故事 新年新气象,小猫也是踏上了新年新征程,自从小猫按照老猫给的建议【系统梳理大法】完完整整地梳理完毕系统之后,小猫对整个系统的把控可谓又是上到可一个新的高度。…

yolov8学习笔记(二)模型训练

目录 yolov8的模型训练 1、制作数据集(标记数据集) 2、模型训练(标记数据集、参数设置、跟踪模型随时间的性能变化) 2.1、租服务器训练 2.2、加训练参数 2.3、看训练时的参数(有条件,就使用TensorBoard&…

Open CASCADE学习|视图

目录 Mainwin.h Mainwin.cpp Mainwin.h ​#pragma once#include <QtWidgets/QMainWindow>#include "Displaywin.h"#include "OCC.h"class Mainwin : public QMainWindow{ Q_OBJECTpublic: Mainwin(QWidget* parent nullptr); ~Mainwin();​pri…

【Java程序设计】【C00277】基于Springboot的招生管理系统(有论文)

基于Springboot的招生管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的招生管理系统 本系统分为系统功能模块、管理员功能模块以及学生功能模块。 系统功能模块&#xff1a;在系统首页可以查看首页、专业…

opengl 学习纹理

一.纹理是什么&#xff1f; 纹理是一个2D图片&#xff08;甚至也有1D和3D的纹理&#xff09;&#xff0c;它可以用来添加物体的细节&#xff1b;类似于图像一样&#xff0c;纹理也可以被用来储存大量的数据&#xff0c;这些数据可以发送到着色器上。 采样是指用纹理坐标来获取纹…

机器学习简单介绍

&#xff08;本文为简单介绍&#xff0c;内容源于网络和AI&#xff09; 当今世界,技术与创新的步伐日新月异。在各类智能技术当中,如果说有一个绝对不容忽视的关键词,那就是“机器学习”(Machine Learning)。它是人工智能领域的核心分支,使得机器获得从数据中学习、进而做出决…

Modern C++ std::variant的6个特性+原理

1 前言 上一节《Modern C std::variant的实现原理》我们简单分析了std::variant的实现原理&#xff0c;其实要学好C编程&#xff0c;除了看优秀的代码包括标准库实现&#xff0c;读文档也是很便捷且必须的一种办法。 本节我将逐条解析文档中的五个特性&#xff0c;解析的办法有…

H12-821_77

77.如图所示的交换网络&#xff0c;所有交换机都运行了STP协议&#xff0c;当拓扑稳定后&#xff0c;在以下哪台交换机上修改配置BPDU的发送周期&#xff0c;可以影响STD配置BPDU的发送周期&#xff1f; A.STC B.SWD C.SWA D.SWB 答案&#xff1a;C 注释&#xff1a; 在根桥上…

(十九)devops持续集成开发——jenkins的一些常用插件和工具的安装

前言 本节内容会着重介绍jenkins持续集成开发工具的一些常用插件安装以及全局工具的配置安装&#xff0c;并说明其主要作用。在开始插件和工具安装之前&#xff0c;我们要保证可以正常访问网络&#xff0c;并且使用国内的插件更新地址&#xff0c;便于插件的正常安装。官方的地…