Docker与Linux UnionFS container layer和AUFS

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker与Linux UnionFS container layer和AUFS相关的知识,希望对你有一定的参考价值。

参考技术A Docker使用AUFS的CoW技术来实现image layer共享和减少磁盘空间占用。CoW意味着一旦某个文件只有很小的部分有改动,AUFS也需要复制整个文件。这种设计会对容器性能产生一定的影响,尤其是在待拷贝的文件很大,或者位于很多image layers的下方,或AUFS需要深度搜索目录结构树的时候。不过也不用过度担心,对于一个容器,每一个image layer最多只需要拷贝一次。后续的改动都会在第一次拷贝的container layer上进行。
启动一个Container的时候,Docker会为其创建一个read-only的init layer,用来存储与这个容器内环境相关的内容;Docker还会为其创建一个read-write的layer用来执行所有写操作。

接下来我们仍然用实验来证明上面的结论。首先查询现有的容器数目为0,而且在/var/lib/docker/containers目录下也没有查到任何数据。最后,查看下系统的aufs mount情况,只有一个config文件。

启动一个changed-ubuntu的容器。

查看/var/lib/docker/aufs/diff目录发现,下面多了两个文件夹,6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de就是Docker为容器创建的read-write layer,而6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de-init则是Docker为容器创建的read-only的init layer。

/var/lib/docker/aufs/mnt目录的变化和/var/lib/docker/aufs/diff一致。

/var/lib/docker/aufs/layers/目录下多了与上文两个文件目录同名的文件,用cat命令可以清楚地看到其依赖layer的记录。

在/var/lib/docker/containers/目录下新建一个与containerid相同的文件夹,存放着容器的metadata和config文件。

接下来我们从系统aufs来看mount的情况,在/sys/fs/aufs/目录下多了一个si_48bad350b677de9文件夹。通过cat /sys/fs/aufs/si_fe6d5733e85e4904/*命令我们可以清楚地看到这就是我们刚刚起的容器的layer权限,只有最上面的6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de layer是read-write权限。

最后提下AUFS如何为Container删除一个文件。如果要删除file1,AUFS会在container的read-write层生成一个.wh.file1的文件来隐藏所有read-only层的file1文件。至此,我们已清楚地描述和验证了Docker是如何使用AUFS来管理container layers的。

以上是关于Docker与Linux UnionFS container layer和AUFS的主要内容,如果未能解决你的问题,请参考以下文章

Docker 原理

docker 入门

Docker在ubuntu和centos的安装

Docker:认识Docker

Docker 基础和常用命令

docker-04-镜像