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存储文件目录介绍
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目录实际存放这一层的文件内容。