「不是你想要用什么,而是你有什么,能用的是什么?」
反复思考这句话的时候,突然意识到不是docker选择用文件来存储镜像,而是除了文件以外,docker别无其他选择。
从宏观来分析,计算机的组成包括了CPU、内存、磁盘,排除法CPU负责逻辑,而内存又是易失存储,所以只能用磁盘来存储。
从微观上分析,「Linux一切皆文件」,而这其中文件的抽象包括了对磁盘文件系统的抽象。
综上所述,所以docker的容器和镜像也必然使用了文件来存储。
2.1文件系统的组成
文件系统由两层或者三层组成,有些时候这些层次是被显示地分割开来的,有些时候则是被组合在一起的。

2.2文件系统的类型

上图的VFS就是Logicalfilesystem和Virtualfilesystem的结合,它
一方面给用户层提供一些标准的系统调用open、read、write来操作文件
一方面对底层的文件系统进行约束,提供统一的抽象接口和方式
文件系统的类型包括:
磁盘文件系统:基于物理存储设备的文件系统,用来管理设备的存储空间,如ext2,ext4,xfs等
网络文件系统:用于访问网络中其他设备上的文件,如NFS,smbfs等。
堆栈式文件系统:叠加在其他文件系统之上的一种文件系统,本身不存储数据,而是对下层数据的扩展
伪文件系统:并不管理真正的存储空间,所以被称为伪文件。它组织了一些虚拟的目录和文件,通过这些文件可以访问系统或磁盘的硬件数据。它不是用来存储数据的,而是把数据包装成文件来访问,所以不能把伪文件系统当做存储空间来操作,比如proc、sysfs等。
特殊文件系统:特殊文件系统也是一种伪文件系统,它使用起来更像是一个磁盘文件系统,但是读写的是内存而不是磁盘设备。如tmpfs、ramfs等。
用户文件系统:也叫做FUSE,它提供一种方式可以让开发者在用户空间实现文件系统,而不需要修改内核。这种方式更加灵活,但是效率更低。FUSE直接面向的是用户文件系统,也不会调用Block层。
2.3存储驱动
docker选择堆栈式文件系统作为其存储,最开始使用的AUFS的实现,但是由于AUFS并未并入Linux内核,以及兼容性问题,版本中引入了存储驱动的概念,目前docker支持AUFS、Btrfs、Devicemapper、OverlayFS、OverlayFS2、ZFS存储驱动。
存储驱动是用来做什么的?
docker的镜像是由许多layers共同组成。在容器运行时,组装这些layers并且对运行时提供可写层是存储驱动负责的事情,不同的存储驱动会影响容器的IO性能以及占用磁盘的大小。
各类存储驱动的适用场景?

对文件系统有了一个大致的了解以后,让我们先来思考一个问题:
3.1查看本机可用镜像
不用dockerimages这个命令,你如何查镜像?
答:既然知道docker的镜像是用文件存储,所以只要找到存储它们的目录不就解决了嘛。
首先,执行下面的命令,找到docker存储数据的根目录。
cd/var/lib/dockerlsbuilderbuildkitcontainerdcontainersimagene|jq.{"Repositories":{"agility-playbooks":{"agility-playbooks:19-09":"sha256:8859205bb9ffbf9e935de7516ecba9f3f82459cf31ae21e69848dad055f1ec2c"},"":{":v1":"sha256:c0519345d5275a721075d1d0ca3398b4cfe86fdb39e6785d61c9f23b6014b180"},"":{":v1":"sha256:209dad35aa9f65c10dc99f5961f7cd195e0b6e1130d53bd29f4b132070c5fda5"},}
3.2分析镜像layers组成
使用dockerinspect可以查看Returnlow-levelinformationonDockerobjects
ls|grep"8859205bb9ffbf9e935de7516ecba9f3f82459cf31ae21e69848dad055f1ec2c"8859205bb9ffbf9e935de7516ecba9f3f82459cf31ae21e69848dad055f1ec2c[root@docker/var/lib/docker/image/overlay2/imagedb/content/sha256]#xxd8859205bb9ffbf9e935de7516ecba9f3f82459cf31ae21e69848dad055f1ec2c0000000:7b226656374757265223a{"architecture":0000010:2261726d3634222c22636f6e66696722"arm64","config"0000020:3a7b22486f73746e616d65223a22222c:{"Hostname":"",0000030:22446f6d61696e6e616d65223a22222c"Domainname":"",0000040:2255736572223a22222c224174746163"User":"","Attac0000050:68537464696e223a66616c73652c2241hStdin":false,"A…………0001cc0:6c696e7578222c22726f6f746673223alinux","rootfs":0001cd0:7b2274797065223a226c6{"type":"layers"0001ce0:2c22646966665f696473223a5b227368,"diff_ids":["sh0001cf0:613235363a31656435330a256:1ed5121a5200001d00:33356343965653039636435a980c549ee09cd0001d10:373933635656162633232793a4447f5eabc220001d20:333939626532623665362399be2b6e11ff49b0001d30:3035316438222c227368613235363a32051d8"]}}
4.碎碎念依稀记得在看《令人心动的Offer》第一季的时候,面试李浩源的问题:
「你认为天赋和努力,哪个更重要?」就是这个问题在昨天我终于找到了一个我更加喜欢的答案。
「初中我刷完了301套试题,高中我买了市面上能买到的卷子,天赋能让一个人闪闪发光,但努力也能」——夏林希
天赋让浩源同学闪闪发光,但是努力才是让普普通通的我们发光的钥匙。(ps反思,这篇文章写得主题不够清晰,后面要好好改正。嗯,就这样,今天也是开心的一天哦
Docker容器与镜像的存储
Filesystem
镜像格式二十年:从Knoppix到OCI-Image-v2
深入理解ext4等Linux文件系统
LinuxStorageStackDiagram
详解Linux中的虚拟文件系统
LinuxStorageStackDiagram
Aboutstoragedirvers
Linux中”一切皆文件“是什么意思
Docker的五种存储驱动原理及其应用场景
版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。