docker支持多种graphDriver(联合文件系统),包括vfs,deviceMapper,overlay,overlay2,aufs等,其中最常用的是aufs,但随着linux内核3.18把overlay纳入其中后,overlay的地位就变得更换重,

目前的docker默认的存储是哦verlay2,其速度更快,实现更简单。

查看docker使用的存储文件系统;

docker info | grep "Storage Driver"

修改docker的存储文件系统类型

vim /etc/docker/daemon.json

{

"storage-driver": "overlay2"

}

overlay2是如何运作的

overlayFS将单个linux主机上的两个目录分层,并将他们显示为单个目录。这些目录称为层,统一过程称为联合安装。overlayFS指向下层目录lowerdir(镜像层)和上层目录upperdir(容器层)。

统一视图通过其自己的目录公开merged(mount挂载对外开放,可使用mount  | grep overlay2查看挂载的信息,lowerdir镜像层信息和upperdir容器层信息和workdir层信息)。

        该overlay2驱动程序原生支持多达128个较低的overlayFS层,此功能为与层相关的docker命令(docker build)提供了更好的性能docker commit,并且在后备文件系统上消耗的inode更少。

要创建容器,overlay驱动程序会组合镜像层和容器层的目录。镜像层(lowerdir)是只读的,容器层组合后是最上层的,是可读写的。


容器读写是如何使用overlay2

读文件的时候,文件不在upperdir则从lowerdir读,如果upperdir和lowerdir存在相同名称的文件,则读取upperdir中的文件。

在第一次写某个文件时,该文件只存在lowerdir中,则从lowerdir里面copy_up到upperdir层,不管文件多大,copy完再写,之后的操作就只修改upperdir层中文件的副本。

删除或者重命名镜像层的文件都只是在容器层生成whiteout文件标志。


overlay2支持多个容器访问相同文件时共用page cache,在copy_up的时候overlay2比aufs更快,因为aufs的层级多搜索会有延迟,而overlay2会有缓存机制。

优化方面可以用ssd,然后频繁的io操作,可以通过挂载volumes来做,绕过存储驱动,而且可以多个容器共享数据,持久化数据。

                

                通过下面官网介绍图知道,如果upperdir和lowerdir有同名文件时会用upperdir的文件 

docker的overlay2存储文件系统_docker overlay2

docker存储文件目录介绍

docker的存储文件目录默认为/var/lib/docker/overlay2

[root@docker2 overlay2]# ll

总用量 4

drwx------  3 root root     30 7月  29 21:19 07538ad1adc0b3bdfd11715717fafc17a4692095e495b146f3180e46d65987dc

drwx------  4 root root     55 7月  29 21:19 390f32915aa93e778fc5b407c3765066879d30f86685c45221b110f13aed9b4f

drwx------. 4 root root     55 5月  15 20:22 4cd493e0beb734394ee51db59e0e29e2502399713f62ca84b16c9e8cc2f8d3a0

drwx------. 3 root root     30 5月  15 20:12 4e8f437ef36c77b378b5d56736cde4fca5969dc5f08275b5defc1c45f0983667

drwx------  3 root root     30 5月  17 21:00 4f581962efbf4666456176106bd4be4ad294a6e43302b3fee94936d397d7f8fb

drwx------. 3 root root     30 5月  15 19:12 591ad68a7004eb28ddd0cea635505850b2b553654ae45ed4cf954146e7b58acb

drwx------  5 root root     69 7月  29 21:49 976a3aa29fb8f85ed7474b0ab7275511c7b7c2fad54613ec3c220ddc1b93c029

drwx------  4 root root     55 7月  29 16:54 976a3aa29fb8f85ed7474b0ab7275511c7b7c2fad54613ec3c220ddc1b93c029-init

drwx------. 4 root root     55 5月  15 20:22 99a4115a64a36da147e2ae653f8edfad90049761d95a91a2e8c3107223337405

drwx------  4 root root     55 7月  29 21:19 af0ca5122ff28863cde46e271728c674bdc1580f43384b6f95cea7d663215663

brw-------  1 root root 253, 0 7月  29 21:44 backingFsBlockDev

drwx------  4 root root     55 7月  29 21:19 c2761e7607341f4699fa3008f1c49aa3c45594141447959e986072165808acc2

drwx------. 2 root root   4096 7月  29 21:20 l

目录l(L的小写)存放缩写连接的目录,对应overlay2下的每层cachid目录下的diff目录,这是为了挂载命令不会超出长度。

                最底层只有diff和link文件,link文件内容是l目录里面的缩写链接名,实际就是对应diff目录,diff目录实际存放这一层的文件内容。