编者按:今天聊一聊Docker的Image(镜像)与Container(容器)的存储以及存储驱动之AUFS。

 

Docker存储驱动简介

Docker内置多种存储驱动,每种存储驱动都是基于Linux文件系统(Linux FS)或者卷管理(Volume Manager)技术。一般来说,Docker存储驱动的名称与文件系统(存储技术)同名,见下表对应关系:

AUFS简介

AUFS,起初名为AnotherUnionFileSystem,是一种UnionFS,V2版本后更名为 advanced multi‐layered unification fileystem,即高级多层统一文件系统。

AUFS是一位名为岡岛纯二郎的日本人于2006年基于UnionFS开发的,目的也是为了提高其可靠性和性能,也在AUFS上实现了一些新的概念比如写分支平衡等(writeable branchbalancing)。

纯二郎先生曾多次提交aufs到linux主干,但一直被拒绝,可纯二郎依旧日以继夜的修改代码,并不断提交,可一直没有被merge,而纯二郎最终也放弃提交代码到linux主干,从而aufs也一直没有进入linux内核。关于为何linux不要aufs,主要是aufs代码太糟糕,“dense,unreadable,and uncommented”,乱,可读性差,没注释...。

Tips:虽然AUFS没有进入Liunx内核,但是Ubuntu系统使用AUFS作为默认的存储驱动,Docker早期仅支持Ubuntu便是这个原因。

AUFS核心概念

将多个目录合并成一个虚拟文件系统,成员目录称为虚拟文件系统的一个分支(branch)。

例如,把 /tmp, /var, /opt三个目录联合挂着到 /aufs目录下,则 /aufs目录可见 /tmp, /var, /opt目录下的所有文件。而每个成员目录,则称为虚拟文件系统的一个branch。

每个branch可以指定 readwrite/whiteout‐able/readonly权限,只读(ro),读写(rw),写隐藏(wo)。一般情况下,aufs只有最上层的branch具有读写权限,其余branch均为只读权限。只读branch只能逻辑上修改。

例如,把/tmp目录和 /var目录联合挂载到 /aufs目录下, /var目录挂载为顶层branch具有rw权限,而 /tmp目录挂载为下层branch,具有ro权限。如果把 /tmp目录 /var目录 /opt目录联合挂载到 /aufs目录下,只有最顶层 /optbranch具有rw权限,下层branch均为ro权限。

Tips:mount ­t aufs ­obr=/tmp:/var:/opt none /aufs

该指令联合挂载 /tmp, /var, /opt至挂载点 /aufs,按照从左到右的顺序 /tmp位于顶层branch,而 /opt位于最底层branch,所有的branch按照顺序共同构成 /aufs栈。

AUFS每层branch可以动态的增加删除,每增加一层,下层默认置为ro,最上一层为rw。删除branch是在aufs挂载点移除,并未删除挂载目录。

Docker中的AUFS

AUFS是Docker使用的第一个存储驱动,长时间以来,一直很稳定。虽然目前Docker支持多种存储驱动,而在Ubuntu中默认使用aufs存储驱动,可以使用Docker info指令进行查看。对于Docker而言,AUFS有很多优秀的特点,比如快速启动容器,高效存储利用率,高效内存利用率等。

Docker镜像和AUFS branch对应关系

Docker镜像(Image)是由一个或多个AUFS branch组成,并且所有的branch均为只读权限。简单来说,AUFS所有robranch按照一定顺序堆积构成Docker Image镜像。

在运行容器的时候,创建一个AUFS branch位于image层之上,具有rw权限,并把这些branch联合挂载到一个挂载点下。这就是Docker能够一个镜像运行多个容器的原理所在。

例如,Image有3个目录位于 /var/lib/docker/aufs/diff/文件夹内,当基于该Image创建容器时,创建一个容器运行目录,同样位于/var/lib/docker/aufs/diff/目录下,并使用aufs联合挂载Image目录和Container目录到 /var/lib/docker/aufs/mnt/目录下。

每一个目录在aufs内都是一层branch,只有顶层容器branch可读写,下层Image branch均只读。创建多个容器时,只需创建多个容器运行目录,使用aufs把容器运行目录挂载在Image目录之上,即实现一个Image运行多个Container。

如上图中基于同一个Image运行两个容器,低层Image一致,每启动一个新容器,便会新建一个目录作为aufs branch并与Image branch进行联合挂载。

容器文件读写与删除

当容器需要修改一个文件,而该文件位于低层branch时,顶层branch会直接复制低层branch的文件至顶层再进行修改,而低层的文件不变,这种方式即是CoW技术(写复制),AUFS默认支持Cow技术。

当容器删除一个低层branch文件时,只是在顶层branch对该文件进行重命名并隐藏,实际并未删除文件,只是不可见,这种方式即AUFS的whiteout(写隐藏)。

下图所示,容器层所见file1文件为镜像层文件,当需要修改file1时,会从镜像层把文件复制到容器层,然后进行修改,从而保证镜像层数据的完整性和复用性。

下图所示,当需要删除file1时,由于file1是镜像层文件,容器层会创建一个 .wh前置的隐藏文件,从而实现对file1的隐藏,实际并未删除file1,从而保证镜像层数据的完整性和复用性。

Docker本地存储目录

Docker镜像存在在/var/lib/docker/aufs/diff/目录下。/var/lib/docker/aufs/layers/目录存储image的元信息,主要是image的每一层layer组织顺序(AUFS branch堆积顺序)。

Docker容器挂载点位于/var/lib/docker/aufs/mnt/目录下,该目录即为AUFS联合挂载点。

Tips:早期镜像的每一层数据存储在/var/lib/docker/aufs/diff/目录下,镜像ID与目录名同名,从docker v1.10 版本之后镜像ID不再与 /var/lib/docker/aufs/diff/目录下的目录同名,而是采用一个安全的hash值作为镜像存储文件夹名称。

总结

采用AUFS作为 Docker的容器存储驱动,使用AUFS技术,能够提供如下好处:

  • 节省存储空间:多个容器可以共享基础镜像(Base Image)存储;

  • 快速部署:如果要部署多个容器,基础镜像(Base Image)可以避免多次拷贝;

  • 内存更省:因为多个容器共享Base Image,以及OS的Disk缓存机制,多个容器中的进程命中缓存内容的几率大大增加;

  • 允许在不更改基础镜像的同时修改其目录中的文件:所有写操作都发生在最上层的writeable层中,这样可以大大增加Base Image能共享的文件内容。

 
往期回顾:

【容器系列】补脑专用,容器生态圈脑图大放送

有容云-【原理】Docker存储驱动之AUFS的更多相关文章

  1. Docker存储驱动之AUFS简介

    简介 AUFS是曾是Docker默认的首选存储驱动.它非常稳定.有很多真实场景的部署.很强的社区支持.它有以下主要优点: 极短的容器启动时间. 有效的存储利用率. 有效的内存利用率. 虽然如此,但由于 ...

  2. 聊一聊docker存储驱动

    目录 镜像的分层特性 容器读写层的工作原理 写时复制 用时配置 Docker存储驱动 AUFS OverlayFS Devicemapper 常用存储驱动对比 AUFS VS OverlayFS Ov ...

  3. DOCKER学习_006:Docker存储驱动

    一 镜像的分层特性 在说docker的文件系统之前,我们需要先想清楚一个问题.我们知道docker的启动是依赖于image,docker在启动之前,需要先拉取image,然后启动.多个容器可以使用同一 ...

  4. Docker存储驱动之OverlayFS简介

    简介 OverlayFS是一种和AUFS很类似的文件系统,与AUFS相比,OverlayFS有以下特性: 1) 更简单地设计: 2) 从3.18开始,就进入了Linux内核主线: 3) 可能更快一些. ...

  5. Docker存储驱动之Device Mapper简介

    Device Mapper是一个基于kernel的框架,它增强了很多Linux上的高级卷管理技术.Docker的devicemapper驱动在镜像和容器管理上,利用了该框架的超配和快照功能.为了区别, ...

  6. Docker存储驱动之总览

    简介 本文会介绍Docker存储驱动的特性,别列出现在已经支持的存储驱动,最后,会介绍如果选型适合你的存储驱动. 可插拔的存储驱动架构 Docker的存储驱动架构是可插拔的,可以让你很方便的将适合你环 ...

  7. Docker存储驱动Device Mapper,Overlay,AUFS

    Docker存储驱动之Device Mapper简介 - BookShu - 博客园https://www.cnblogs.com/styshoo/p/6528762.html Docker存储驱动之 ...

  8. docker 存储驱动(storage driver)知识总结

    http://www.sohu.com/a/101016494_116235 一,先看docker镜像是如何构建和存储. 下面是ubuntu:15.04的镜像分层.一共是4层,每一层都由一些只读并且描 ...

  9. Docker存储驱动之Btrfs简介

    简介 Btrfs是下一代的copy-on-write文件系统,它支持很多高级特性,使其更加适合Docker.Btrfs合并在内核主线中,并且它的on-disk-format也逐渐稳定了.不过,它的很多 ...

随机推荐

  1. 基于 SpringBoot 的 FileService

    fileservice file upload download 1.支持多种存储服务器上传.下载 2.支持大文件切片上传 3.存储记录信息使用 redis记录, 文件id可用于与业务数据库关联 4. ...

  2. 【Spring源码解析】—— 策略模式在Spring中的应用

    一.         什么是策略模式 策略模式的定义/含义:策略本身就是为了实现某一个目标而采取的一种工作方式,因此只要能够达成目标,则采取哪一种策略都可以:因此多种实际的策略之间是相互平行的. 注意 ...

  3. Linux就该这么学---第一课 20190705

    要认真学习,认真完成作业,最主要是坚持,我感觉自己坚持这个能力欠缺,要主动改正. 还想说一句,以前我是20期学员,后面没有时间学习了,现在到22期了,我要坚持学习完成,坚持 坚持 坚持!!! 现在分享 ...

  4. C# 位运算及实例计算

    前言: 平时在实际工作中很少用到这个,虽然都是一些比较基础的东西,但一旦遇到了,又不知所云.刚好最近接触了一些相关这方面的项目,所以也算是对 这些内容重新温习实践了一遍.所以这篇不仅作为个人备忘,也分 ...

  5. HihoCoder 1496:寻找最大值(思维DP)

    http://hihocoder.com/problemset/problem/1496 题意:中文. 思路:一开始做有一种想法,把所有的数都变成二进制后,最优的情况肯定是挑选所有数中最高位的1能同时 ...

  6. Innovus Lab和Lab Guide下载地址 | Innovus教程 - Flow系列 - 数据准备

    本文转自:自己的微信公众号<集成电路设计及EDA教程> <Innovus Lab和Lab Guide下载地址 |    Innovus教程 - Flow系列 - 数据准备>   ...

  7. 在eclipse中使用git创建本地库,以及托管项目到GitHub超详细教程

    关于安装git的教程,由于比较简单,并且网上教程特别多,而且即使不按照网上教程,下载好的windows版本git,安装时候一路默认设置就行. 安装好之后,在桌面上有git图标:右键菜单中有Git Ba ...

  8. 《ElasticSearch6.x实战教程》正式推出(附图书抽奖)

    经过接近1个月的时间,ElasticSearch6.x实战教程终于成册.这本实战教程小册有很多不足(甚至可能有错误),也是第一次完整推出一个系列的教程. 1年前,我开始真正接触ES,在此之前仅停留在知 ...

  9. 基于C#的机器学习--微基准测试和激活功能

    本章我们将学习以下内容: l  什么是微基准测试 l  如何将它应用到代码中 l  什么是激活函数 l  如何绘制和基准测试激活函数 每个开发人员都需要有一个好的基准测试工具.质量基准无处不在;你们每 ...

  10. Adaboost原理推导

    Adaptive Boosting是一种迭代算法.每轮迭代中会在训练集上产生一个新的学习器,然后使用该学习器对所有样本进行预测,以评估每个样本的重要性(Informative).换句话来讲就是,算法会 ...