正文
Docker在启动容器的时候,需要创建文件系统,为rootfs提供挂载点。最底层的引导文件系统bootfs主要包含bootloader和kernel,bootloader主要是引导加载kernel,当kernel被加载到内存中后 bootfs就被umount了。 rootfs包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件。
Docker模型的核心部分是有效利用分层镜像机制,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。Docker 1.10引入新的可寻址存储模型,使用安全内容哈希代替随机的UUID管理镜像。同时,Docker提供了迁移工具,将已经存在的镜像迁移到新模型上。不同 Docker容器就可以共享一些基础的文件系统层,同时再加上自己独有的可读写层,大大提高了存储的效率。其中主要的机制就是分层模型和将不同目录挂载到同一个虚拟文件系统。
Docker存储方式提供管理分层镜像和容器的可读写层的具体实现。最初Docker仅能在支持AUFS文件系统的Ubuntu发行版上运行,但是由于AUFS未能加入Linux内核,为了寻求兼容性、扩展性,Docker在内部通过graphdriver机制这种可扩展的方式来实现对不同文件系统的支持。
Docker有如下几种不同的drivers:
-
AUFS
-
Device mapper
-
Btrfs
-
OverlayFS
-
ZFS
AUFS
AUFS(AnotherUnionFS)是一种Union FS,是文件级的存储驱动。所谓 UnionFS 就是把不同物理位置的目录合并mount到同一个目录中。简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。这种文件系统可以一层一层地叠加修改文件。无论底下有多少层都是只读的,只有最上层的文件系统是可写的。当需要修改一个文件时,AUFS创建该文件的一个副本,使用CoW将文件从只读层复制到可写层进行修改,结果也保存在可写层。在Docker中,底下的只读层就是image,可写层就是Container。结构如下图所示:
例子
运行一个实例应用是删除一个文件/etc/shadow,看AUFS的结果:
# docker run centos rm /etc/shadow
# ls -la /var/lib/docker/aufs/diff/$(docker ps --no-trunc -lq)/etc
total 8
drwxr-xr-x 2 root root 4096 Sep 2 18:35 .
drwxr-xr-x 5 root root 4096 Sep 2 18:35 ..
-r--r--r-- 2 root root 0 Sep 2 18:35 .wh.shadow
目录结构
-
容器挂载点(只有容器运行时才被加载)
-
/var/lib/docker/aufs/mnt/$CONTAINER_ID/
-
分支(和镜像不同的文件,只读活着读写)
-
/var/lib/docker/aufs/diff/$CONTAINER_OR_IMAGE_ID/
-
镜像索引表(每个镜像引用镜像名)
-
/var/lib/docker/aufs/layers/
其他
AUFS 文件系统可使用的磁盘空间大小
# df -h /var/lib/docker/
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 20G 4.0G 15G 22% /
系统挂载方式
启动的Docker
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f2e9de1d9d5 mesos/bamboo:v0.1c "/usr/bin/bamboo-hap 5 days ago Up 5 days mesos-20150825-162813-1248613158-5050-1-S0.88c909bc-6301-423a-8283-5456435f12d3
dc9a7b000300 mesos/nginx:base "/bin/sh -c nginx" 7 days ago Up 7 days 0.0.0.0:31967->80/tcp mesos-20150825-162813-1248613158-5050-1-S0.42667cb2-1134-4b1a-b11d-3c565d4de418
1b466b5ad049 mesos/marathon:omega.v0.1 "/usr/bin/dataman_ma 7 days ago Up 16 hours dataman-marathon
0a01eb99c9e7 mesos/nginx:base "/bin/sh -c nginx" 7 days ago Up 7 days 0.0.0.0:31587->80/tcp mesos-20150825-162813-1248613158-5050-1-S0.4f525828-1217-4b3d-a169-bc0eb901eef1
c2fb2e8bd482 mesos/dns:v0.1c "/usr/bin/dataman_me 7 days ago Up 7 days mesos-20150825-162813-1248613158-5050-1-S0.82d500eb-c3f0-4a00-9f7b-767260d1ee9a
df102527214d mesos/zookeeper:omega.v0.1 "/data/run/dataman_z 8 days ago Up 8 days dataman-zookeeper
b076a43693c1 mesos/slave:omega.v0.1 "/usr/sbin/mesos-sla 8 days ago Up 8 days dataman-slave
e32e9fc9a788 mesos/master:omega.v0.1 "/usr/sbin/mesos-mas 8 days ago Up 8 days dataman-master
c8454c90664e shadowsocks_server "/usr/local/bin/ssse 9 days ago Up 9 days 0.0.0.0:57980->57980/tcp shadowsocks
6dcd5bd46348 registry:v0.1 "docker-registry" 9 days ago Up 9 days 0.0.0.0:5000->5000/tcp dataman-registry
对照系统挂载点