原创 猜猜用什么来存储 Docker 的镜像?

发布时间:2021-06-24 11:24:28 浏览 134 来源:猿笔记 作者:夕颜111

    计算机的组成包括了CPU、内存、磁盘。所以docker的容器和镜像也必然使用了文件来存储。下图是一半的Linux存储堆叠图,笔者只重点摘抄了本文要分析绿色的文件系统类型部分:+一方面给用户层提供一些标准的系统调用open、read、write来操作文件。+一方面对底层的文件系统进行约束:+磁盘文件系统:+网络文件系统,用于访问网络中其他设备上的文件,叠加在其他文件系统之上的一种文件系统,通过这些文件可以访问系统或磁盘的硬件数据,而是把数据包装成文件来访问,所以不能把伪文件系统当做存储空间来操作。


    ##1.写在前面

    “不是你想用什么,而是你有什么,你能用什么?」

    反复思考这句话的时候,突然意识到不是docker选择用文件来存储镜像,而是除了文件以外,docker别无其他选择。

    从宏观上看,一台计算机的构成包括CPU、内存和磁盘。CPU负责逻辑,内存是易失性存储,所以只能通过磁盘存储。

    从微观上分析,「Linux一切皆文件」,而这其中文件的抽象包括了对磁盘文件系统的抽象。

    总而言之,docker的容器和图像必须通过文件存储。

    他山之石可以攻玉,他山之石可以攻玉。诗经·潇雅·何铭

    ##2.分析文件系统

    ###2.1文件系统的组成

    文件系统由两三层组成,有时这些层被显示分开,有时又合并在一起。

    ###2.2文件系统的类型

    下图是Linux存储栈图的一半。作者只提取了本文要分析的绿色文件系统类型。感兴趣的读者可以点击linuxstoragestackdiagram](

    上图的VFS就是Logicalfilesystem和Virtualfilesystem的结合,它

    +一方面,用户层提供了一些标准的系统调用来打开、读取和写入操作文件

    +一方面,它约束底层文件系统,并提供统一的抽象接口和方法

    文件系统的类型包括:

    +磁盘文件系统:基于物理存储设备的文件系统,用于管理设备的存储空间,如ext2、ext4、xfs等。

    +网络文件系统:用于访问网络中其他设备上的文件,如NFS和smbfs。

    +堆叠文件系统:\ u003Cfontcolor = " red " >叠加在其他文件系统上的文件系统,它本身不存储数据,但扩展了较低的数据

    +伪文件系统:不管理真实存储空间,所以叫伪文件。它组织一些虚拟目录和文件,通过它们可以访问系统或磁盘的硬件数据。它不是用来存储数据的,而是把数据打包成文件供访问,所以不可能把伪文件系统作为存储空间来操作,比如proc,sysfs等。

    +特殊文件系统:特殊文件系统也是伪文件系统,更像是在用的磁盘文件系统,只是读写内存而不是磁盘设备。例如tmpfs和ramfs。

    +用户文件系统:也称为FUSE,它为开发人员提供了一种在用户空间实现文件系统而不修改内核的方法。这种方法更灵活,但效率较低。FUSE直接面向用户文件系统,不调用Block层。

    ###2.3存储驱动程序

    docker选择堆栈式文件系统作为其存储,最开始使用的AUFS的实现,但是由于AUFS并未并入Linux内核,以及兼容性问题,Docker0.7版本中引入了存储驱动的概念,目前docker支持**AUFS、Btrfs、Devicemapper、OverlayFS、OverlayFS2、ZFS**存储驱动。

    1.存储驱动程序用于什么?

    docker的镜像由许多层组成。当容器运行时,存储驱动程序负责组装这些层,并为运行时提供可写层。不同的存储驱动会影响容器的IO性能和占用的磁盘大小。

    注意:所有存储驱动程序都使用CoW](

    2.各种存储驱动的适用场景?

    |技术|存储驱动程序名称|适用场景|

    |:------------|:------------------|:---------------------------------|

    |OverlayFS|overlayoroverlay2|大并发但是少IO的情景|

    |AUFS|aufs|大并发但是少IO的情景|

    |Btrfs|btrfs|不适合在高密度容器的PaaS平台上使用|

    |DeviceMapper|devicemapper|密集型IO的场景|

    |ZFS|zfs|适合PaaS和高密度的场景|

    ##3.极端测量后视镜

    在对文件系统有了大致的了解之后,让我们先来思考一个问题:

    ###3.1查看本机上的可用图像

    **不用dockerimages这个命令,你如何查镜像?**

    答:因为我们知道docker的图像存储在文件中,所以我们只需要找到存储它们的目录。

    注意:在mac上找不到以下操作。偷偷找了个云主机。

    首先,执行以下命令找到docker存储数据的根目录。

    shell#dockerinfo|grep"DockerRootDir"DockerRootDir:/var/lib/docker

    然后,切换到`/var/lib/docker`目录执行

    shell#cd/var/lib/docker&lsbuilderbuildkitcontainerdcontainersimagenetworkoverlay2pluginsruntimesswarmtmptrustvolumes#cdimage/overlay2&lsdistributionimagedblayerdbrepositories.json

    最后,发现`repositories.json`文件里记录了本机可用的docker镜像。

    shell#catrepositories.json|jq.{"Repositories":{"agility-playbooks":{"agility-playbooks:19-09":"sha256:8859205bb9ffbf9e935de7516ecba9f3f82459cf31ae21e69848dad055f1ec2c"},"xx.applet":{"xx.applet:v1":"sha256:c0519345d5275a721075d1d0ca3398b4cfe86fdb39e6785d61c9f23b6014b180"},"xx2.applet":{"xx2.applet:v1":"sha256:209dad35aa9f65c10dc99f5961f7cd195e0b6e1130d53bd29f4b132070c5fda5"},}

    ###3.2分析镜像layers组成

    使用`dockerinspect`可以查看`Returnlow-levelinformationonDockerobjects`

    shell#dockerinspect8859205bb9ffbf9e935de7516ecba9f3f82459cf31ae21e69848dad055f1ec2c……"GraphDriver":{"Data":{"LowerDir":"/data/docker/overlay2/ba5ba156a3671fbe5783a3828c1744f0e2228eef0609a49194d3581534c86a53/diff","MergedDir":"/data/docker/overlay2/253b3ee790492b6ec7626c0cf36eb9ffd17142f4ec1bfb570570d7e7ec5242e5/merged","UpperDir":"/data/docker/overlay2/253b3ee790492b6ec7626c0cf36eb9ffd17142f4ec1bfb570570d7e7ec5242e5/diff","WorkDir":"/data/docker/overlay2/253b3ee790492b6ec7626c0cf36eb9ffd17142f4ec1bfb570570d7e7ec5242e5/work"},"Name":"overlay2"},……

    可以看出,docker在该云主机上使用的存储驱动程序重叠2。

    * *想多了,指挥视察的内容哪里来的?**

    将文件目录切换到imagedb/content/sha256,使用xd(该命令用于以二进制或十六进制显示文件内容)查看文件内容。我找到了。

    shell[root@docker/var/lib/docker/image/overlay2/imagedb/content/sha256]#ls|grep"8859205bb9ffbf9e935de7516ecba9f3f82459cf31ae21e69848dad055f1ec2c"8859205bb9ffbf9e935de7516ecba9f3f82459cf31ae21e69848dad055f1ec2c[root@docker/var/lib/docker/image/overlay2/imagedb/content/sha256]#xxd8859205bb9ffbf9e935de7516ecba9f3f82459cf31ae21e69848dad055f1ec2c0000000:7b22617263686974656374757265223a{"architecture":0000010:2261726d3634222c22636f6e66696722"arm64","config"0000020:3a7b22486f73746e616d65223a22222c:{"Hostname":"",0000030:22446f6d61696e6e616d65223a22222c"Domainname":"",0000040:2255736572223a22222c224174746163"User":"","Attac0000050:68537464696e223a66616c73652c2241hStdin":false,"A…………0001cc0:6c696e7578222c22726f6f746673223alinux","rootfs":0001cd0:7b2274797065223a226c617965727322{"type":"layers"0001ce0:2c22646966665f696473223a5b227368,"diff_ids":["sh0001cf0:613235363a3165643531323161353230a256:1ed5121a5200001d00:3335613938306335343965653039636435a980c549ee09cd0001d10:37393361343434376635656162633232793a4447f5eabc220001d20:33393962653262366531316666343962399be2b6e11ff49b0001d30:3035316438222c227368613235363a32051d8"]}}

    ##4.推特

    依稀记得在看《激动人心的报价》第一季的时候采访过李浩源:

    “你认为天赋和努力更重要?就是这个问题,昨天终于找到了更好的答案。

    “初中刷完了301套试题,高中买了市面上能买到的试卷。天赋可以让人发光,但努力也可以。”

    ——夏林西

    \ u003Cfontcolor = ' red '天赋造就郝

作者信息

夕颜111 [等级:3] 软件开发工程师
发布了 3 篇专栏 · 获得点赞 8 · 获得阅读 680

相关推荐 更多