0
点赞
收藏
分享

微信扫一扫

Docker与Linux UnionFS image layer和AUFS

村里搬砖的月野兔 2021-09-24 阅读 33
PaaS

AUFS概述

AUFS,英文全称是Advanced multi-layered unification filesystem, AUFS完全重写了早期的UnionFS 1.x,其主要目的是为了可靠性和性能,并且引入了一些新的功能,比如可写分支的负载均衡。AUFS的一些实现已经被纳入UnionFS 2.x版本。

Docker是如何使用AUFS的

AUFS是Docker选用的第一种存储驱动。AUFS具有快速启动容器,高效利用存储和内存的优点,直到现在AUFS仍然是Docker支持的一种存储驱动类型。接下来我们要介绍Docker是如何利用AUFS存储images和containers的。

image layer和AUFS

每一个Docker image都是由一系列的read-only layers组成。image layers的内容都存储在Docker hosts filesystem的/var/lib/docker/aufs/diff目录下。

docker pull ubuntu:latest
latest: Pulling from ubuntu
59478d257c08: Pull complete 
ffc8d6957147: Pull complete 
af67310e1412: Pull complete 
be5d1f35efd0: Pull complete 
7e46f8ee8124: Pull complete 
Digest: sha256:e2b82b9a61d428aa7740d0c9975c61504573dc47b7f03d876765be3cd2c38057
Status: Downloaded newer image for ubuntu:latest

ls /var/lib/docker/aufs/diff
59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e  be5d1f35efd015a7897ba70d66fdb5fb8c3a388176a59fc3f08e1ece98617501
7e46f8ee8124d43b7ce80dcc4a59f144a0fcccea46950e8027c2ab31f3a8f40c  ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f
af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e
ls /var/lib/docker/aufs/layers
59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e  be5d1f35efd015a7897ba70d66fdb5fb8c3a388176a59fc3f08e1ece98617501
7e46f8ee8124d43b7ce80dcc4a59f144a0fcccea46950e8027c2ab31f3a8f40c  ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f
af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e

查看到ubuntu镜像使用了哪些image layers

docker history ubuntu
IMAGE               CREATED             CREATED BY                                      SIZE
7e46f8ee8124        13 days ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B
be5d1f35efd0        13 days ago         /bin/sh -c mkdir -p /run/systemd && echo 'doc   7 B
af67310e1412        13 days ago         /bin/sh -c set -xe && echo '#!/bin/sh' > /u      811 B
ffc8d6957147        13 days ago         /bin/sh -c [ -z "$(apt-get indextargets)" ]     1.007 MB
59478d257c08        13 days ago         /bin/sh -c #(nop) ADD file:cf87af1f0e27aa6ffa   72.85 MB

查看/var/lib/docker/aufs/diff目录下文件

ls  /var/lib/docker/aufs/diff/59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

ls /var/lib/docker/aufs/diff/be5d1f35efd015a7897ba70d66fdb5fb8c3a388176a59fc3f08e1ece98617501
run

ls /var/lib/docker/aufs/diff/7e46f8ee8124d43b7ce80dcc4a59f144a0fcccea46950e8027c2ab31f3a8f40c

ls /var/lib/docker/aufs/diff/ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f
var

ls /var/lib/docker/aufs/diff/af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e
etc  usr  var

查看每层包含的信息:

root@VM-0-10-ubuntu:/var/lib/docker/aufs/layers# for file in 59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e  be5d1f35efd015a7897ba70d66fdb5fb8c3a388176a59fc3f08e1ece98617501 7e46f8ee8124d43b7ce80dcc4a59f144a0fcccea46950e8027c2ab31f3a8f40c  ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e; do cat $file;echo "--"; done
--第1层啥都没有,就它自己
af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e
ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f
59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e
--4层包含了上面的3层
be5d1f35efd015a7897ba70d66fdb5fb8c3a388176a59fc3f08e1ece98617501
af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e
ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f
59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e
--5层包含了上面的4层
59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e
--2层包含了上面的1层
ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f
59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e
--3层包含了上面的2层

建个dockerfile测试分层模型

  1. write dockfile
 FROM ubuntu:latest
 RUN echo "Hello world" > /tmp/newfile
  1. build new dockcer
    docker build -t changed-ubuntu .
Sending build context to Docker daemon 5.572 MB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:latest
 ---> 7e46f8ee8124
Step 1 : RUN echo "Hello world" > /tmp/newfile
 ---> Running in fab39221d4da
 ---> 8e9656d8e8de
Removing intermediate container fab39221d4da
Successfully built 8e9656d8e8de
  1. docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
changed-ubuntu      latest              8e9656d8e8de        48 seconds ago      73.86 MB
ubuntu              latest              7e46f8ee8124        13 days ago         73.86 MB
  1. docker history changed-ubuntu
IMAGE               CREATED              CREATED BY                                      SIZE
8e9656d8e8de        About a minute ago   /bin/sh -c echo "Hello world" > /tmp/newfile    12 B
7e46f8ee8124        13 days ago          /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B
be5d1f35efd0        13 days ago          /bin/sh -c mkdir -p /run/systemd && echo 'doc   7 B
af67310e1412        13 days ago          /bin/sh -c set -xe && echo '#!/bin/sh' > /u     811 B
ffc8d6957147        13 days ago          /bin/sh -c [ -z "$(apt-get indextargets)" ]     1.007 MB
59478d257c08        13 days ago          /bin/sh -c #(nop) ADD file:cf87af1f0e27aa6ffa   72.85 MB
  1. cat 8e9656d8e8de2cce0f960120643f701c1ba88e0b77f0cac36a51f18599722957/tmp/newfile
root@VM-0-10-ubuntu:/var/lib/docker/aufs/diff# ls
59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e  af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e
7e46f8ee8124d43b7ce80dcc4a59f144a0fcccea46950e8027c2ab31f3a8f40c  be5d1f35efd015a7897ba70d66fdb5fb8c3a388176a59fc3f08e1ece98617501
8e9656d8e8de2cce0f960120643f701c1ba88e0b77f0cac36a51f18599722957  ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f

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

root@VM-0-10-ubuntu:/var/lib/docker/aufs/mnt# ls
59478d257c08ef4d6063b58b5440b30dad4553c5e06878393c6e4d940183b96e  af67310e14120aa822899b6e472e3dcaf4b0ab8dfe7cb96d25a5293dc291c23e
7e46f8ee8124d43b7ce80dcc4a59f144a0fcccea46950e8027c2ab31f3a8f40c  be5d1f35efd015a7897ba70d66fdb5fb8c3a388176a59fc3f08e1ece98617501
8e9656d8e8de2cce0f960120643f701c1ba88e0b77f0cac36a51f18599722957  ffc8d6957147a72d81040439a66cb5b620e0a8d919976875dff72e594cff648f

root@VM-0-10-ubuntu:/var/lib/docker/aufs/diff# cat 8e9656d8e8de2cce0f960120643f701c1ba88e0b77f0cac36a51f18599722957/tmp/newfile 
Hello world
  • cat /var/lib/docker/aufs/layers/8e9656d8e8de2cce0f960120643f701c1ba88e0b77f0cac36a51f18599722957命令来查看它的metadata时可以看到,它前面的layers就是ubuntu:latest镜像所使用的5个image layers。
  • 探查/var/lib/docker/aufs/diff/8e9656d8e8de2cce0f960120643f701c1ba88e0b77f0cac36a51f18599722957文件夹,发现其中存储了一个/tmp/newfile文件,文件中只有一行“Hello world”。
  • 至此,我们完整地分析出了image layer和AUFS是如何通过共享文件和文件夹来实现镜像存储的。
举报

相关推荐

0 条评论