docker存储引擎
目前docker的默认存储引擎为overlay2,不同的存储引擎需要相应的系统支持,如需要磁盘分区的时候传递d-type文件分层功能,即需要传递内核参数开启格式化磁盘的时候的指定功能。
docker 存储引擎是以Linux 文件系统或者 数据卷管理 为基础的。
存储引擎弃用列表
官方文档:https://docs.docker.com/engine/deprecated/
状态 | 存储引擎名称 | 遗弃版本 | 移除版本 |
Deprecated | AuFS storage driver | v19.03 | - |
Deprecated | Legacy “overlay” storage driver | v18.09 | - |
Deprecated | Device mapper storage driver | v18.09 | - |
存储驱动类型
AUFS
AUFS(Another UnionFileSystem)是一种UnionFS。V2版本后更名为 advanced multi‐layered unification fileystem,即高级多层统一文件系统。所谓UnionFS就是把不同物理位置的目录合并mount到同一个目录中。简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。这种系统可以一层一层的叠加修改文件。无论底下有多少层都是只读,只有最上层的文件系统是可读写。当需要修改一个文件时,AUFS创建该文件的一个副本。使用CoWCopy-on-Write将文件从只读层复制到可写层进行修改,结果也保留在可写层、在Docker中。底下的制度层就是image,可写层就是Container。
理解AUFS
centos系统开启AUFS
# cd /etc/yum.repos.d/ # wget https://yum.spaceduck.org/kernel-ml-aufs/kernel-ml-aufs.repo # yum install kernel-ml-aufs -y # vi /etc/default/grub # 将saved改为0 GRUB_DEFAULT=0 ### 保存后重新生成grub # grub2-mkconfig -o /boot/grub2/grub.cfg ### 重启 # reboot ### 验证 # grep aufs /proc/filesystems nodev aufs
# mkdir fruits/{apple,tomato} -p # mkdir vegetables/{carrots,tomato} -p # mkdir mnt # mount -t aufs -o dirs=./fruits:./vegetables none ./mnt
Overlay
一种Union FS文件系统,Linux内核3.18后支持
Overlay2
overlay的升级版,到目前为止,所有Linux发行版推荐使用的存储类型
Devicemapper
是CentOS和RHEL的推荐存储驱动程序,但是依赖于direct-lvm,存在空间受限的问题,虽然可以通过后期配置解决;因为之前的内核版本不支持overlay2(集中在Centos/RHEL7.2之前版本);
但当前较新版本Centos和RHEL现已经支持overlay2。 device mapper存储引擎的真实案例:https://www.cnblogs.com/youruncloud/p/5736718.html
1、Devicemapper存储引擎的配置支持device-lvm(了解)
修改/etc/docker/daemon.json,添加如下配置:
{ "storage-driver": "devicemapper", "storage-opts": [ "dm.directlvm_device=/dev/xdf", "dm.thinp_percent=95", "dm.thinp_metapercent=1", "dm.thinp_autoextend_threshold=80", "dm.thinp_autoextend_percent=20", "dm.directlvm_device_force=false" ] }
配置描述
• dm.directlvm_device:设置了块设备的位置。为了存储的最佳性能以及可用性,块设备应当位于高性能存储设备(如本地 SSD)或者外部 RAID 存储阵列之上。 • dm.thinp_percent=95:设置了镜像和容器允许使用的最大存储空间占比,默认是95%。 • dm.thinp_metapercent:设置了元数据存储(MetaData Storage)允许使用的存储空间大小。默认是 1%。 • dm.thinp_autoextend_threshold:设置了 LVM 自动扩展精简池的阈值,默认是 80%。 • dm.thinp_autoextend_percent:表示当触发精简池(thin pool)自动扩容机制的时候,扩容的大小应当占现有空间的比例。 • dm.directlvm_device_force:允许用户决定是否将块设备格式化为新的文件系统。
zfs/btrfs(Oracle-2007)
目前没有广泛应用;这些文件系统允许使用高级选项,例如创建“快照”,但需要更多的维护和设置。并且每一个都依赖于正确配置的后备文件系统。
vfs
用于测试环境,适用于无法适用Cow文件系统的情况。此存储驱动程序的性能很差,通常不建议在生产中使用。
Windows Filter
Windows操作系统的存储引擎
支持的文件系统
对于Docker,支持文件系统是所在的文件系统 /var/lib/docker/
。一些存储驱动程序仅适用于特定的后备文件系统。
存储驱动 | 支持的后备文件系统 |
---|---|
overlay2 , overlay |
xfs (在ftype=1的情况下), ext4 |
aufs |
xfs , ext4 |
devicemapper |
direct-lvm |
btrfs |
btrfs |
zfs |
zfs |
vfs |
任何文件系统 |
overlay2
,,aufs
和overlay
都在文件级别而不是块级别运行。这样可以更有效地使用内存,但是在写繁重的工作负载中,容器的可写层可能会变得非常大。- 块级存储驱动器,例如
devicemapper
,btrfs
和zfs
更好地为写繁重的工作负担(虽然不如Docker volumes)执行。 - 对于许多小型写入或具有多层或深文件系统的容器,其性能
overlay
可能比更好overlay2
,但会消耗更多的inode,这可能导致inode耗尽。 btrfs
并zfs
需要大量内存。zfs
对于高密度工作负载(例如PaaS)是一个不错的选择。
docker存储引擎存储内容
overlay存储引擎中存储了容器的文件系统,如果要获取一些信息,可以通过存储引擎目录获取
启动一个容器
[root@k8s-master1 ~]# docker run -itd --name test nginx
322eceb9a6f2608513dfd2a2495f6c6be6ae55723dbbaa3867b48eb3f0088889
通过df命令获取容器的存储目录
[root@k8s-master1 ~]# df |grep merged overlay 38777348 2044644 36732704 6% /var/lib/docker/overlay2/df188ce318926c6e820e1403e46e4bde654cd7d3f16b0403a532f35eaad446aa/merged [root@k8s-master1 ~]# ll /var/lib/docker/overlay2/df188ce318926c6e820e1403e46e4bde654cd7d3f16b0403a532f35eaad446aa total 8 drwxr-xr-x 5 root root 39 Aug 11 23:29 diff -rw-r--r-- 1 root root 26 Aug 11 23:29 link -rw-r--r-- 1 root root 202 Aug 11 23:29 lower drwxr-xr-x 1 root root 39 Aug 11 23:29 merged drwx------ 3 root root 18 Aug 11 23:29 work
查看存储目录中的文件系统内容
[root@k8s-master1 ~]# ll /var/lib/docker/overlay2/df188ce318926c6e820e1403e46e4bde654cd7d3f16b0403a532f35eaad446aa/merged/ total 12 drwxr-xr-x 2 root root 4096 Jul 21 08:00 bin drwxr-xr-x 2 root root 6 Jun 13 18:30 boot drwxr-xr-x 1 root root 43 Aug 11 23:29 dev drwxr-xr-x 1 root root 41 Jul 22 18:13 docker-entrypoint.d -rwxrwxr-x 1 root root 1202 Jul 22 18:12 docker-entrypoint.sh drwxr-xr-x 1 root root 19 Aug 11 23:29 etc drwxr-xr-x 2 root root 6 Jun 13 18:30 home drwxr-xr-x 1 root root 56 Jul 22 18:13 lib drwxr-xr-x 2 root root 34 Jul 21 08:00 lib64 drwxr-xr-x 2 root root 6 Jul 21 08:00 media drwxr-xr-x 2 root root 6 Jul 21 08:00 mnt drwxr-xr-x 2 root root 6 Jul 21 08:00 opt drwxr-xr-x 2 root root 6 Jun 13 18:30 proc drwx------ 2 root root 37 Jul 21 08:00 root drwxr-xr-x 1 root root 23 Aug 11 23:29 run drwxr-xr-x 2 root root 4096 Jul 21 08:00 sbin drwxr-xr-x 2 root root 6 Jul 21 08:00 srv drwxr-xr-x 2 root root 6 Jun 13 18:30 sys drwxrwxrwt 1 root root 6 Jul 22 18:13 tmp drwxr-xr-x 1 root root 66 Jul 21 08:00 usr drwxr-xr-x 1 root root 19 Jul 21 08:00 var
获取nginx进程
[root@k8s-master1 ~]# fuser /var/lib/docker/overlay2/df188ce318926c6e820e1403e46e4bde654cd7d3f16b0403a532f35eaad446aa/merged/usr/sbin/nginx /var/lib/docker/overlay2/df188ce318926c6e820e1403e46e4bde654cd7d3f16b0403a532f35eaad446aa/merged/usr/sbin/nginx: 1586e 1638e 1639e