docker存储驱动

news2024/12/27 1:19:46

目录

一、写时复制和用时分配

二、联合文件系统

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.coloradmin.cn/o/1472174.html

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

相关文章

sqllabs的order by注入

当我们在打开sqli-labs的46关发现其实是个表格,当测试sort等于123时,会根据列数的不同来进行排序 我们需要利用这个点来判断是否存在注入漏洞,通过加入asc 和desc判断页面有注入点 1、基于使用if语句盲注 如果我们配合if函数,表达…

《Docker 简易速速上手小册》第4章 Docker 容器管理(2024 最新版)

文章目录 4.1 容器生命周期管理4.1.1 重点基础知识4.1.2 重点案例:启动并管理 Python Flask 应用容器4.1.3 拓展案例 1:调试运行中的容器4.1.4 拓展案例 2:优雅地停止和清理容器 4.2 容器数据管理与持久化4.2.1 重点基础知识4.2.2 重点案例&a…

IT行业风向让人琢磨不透,一端狂裁,一端狂吸收……

2024年伊始,全球科技行业显然又掀起了新一波的裁员潮。尽管这轮裁员潮来得不如去年年初那样猛烈,但依然不免令不少人感到措手不及…… 甚至有人开工第一天收到的并不是开门红包,而是裁员说明书: 以前一直以为年前被裁,…

甲基二十四聚乙二醇叠氮,mPEG24 N3,可以和含有 Alkyne 基团的分子反应

您好,欢迎来到新研之家 文章关键词:2563873-82-3,m-PEG24-azide,mPEG24 N3,甲基二十四聚乙二醇叠氮,甲基 PEG24 叠氮 一、基本信息 【产品简介】:M-PEG24-azide is a click chemical reagent…

idea集成git(实用篇)

0.Git常用命令 Git常用命令-CSDN博客 1.下载git Git - Downloads 一路傻瓜式安装即可(NEXT) 2.软件测试 在Windows桌面空白处,点击鼠标右键,弹出右键菜单 Git软件安装后,会在右键菜单中增加两个菜单 Git GUI He…

2024022502-数据库绪论

数据库绪论 数据管理的三个阶段 人工管理阶段 文件系统阶段 数据库系统阶段 基本术语 数据(Data) 计算机用来描述事物的记录(文字.图形.图像.声音)数据的形式本身并不能完全表达其内容&am…

LeetCode第二题: 两数相加

文章目录 题目描述示例 解题思路 - 迭代法Go语言实现 - 迭代法算法分析 解题思路 - 模拟法Go语言实现 - 模拟法算法分析 解题思路 - 优化模拟法主要方法其他方法的考虑 ‍ 题目描述 给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方…

第三百六十八回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容,本章回中将介绍如何获取时间戳.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

alembic

alembic是sqlalchemy的作者开发的。 用来做OMR模型与数据库的迁移与映射。 第一个,alembic的所有命令都是以alembic开头 第二,alembic的迁移文件也是通过版本进行控制的。首先,通过pip install alembic进行安装。以下将解释alembic的用法 方…

Linux内核网络

文章目录 前言网络协议栈图解功能 发送Linux内核网络数据包图解流程 接收Linux内核网络数据包图解流程 最后 前言 你好,我是醉墨居士,因为Linux内核涉及的内容极多,我们初学者如果一上来就开始深挖细节,很有可能会在Linux内核代码…

如何使用Axure RP制作web页面并实现无公网ip远程访问——“cpolar内网穿透”

文章目录 前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4.2 启动website隧道4.3 获取公网URL地址4.4. 公网远程访问内网web站点4.5 配置固定二级子域名公网访问内网web站点4.5.1创建一条固定…

NFTScan | 02.19~02.25 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2024.02.19~ 2024.02.25 NFT Hot News 01/ LINE NEXT 与 ReadON 建立战略合作伙伴关系,将为 DOSI 用户提供创新数字产品 2 月 19 日,日本社交巨头 LINE 旗下 NFT …

lv20 QT入门与基础控件 1

1 QT简介 QT是挪威Trolltech开发的多平台C图形用户界面应用程序框架 典型应用 2 工程搭建 2.1 新建ui工程 不要写中文路径 2.1 不勾选UI(主讲) 3 QT信号与槽机制 语法:Connect(A, SIGNLA(aaa()), B, SLOT(bbb()))…

react+canvas实现刮刮乐效果

话不多说,直接看代码吧 import { useEffect } from react; import styles from ./index.less;export default function Canvas() {function init() {let gj document.querySelector(.gj);let jp document.querySelector(#jp) as HTMLElement;let canvas documen…

HQYJ 2024-2-26 作业

1.整理链表的代码 link.stack.h文件 #ifndef __LINK_STACK_H__ #define __LINK_STACK_H__ #include<stdio.h> #include<stdlib.h> typedef int datatype; typedef struct link_stack {datatype data;struct link_stack *next;}link_stack,*link_p; typedef struc…

NASA Earthdata wget批量下载

1 wegt下载 GNU Wget 1.21.4 for Windows (eternallybored.org) 2 创建your .urs_cookies and .dodsrc文件 只需要创建.urs_cookies文件 其实&#xff0c;通过txt可以直接创建 这个文件你想放到哪里&#xff0c;就放到哪里 Create .urs_cookies file: On Mac/Linux: cd ~ o…

[计算机网络]--IP协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、IP协议…

YOLOv9中“CBLinear”的结构!

ADown结构出炉啦&#xff0c;收藏起来写论文用&#xff01; 1.代码&#xff1a; 代码路径&#xff1a;yolov9-main->models->common.py&#xff0c;代码如下&#xff1a; class CBLinear(nn.Module):def __init__(self, c1, c2s, k1, s1, pNone, g1): # ch_in, ch_outs…

微信小程序本地开发

微信小程序本地开发时不需要在小程序后台配置服务器域名直接在小程序项目中填写后端在本机的IP地址和端口号 如图&#xff08;第一步&#xff09; 填写地址后发现报错&#xff0c;url不是合法域名&#xff0c;则在详情设置不校验合法域名 如图&#xff08;第二歩&#xff09;…

提升Vue3应用效率的秘诀:深入比较ref与reactive!

ref 和 reactive 是 Vue3 中实现响应式数据的核心 API。ref 用于包装基本数据类型&#xff0c;而 reactive 用于处理对象和数组。尽管 reactive 似乎更适合处理对象&#xff0c;但 Vue3 官方文档更推荐使用 ref。 我的想法&#xff0c;ref就是比reactive好用&#xff0c;官方也…