docker存储驱动

news/发布时间2024/9/20 7:50:37

目录

一、写时复制和用时分配

二、联合文件系统

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.bcls.cn/IBig/10198.shtml

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

相关文章

探索数据结构:解锁计算世界的密码

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty‘s blog 前言 随着应用程序变得越来越复杂和数据越来越丰富,几百万、…

继承-学习2

this关键字:指向调用该方法的对象,一般我们是在当前类中使用this关键字,所以我们常说代表本类对象的引用 super关键字:代表父类存储空间的标识(可看作父类对象的引用) 父类: package ven;public class Fu {//父类成员…

细嗦MySQL三大日志

文章目录 三大日志:binlog(归档日志)、redo log(重做日志)、undo log(回滚日志)redo log刷盘机制日志文件组 binlog记录格式写入机制 两阶段提交undo log提供回滚操作提供MVCC(多版本…

SQL-Labs靶场“46-50”关通关教程

君衍. 一、四十六关 ORDER BY数字型注入1、源码分析2、rand()盲注3、if语句盲注4、时间盲注5、报错注入6、Limit注入 二、四十七关 ORDER BY单引号报错注入1、源码分析2、报错注入3、时间盲注 三、四十八关 ODRER BY数字型盲注1、源码分析2、rand()盲注3、if语句盲注4、时间盲注…

Java进阶(锁)——锁的升级,synchronized与lock锁区别

目录 引出Java中锁升级synchronized与lock锁区别 缓存三兄弟:缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java进阶(锁)——锁的升级,synchronized与lock锁区别 Java中锁升级 看一段代码: public class…

Windows 10 合并磁盘分区 (G and H)

Windows 10 合并磁盘分区 [G and H] 1. 设备和驱动器2. 计算机 -> 管理 -> 存储 -> 磁盘管理3. 删除卷4. 新建简单卷5. 设备和驱动器References 1. 设备和驱动器 2. 计算机 -> 管理 -> 存储 -> 磁盘管理 3. 删除卷 H: -> right-click -> 删除卷 H: 变…

消息中间件篇之RabbitMQ-消息不丢失

一、生产者确认机制 RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ以后,会返回一个结果给发送者,表示消息是否处理成功。 当消息没有到交换机就失败了,就会返回publish-confirm。当消息没有到达MQ时&…

10分钟SkyWalking与SpringBoot融合并整合到Linux中

1.依赖配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.0.RELEASE</version></dependency><dependency><groupId>org.springframe…

【C++】二叉搜索树

目录 介绍&#xff1a; 一&#xff0c;二叉搜索树操作 1&#xff0c;搜索二叉树的简单封装 2&#xff0c;二叉搜索树的查找 3&#xff0c;二叉搜索树的插入 4&#xff0c;二叉搜索树的删除 二&#xff0c;递归实现二叉搜索树的操作 1&#xff0c;二叉搜索树的递归查找 …

AI也来打掼蛋,难道人工智能也能当领导?

引言&#xff1a;探索AI在复杂卡牌游戏中的决策能力 在人工智能&#xff08;AI&#xff09;的研究领域中&#xff0c;游戏被视为现实世界的简化模型&#xff0c;常常是研究的首选平台。这些研究主要关注游戏代理的决策过程。例如&#xff0c;中国的传统卡牌游戏“掼蛋”&#…

新闻网站封锁AI爬虫 AI与新闻媒体博弈继续

随着ChatGPT等新兴AI模型的兴起&#xff0c;它们所依赖的网络爬虫正面临来自全球主流新闻网站的大规模封锁。Richard Fletcher博士团队对十个国家主流新闻网站的统计发现&#xff0c;到2023年底&#xff0c;48%的网站屏蔽了OpenAI的爬虫&#xff0c;24%屏蔽了Google的爬虫。那么…

【IEEEE会议征稿】第六届下一代数据驱动网络国际学术会议(NGDN 2024)

第六届下一代数据驱动网络国际学术会议&#xff08;NGDN 2024&#xff09; The Sixth International Conference on Next Generation Data-driven Networks 基于前几届在英国埃克塞特 (ISPA 2020) 、中国沈阳 (TrustCom 2021) 和中国武汉(IEEETrustCom-2022)成功举办的经验&a…

亚马逊,速卖通,shopee测评补单,如何构建一套完整的环境方案

无论是做普通测评&#xff0c;还是做撸卡撸货&#xff0c;采退的只有在安全稳定的环境下才能不被平台检测&#xff0c;造成被砍单或F号&#xff0c;所以在没有专业团队指导下&#xff0c;建议大家不要轻易尝试&#xff0c;毕竟试错和时间成本才是最大的 进行测评时&#xff0c;…

动态规划课堂3-----简单多状态问题(买卖股票最佳时机)

目录 引入&#xff1a; 例题1&#xff1a;按摩师&#xff08;打家劫舍I&#xff09; 例题2&#xff1a;打家劫舍II 例题3&#xff1a;删除并获得点数 例题4&#xff1a;粉刷房子 例题5&#xff1a;买卖股票的最佳时机含冷冻 结语&#xff1a; 引入&#xff1a; 相信看到…

vue2使用fabric实现简单画图demo,完成批阅功能

这个功能主要实现批阅的&#xff0c;修改上传的图片&#xff0c;标记内容 看看效果图 主要是根据fabric这个库来进行完成的 下载包 npm i fabric 组件内注册使用 import { fabric } from fabric; 步骤 body中 <divv-if"imgs.length"class"canvas-wrap…

C++之数组

1&#xff0c;概述 所谓数组&#xff0c;就是一个集合&#xff0c;里面存放了相同类型的数据元素 特点1&#xff1a;数组中没干过数据元素都是相同的数据类型 特点2&#xff1a;数组都是连续存放位置组成的 2&#xff0c;一维数组 2.1 一维数组的定义 一维数组定义有三种…

杭电OJ 2018 母牛的故事 C++

思路&#xff1a;有点像是斐波那契数列 #include <iostream> #include <vector> using namespace std; int main() { int n; vector<int> num(56); num[1] 1; num[2] 2; num[3] 3; num[4] 4; for (int i 5; i < num.size(); i) { …

MySQL:错误ERROR 1045 (28000)详解

1.问题说明 有时候我们登录Mysql输入密码的时候&#xff0c;会出现这种情况&#xff1a; mysql -u root -p Enter Password > ‘密码’ 错误&#xff1a;ERROR 1045 (28000): Access denied for user ‘root’‘localhost’ (using password: YES) 或者&#xff1a;错误…

VR元宇宙的概念|VR体验店加盟|虚拟现实设备销售

VR元宇宙是一个结合了虚拟现实&#xff08;Virtual Reality&#xff09;和增强现实&#xff08;Augmented Reality&#xff09;等技术的概念&#xff0c;代表着一个虚拟的多维度世界。它是一个由数字化的空间构成的虚拟环境&#xff0c;可以通过虚拟现实设备进行交互和探索。 元…

数据结构从入门到精通——算法的时间复杂度和空间复杂度

算法的时间复杂度和空间复杂度 前言一、算法效率1.1 如何衡量一个算法的好坏1.2 算法的复杂度 二、时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3常见时间复杂度计算举例2.4等差数列计算公式2.5等比数列计算方法 三、空间复杂度四、 常见复杂度对比五、 复杂度的oj练习…
推荐文章