Docker 文件系统以及启动容器的文件系统变化

widuu 2015-10-7 Go语言 5,084 1 喜欢 (3)

本文主要介绍一下 Docker 基础的东西,先介绍一下我的实现环境:
1. windows 10 正式版
1. Docker Toolbox
1. Docker version 1.8.2
1. 官方镜像 ubuntu:latest

这里我们主要只说 aufs/containers/graph 这三个目录。

1. 先进入 Docker 文件系统目录

ll /var/lib/docker #其中目录是这样的 /var/lib/docker -> /mnt/sda1/var/lib/docker/
df -h # 查看挂载情况

Filesystem                Size      Used Available Use% Mounted on
tmpfs                   896.6M    115.3M    781.3M  13% /
tmpfs                   498.1M         0    498.1M   0% /dev/shm
/dev/sda1                18.2G    300.1M     16.9G   2% /mnt/sda1
cgroup                  498.1M         0    498.1M   0% /sys/fs/cgroup
none                    100.0G     42.1G     57.9G  42% /c/Users
/dev/sda1                18.2G    300.1M     16.9G   2% /mnt/sda1/var/lib/docker/aufs


ls -l /mnt/sda1/var/lib/docker/
drwxr-xr-x    5 root     root          4096 Sep 28 01:59 aufs/          # 系统挂载目录,系统使用的aufs
drwx------    2 root     root          4096 Oct  7 03:48 containers/    # 容器文件系统
drwx------    7 root     root         12288 Oct  7 03:48 graph/         # 本地镜像
-rw-r--r--    1 root     root         15360 Oct  7 03:48 linkgraph.db   
-rw-------    1 root     root           105 Oct  7 03:48 repositories-aufs # 存储与image有关的基本信息
drwx------    2 root     root          4096 Oct  7 02:52 tmp/
drwx------    2 root     root          4096 Sep 28 02:01 trust/
drwx------    2 root     root          4096 Sep 28 01:59 volumes/

查看一下我本地的镜像

docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              91e54dfb1179        6 weeks ago         188.4 MB

我本地有一个 ubuntu:latest 的 office image, Image 的短 ID 是 91e54dfb1179。这里说明说一下 Docker 的镜像是由镜像层文件内容 和 json文件组成。
1. 镜像层文件存储在 /var/lib/docker/aufs/diff
1. 本地镜像的 json 文件存放在 /var/lib/docker/graph 文件夹下。

 

image_json

如上图所示,其中镜像的 json 文件中存储着镜像的元数据,譬如父镜像 id

/var/lib/docker/aufs/layers 存放着镜像ID以及层级关系,如下图,我们知道最底层的 IMAGE ID 是 d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391

layers

我们查看容器层级内容

$ cd /var/lib/docker/aufs/diff/d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391
$ ls

 

images_rootfs

我们就看到了如上图所示的 rootfs 文件目录,而这个镜像就作为最根部的 Images ,我们使用的最终镜像 ubuntu:latest 就是在这个镜像的基础上根据各层级的关系动态添加的。

 

images_docker

如上图,/var/lib/docker/graph 下的镜像 ID 以及镜像 json,查看 json 文件内容如下图:

 

docker_add

如上图所示包含了,所有父镜像id,和在父镜像id 上执行的命令以及生成镜像id 等等所有元数据。当我们启动容器的时候,就会一步一步逐步的从 rootfs 上累加过来。

2. 启动容器

docker run -i -t ubuntu bash 

当我们运行上边的命令的时候,基础过程如下:
1. 它会先检查我们本地是否存在 ubuntu:latest 的镜像,如果存在就加载镜像,也就是我们之前提到的 91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c
2. 创建容器,程序的 CreateRootfs 会调用 Create 函数来在 mntdiff 文件夹下创建 ID-init 文件夹,然后通过程序的 GET 函数将依赖的 layers 层根据层级关系依次加载到 ID-init 文件夹下。只有 ID-init是可写,其它都是可读。
3. 再次调用 Create 函数来创建 ID文件夹,并在containers 文件夹下创建 ID 文件夹和所有配置文件 ,然后启动容器,将依赖的容器的层依次挂载到 ID 文件夹下。

当我们在容器内进行操作的时候,在 /var/lib/docker/containers/ID/ID-json.log 中就会进行日志存储,如下图

 

images_logo

上图,从日志中我们可以看出,我们对容器操作有两部:

cd root
touch 1.txt

然后我们创建的 1.txt 文件,记在 /var/lib/docker/diff/ID/root/ 下,如下图

 

images_addlayer

这就能很简单的看出 docker 的层级关系和数据关系。

今天就说到这里,哪里不懂的或者文章有错误的,请发送邮件到 admin#widuu.com(#换成@)

转载请注明来自微度网络,本文标题:《Docker 文件系统以及启动容器的文件系统变化》

喜欢 3 发布评论
Top