第二底层中,lower文件指出了该层的组成。该目录还有diff、merged和work目录。
$ ls /var/lib/docker/overlay2/223c2864175491657d238e2664251df13b63adb8d050924fd1bfcdb278b866f7 diff link lower merged work $ cat /var/lib/docker/overlay2/223c2864175491657d238e2664251df13b63adb8d050924fd1bfcdb278b866f7/lower l/6Y5IM2XC7TSNIJZZFLJCS6I4I4 $ ls /var/lib/docker/overlay2/223c2864175491657d238e2664251df13b63adb8d050924fd1bfcdb278b866f7/diff/ etc sbin usr var运行容器包含的目录同样有着类似的文件和目录。注意在lower文件中,使用:符号来分割不同的底层,并且顺序是从高层到底层。
$ ls -l /var/lib/docker/overlay/<directory-of-running-container> $ cat /var/lib/docker/overlay/<directory-of-running-container>/lower l/DJA75GUWHWG7EWICFYX54FIOVT:l/B3WWEFKBG3PLLV737KZFIASSW7:l/JEYMODZYFCZFYSDABYXD5MF6YO:l/UL2MW33MSE3Q5VYIKBRN4ZAGQP:l/NFYKDW6APBCCUCTOUSYDH4DXAT:l/6Y5IM2XC7TSNIJZZFLJCS6I4I4mount的结果如下:
$ mount | grep overlay overlay on /var/lib/docker/overlay2/9186877cdf386d0a3b016149cf30c208f326dca307529e646afce5b3f83f5304/merged type overlay (rw,relatime, lowerdir=l/DJA75GUWHWG7EWICFYX54FIOVT:l/B3WWEFKBG3PLLV737KZFIASSW7:l/JEYMODZYFCZFYSDABYXD5MF6YO:l/UL2MW33MSE3Q5VYIKBRN4ZAGQP:l/NFYKDW6APBCCUCTOUSYDH4DXAT:l/6Y5IM2XC7TSNIJZZFLJCS6I4I4, upperdir=9186877cdf386d0a3b016149cf30c208f326dca307529e646afce5b3f83f5304/diff, workdir=9186877cdf386d0a3b016149cf30c208f326dca307529e646afce5b3f83f5304/work) 容器使用overlay读写 有三种场景,容器会通过overlay只读访问文件。
容器层不存在的文件。如果容器只读打开一个文件,但该容器不在容器层(upperdir),就要从镜像层(lowerdir)中读取。这会引起很小的性能损耗。
只存在于容器层的文件。如果容器只读权限打开一个文件,并且容器只存在于容器层(upperdir)而不是镜像层(lowerdir),那么直接从镜像层读取文件,无额外性能损耗。
文件同时存在于容器层和镜像层。那么会读取容器层的文件,因为容器层(upperdir)隐藏了镜像层(lowerdir)的同名文件。因此,也没有额外的性能损耗。
有以下场景容器修改文件。
第一次写一个文件。容器第一次写一个已经存在的文件,容器层不存在这个文件。overlay/overlay2驱动执行copy-up操作,将文件从镜像层拷贝到容器层。然后容器修改容器层新拷贝的文件。
然而,OverlayFS工作在文件级别而不是块级别。也就是说所有的OverlayFS的copy-up操作都会拷贝整个文件,即使文件非常大但却只修改了一小部分,这在容器写性能上有着显著的影响。不过,有两个方面值得注意:
▷ copy-up操作只发生在第一次写文件时。后续的对同一个文件的写操作都是直接针对拷贝到容器层的那个新文件。
▷ OverlayFS只工作在两层中。这比AUFS要在多层镜像中查找时性能要好。
删除文件和目录。删除文件时,容器会在镜像层创建一个whiteout文件,而镜像层的文件并没有删除。但是,whiteout文件会隐藏它。
容器中删除一个目录,容器层会创建一个不透明目录。这和whiteout文件隐藏镜像层的文件类似。
重命名目录。只有在源路径和目的路径都在顶层容器层时,才允许执行rename操作。否则,会返回EXDEV。
因此,你的应用需要能够处理EXDEV,并且回滚操作,执行替代的“拷贝和删除”策略。
为了给Docker配置overlay存储驱动,你的Docker host必须运行在Linux kernel3.18版本之上,而且加载了overlay内核驱动。对于overlay2驱动,kernel版本必须在4.0或以上。OverlayFS可以运行在大多数Linux文件系统之上。不过,现在最建议在生产环境中使用ext4。
下面的步骤讲述了如何在Docker host中配置使用OverlayFS。
注意:在开始配置之前,如果你已经在使用Docker daemon,并且有一些想保留的镜像,简易你push它们到Docker hub中。
1) 如果Docker daemon正在运行,需要先停止其运行。