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测试分层模型
- write dockfile
FROM ubuntu:latest
RUN echo "Hello world" > /tmp/newfile
- 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
- 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
- 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
- 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是如何通过共享文件和文件夹来实现镜像存储的。