14. Docker引擎 - Docker与AUFS实践

AUFS是Docker最早支持的, 非常稳定, 在生产环境大量部署, 有强大的社区支持
它让

  • 加快了容器的启动时间
  • 高效地使用存储
  • 高效的使用内存

但有部分Linux发行版不支持它, 因为它并没有进入Linux内核

镜像分层与AUFS共享

AUFS是一个联合文件系统, 它将Linux上的多个目录互相叠加起来, 提供一个统一的视角, AUFS使用union mount 实现这些功能.
AUFS通过一个挂载点, 将多个目录叠加起来, 使用一个统一的视角暴露出来.

使用AUFS的容器读写

AUFS在文件层面上进行操作, 所以哪怕一个文件只需修改一小部分, 整个文件都会被复制, 如果修改的文件很大或者处于较低的镜像层级, 那么将会带来显著的性能影响.(只在一个文件第一次修改时会发生搜索和拷贝, 拷贝到容器层后就可以写了)

使用AUFS驱动删除文件

AUFS存储驱动通过在容器层放一个whiteout file实现文件的删除. whiteout file会使只读镜像中的被覆盖的文件变得模糊不清(删除).

14. Docker引擎 - Docker与AUFS实践_第1张图片
Paste_Image.png

使用AUFS重命名目录

调用rename系统调用时, 如果目录是非空的, 那么将返回错误EXDEV(cross-device link not permitted), 所以应用程序需要处理EXDEV.

Docker中配置AUFS

通过下面命令查看系统是否支持AUFS

grep aufs /proc/filesystems
nodev aufs

有上面输出, 说明支持, 否则不支持. 如果支持可以通过传递--storage-driver=aufs给dockerd使用AUFS. 上节已经写了配置过程.

本地存储与AUFS

  • 镜像
    • /var/lib/docker/aufs/diff/
      镜像的层及其内容存放的目录
    • /var/lib/docker/aufs/layers/
      存储关于镜像和层叠放的元数据
  • 容器
    • /var/lib/docker/aufs/mnt/
      正在运行的容器的挂载目录, 如果没有运行, 那么目录仍存在, 但是是空目录
    • /var/lib/docker/containers/
      容器的元数据和各种配置文件存放的位置
    • /var/lib/docker/aufs/diff/
      存储容器的可写层, 当容器被删除时, 存放在此的可写层也被删除了

AUFS与容器性能

  • 对于PaaS是一个很好的选择, 能够高效复用镜像节省磁盘空间, 快速启动容器
  • AUFS的底层机制使得可以高效的使用系统的页缓存
  • 第一次修改大文件(或处于底层的镜像中的文件)会造成显著的性能影响

AUFS的兼容性

不支持rename系统调用

你可能感兴趣的:(14. Docker引擎 - Docker与AUFS实践)