本文主要介绍一下 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
文件夹下。
如上图所示,其中镜像的 json 文件中存储着镜像的元数据,譬如父镜像 id
在
/var/lib/docker/aufs/layers
存放着镜像ID以及层级关系,如下图,我们知道最底层的 IMAGE ID 是d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391
我们查看容器层级内容
$ cd /var/lib/docker/aufs/diff/d3a1f33e8a5a513092f01bb7eb1c2abf4d711e5105390a3fe1ae2248cfde1391
$ ls
我们就看到了如上图所示的 rootfs 文件目录,而这个镜像就作为最根部的 Images ,我们使用的最终镜像 ubuntu:latest 就是在这个镜像的基础上根据各层级的关系动态添加的。
如上图,
/var/lib/docker/graph
下的镜像 ID 以及镜像 json,查看 json 文件内容如下图:
如上图所示包含了,所有父镜像id,和在父镜像id 上执行的命令以及生成镜像id 等等所有元数据。当我们启动容器的时候,就会一步一步逐步的从
rootfs
上累加过来。
2. 启动容器
docker run -i -t ubuntu bash
当我们运行上边的命令的时候,基础过程如下:
1. 它会先检查我们本地是否存在 ubuntu:latest 的镜像,如果存在就加载镜像,也就是我们之前提到的91e54dfb11794fad694460162bf0cb0a4fa710cfa3f60979c177d920813e267c
。
2. 创建容器,程序的CreateRootfs
会调用Create
函数来在mnt
和diff
文件夹下创建ID-init
文件夹,然后通过程序的GET
函数将依赖的layers
层根据层级关系依次加载到ID-init
文件夹下。只有ID-init
是可写,其它都是可读。
3. 再次调用Create
函数来创建ID
文件夹,并在containers
文件夹下创建ID
文件夹和所有配置文件 ,然后启动容器,将依赖的容器的层依次挂载到ID
文件夹下。
当我们在容器内进行操作的时候,在 /var/lib/docker/containers/ID/ID-json.log
中就会进行日志存储,如下图
上图,从日志中我们可以看出,我们对容器操作有两部:
cd root
touch 1.txt
然后我们创建的 1.txt 文件,记在
/var/lib/docker/diff/ID/root/
下,如下图
这就能很简单的看出 docker 的层级关系和数据关系。
今天就说到这里,哪里不懂的或者文章有错误的,请发送邮件到 admin#widuu.com(#换成@)
未经允许,不得转载本站任何文章:微度网络 » Docker 文件系统以及启动容器的文件系统变化
有疑问加站长微信联系(非本文作者)