Docker的存储驱动

一、原理说明

写时复制(CoW)

CoW就是copy-on-write,表示只在需要写时才去复制,这个是针对已有文件的修改场景。比如基于一个image启动多个Container,如果为每个Container都去分配一个image一样的文件系统,那么将会占用大量的磁盘空间。而CoW技术可以让所有的容器共享image的文件系统,所有数据都从image中读取,只有当要对文件进行写操作时,才从image里把要写的文件复制到自己的文件系统进行修改。所以无论有多少个容器共享同一个image,所做的写操作都是对从image中复制到自己的文件系统中的复本上进行,并不会修改image的源文件,且多个容器操作同一个文件,会在每个容器的文件系统里生成一个复本,每个容器修改的都是自己的复本,相互隔离,相互不影响。使用CoW可以有效的提高磁盘的利用率。

了解了写时复制,就应该注意一个问题:如果第一次修改镜像层内包含的文件,文件的size很大.会造成大量的磁盘IO的开销.所以不建议将需要修改的大文件,集成到镜像内.可以采用数据卷的方式.

用时分配(allocate-on-demand)

用时分配是用在原本没有这个文件的场景,只有在要新写入一个文件时才分配空间,这样可以提高存储资源的利用率。比如启动一个容器,并不会为这个容器预分配一些磁盘空间,而是当有新文件写入时,才按需分配新空间。

Docker存储驱动的作用

将这些分层的镜像文件堆叠起来,并且提供统一的视图.使container的文件系统看上去和我们普通的文件系统没什么区别。
当创建一个新的容器的时候,实际上是在镜像的分层上新添加了一层container layer(容器层).之后所有对容器产生的修改,实际都只影响这一层。

注意
容器层:读写层(可写层)
镜像层:只读层

二、驱动模式

  • 目前,Docker支持OverlayFS,AUFS,Btrfs,Device Mapper,VFS,ZFS等存储驱动
  • docker的存储驱动目前并没有一个通用的,完美的,适用于所有环境的存储驱动.所以需要根据自己的环境来有所选择.
  • 存储驱动在不断的改进与发展
  • 如果从稳定性上的考量,在安装docker的时候会默认根据你的系统环境配置选择一个存储驱动.通常来说使用这个默认的驱动将减少你遇到bug的机会.
  • 如果你的团队使用过RHEL及其相关分支,你可能有关于LVM和Device Mapper的经验.这时建议你使用devicemapper存储驱动.
image.png

你可能感兴趣的:(Docker的存储驱动)