0
点赞
收藏
分享

微信扫一扫

Docker与Linux UnionFS container layer和AUFS

MaxWen 2021-09-24 阅读 62
PaaS

概述

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

  • Container layer的mount目录也是/var/lib/docker/aufs/mnt。
  • Container的metadata和配置文件都存放在/var/lib/docker/containers/目录中。
  • Container的read-write layer存储在/var/lib/docker/aufs/diff/目录下。即使容器停止,这个可读写层仍然存在,因而重启容器不会丢失数据,只有当一个容器被删除的时候,这个可读写层才会一起删除。

实战

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

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
root@VM-0-10-ubuntu:~# 
root@VM-0-10-ubuntu:~# 
root@VM-0-10-ubuntu:~# ls /var/lib/docker/containers
root@VM-0-10-ubuntu:~# 
root@VM-0-10-ubuntu:~# 
root@VM-0-10-ubuntu:~# ls /sys/fs/aufs/
config
root@VM-0-10-ubuntu:~# ls /sys/fs/aufs/config 
/sys/fs/aufs/config

启动一个changed-ubuntu的容器。

root@VM-0-10-ubuntu:~# docker run -dit changed-ubuntu bash
6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de
root@VM-0-10-ubuntu:~# docker ps
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS               NAMES
6d45d64350c0        changed-ubuntu:latest   "bash"              2 seconds ago       Up 1 seconds                            compassionate_bardeen   

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

ls /var/lib/docker/aufs/diff
59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e/
6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de/
6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de-init/
7e46f8ee8124d43b7ce80dcc4a59f144a0fcccea46950e8027c2ab31f3a8f40c/
8e9656d8e8de2cce0f960120643f701c1ba88e0b77f0cac36a51f18599722957/
af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e/
be5d1f35efd015a7897ba70d66fdb5fb8c3a388176a59fc3f08e1ece98617501/
ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f/

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

ls /var/lib/docker/aufs/mnt
59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e/
6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de/
6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de-init/
7e46f8ee8124d43b7ce80dcc4a59f144a0fcccea46950e8027c2ab31f3a8f40c/
8e9656d8e8de2cce0f960120643f701c1ba88e0b77f0cac36a51f18599722957/
af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e/
be5d1f35efd015a7897ba70d66fdb5fb8c3a388176a59fc3f08e1ece98617501/
ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f/

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

ls /var/lib/docker/aufs/layers/
59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e
6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de
6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de-init
7e46f8ee8124d43b7ce80dcc4a59f144a0fcccea46950e8027c2ab31f3a8f40c
8e9656d8e8de2cce0f960120643f701c1ba88e0b77f0cac36a51f18599722957
af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e
be5d1f35efd015a7897ba70d66fdb5fb8c3a388176a59fc3f08e1ece98617501
ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f

root@VM-0-10-ubuntu:/var/lib/docker/aufs/layers# cat 6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de
6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de-init
8e9656d8e8de2cce0f960120643f701c1ba88e0b77f0cac36a51f18599722957
7e46f8ee8124d43b7ce80dcc4a59f144a0fcccea46950e8027c2ab31f3a8f40c
be5d1f35efd015a7897ba70d66fdb5fb8c3a388176a59fc3f08e1ece98617501
af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e
ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f
59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e

root@VM-0-10-ubuntu:/var/lib/docker/aufs/layers# cat 6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de-init
8e9656d8e8de2cce0f960120643f701c1ba88e0b77f0cac36a51f18599722957
7e46f8ee8124d43b7ce80dcc4a59f144a0fcccea46950e8027c2ab31f3a8f40c
be5d1f35efd015a7897ba70d66fdb5fb8c3a388176a59fc3f08e1ece98617501
af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e
ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f
59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e

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

root@VM-0-10-ubuntu:/var/lib/docker/aufs/layers# ls /var/lib/docker/containers/
6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de

root@VM-0-10-ubuntu:~# ls /var/lib/docker/containers/6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de
6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de-json.log  hostconfig.json  hosts        resolv.conf.hash
config.json                                                                hostname         resolv.conf

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

root@VM-0-10-ubuntu:~# ls /sys/fs/aufs/
config  si_48bad350b677de9

root@VM-0-10-ubuntu:~# cat /sys/fs/aufs/si_48bad350b677de9/*
/var/lib/docker/aufs/diff/6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de=rw
/var/lib/docker/aufs/diff/6d45d64350c0317be5d2655072c6015f26447c84295630218813deeb90d103de-init=ro+wh
/var/lib/docker/aufs/diff/8e9656d8e8de2cce0f960120643f701c1ba88e0b77f0cac36a51f18599722957=ro+wh
/var/lib/docker/aufs/diff/7e46f8ee8124d43b7ce80dcc4a59f144a0fcccea46950e8027c2ab31f3a8f40c=ro+wh
/var/lib/docker/aufs/diff/be5d1f35efd015a7897ba70d66fdb5fb8c3a388176a59fc3f08e1ece98617501=ro+wh
/var/lib/docker/aufs/diff/af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e=ro+wh
/var/lib/docker/aufs/diff/ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f=ro+wh
/var/lib/docker/aufs/diff/59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e=ro+wh
64
65
66
67
68
69
70
71

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

举报

相关推荐

0 条评论