自己动手写docker笔记(3):Union File System分析

概述OverlayFS(overlay)的镜像分层与共享:
OverlayFS使用两个目录,把一个目录置放于另一个之上,并且对外提供单个统一的视角。这两个目录通常被称作层,这个分层的技术被称作union mount。术语上,下层的目录叫做lowerdir,上层的叫做upperdir。对外展示的统一视图称作merged。

自己动手写docker笔记(3):Union File System分析_第1张图片

  上图展示了Docker镜像和Docker容器是如何分层的。镜像层就是lowerdir,容器层是upperdir。暴露在外的统一视图就是所谓的merged。

分析一波联合文件系统,具体概念不再赘述。

首先使用docker info 查看自己主机上的文件系统驱动:

[root@dockcon ~]# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 17.12.0-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 89623f28b87a6004d4b785663257362d1658a729
runc version: b2567b37d7b75eb4cf325b77297b140ea686ce8f
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-693.2.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 1.796GiB
Name: dockcon
ID: SMEH:O3GP:L26O:MMNZ:VPXN:VE7D:OWYX:RBD4:P3ZO:PI5E:XCHM:PVPU
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Registry Mirrors:
 http://3b13d85e.m.daocloud.io/
Live Restore Enabled: false

可以看到Storage Driver: overlay2就是本机的文件驱动,个人认为绝大多数主机默认Storage Driver: overlay2

overlay中镜像和容器的磁盘结构

查看下docker目录有什么文件先:

[root@dockcon ~]# ls /var/lib/docker/
builder     containers  network   plugins   swarm  trust
containerd  image       overlay2  runtimes  tmp    volumes

可以看到有个overlay2驱动的文件夹

[root@dockcon ~]# ls /var/lib/docker/overlay2/
l
[root@dockcon ~]# ls /var/lib/docker/overlay2/l
[root@dockcon ~]# 

overlay2文件夹下只有一个名为"l"的文件夹,其里面是没有任何东西的

现在我们pull一个镜像看看有什么变化:
docker pull ubuntu:16.04

[root@dockcon ~]# docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
50aff78429b1: Pull complete 
f6d82e297bce: Pull complete 
275abb2c8a6f: Pull complete 
9f15a39356d6: Pull complete 
fc0342a94c89: Pull complete 
Digest: sha256:ec0e4e8bf2c1178e025099eed57c566959bb408c6b478c284c1683bc4298b683
Status: Downloaded newer image for ubuntu:16.04
[root@dockcon ~]# ls -lh /var/lib/docker/overlay2/
总用量 24K
drwx------ 3 root root 4.0K 1月   5 18:11 272f388add72722e560f11925bf4ee5a3b3fb664fe3a099a9576798745f85c3d
drwx------ 4 root root 4.0K 1月   5 18:11 27f03471e446d3a55dfd21ebfd8f5dd26f08d530d5c55d47f0118738717060b5
drwx------ 4 root root 4.0K 1月   5 18:11 3856ca6fafc077314aaa5e60cf7950861156fabbe92881bc6bce5e68fcd2226d
drwx------ 4 root root 4.0K 1月   5 18:11 767844cd18e3ca77793b48673198cabbdcf7f2dd45b6f75e707f15595ec1a5e0
drwx------ 4 root root 4.0K 1月   5 18:11 9d7dcb47a9967120ec35c50979356fde3c4c4ec4817f347799ad9f5c2b0852a5
drwx------ 2 root root 4.0K 1月   5 18:11 l

上图的输出结果显示pull了5个目录包含了5个镜像层,每一层在/var/lib/docker/overlay/下都有自己的目录。还是再次提醒下,如你所见,Docker1.10之后,镜像层和目录名不再对应。 可以看到下载好镜像文件后生成了5个文件夹:

可以细看下各大文件夹中有什么:
镜像层目录中,共享的数据使用的是硬链接,他们的inode号大致相同

[root@dockcon ~]# ls -i /var/lib/docker/overlay2/272f388add72722e560f11925bf4ee5a3b3fb664fe3a099a9576798745f85c3d/
524290 diff  524291 link
[root@dockcon ~]# ls -i /var/lib/docker/overlay2/3856ca6fafc077314aaa5e60cf7950861156fabbe92881bc6bce5e68fcd2226d/
529901 diff  529902 link  529904 lower  529903 work
[root@dockcon ~]# ls -i /var/lib/docker/overlay2/27f03471e446d3a55dfd21ebfd8f5dd26f08d530d5c55d47f0118738717060b5/
529855 diff  529856 link  529858 lower  529857 work
[root@dockcon ~]# ls -i /var/lib/docker/overlay2/767844cd18e3ca77793b48673198cabbdcf7f2dd45b6f75e707f15595ec1a5e0/
529824 diff  529825 link  529827 lower  529826 work
[root@dockcon ~]# ls -i /var/lib/docker/overlay2/9d7dcb47a9967120ec35c50979356fde3c4c4ec4817f347799ad9f5c2b0852a5/
529887 diff  529888 link  529890 lower  529889 work

l目录包含了很多软连接,使用短名称指向了其他层。短名称用于避免mount参数时达到页面大小的限制。

[root@dockcon ~]# ls -l /var/lib/docker/overlay2/l
总用量 20
lrwxrwxrwx 1 root root 72 1月   5 18:11 3D2CWICPWSIPH7MGMMN547YEBT -> ../27f03471e446d3a55dfd21ebfd8f5dd26f08d530d5c55d47f0118738717060b5/diff
lrwxrwxrwx 1 root root 72 1月   5 18:11 4RXVMMWNWAOS5B2CMTCFXH7BRR -> ../9d7dcb47a9967120ec35c50979356fde3c4c4ec4817f347799ad9f5c2b0852a5/diff
lrwxrwxrwx 1 root root 72 1月   5 18:11 AXSD3MNZKXUUQONMUPF3M2HCEL -> ../3856ca6fafc077314aaa5e60cf7950861156fabbe92881bc6bce5e68fcd2226d/diff
lrwxrwxrwx 1 root root 72 1月   5 18:11 C7FGXOVWEZ6INXOALK3ADGFSA6 -> ../272f388add72722e560f11925bf4ee5a3b3fb664fe3a099a9576798745f85c3d/diff
lrwxrwxrwx 1 root root 72 1月   5 18:11 TF4R7NB3BG3CEC4WXVQ2FRVOXC -> ../767844cd18e3ca77793b48673198cabbdcf7f2dd45b6f75e707f15595ec1a5e0/diff

在最低层中,有个link文件,包含了前面提到的这个层对应的短名称;还有个diff目录,包含了这个镜像的内容。

[root@dockcon ~]# ls /var/lib/docker/overlay2/
272f388add72722e560f11925bf4ee5a3b3fb664fe3a099a9576798745f85c3d  767844cd18e3ca77793b48673198cabbdcf7f2dd45b6f75e707f15595ec1a5e0
27f03471e446d3a55dfd21ebfd8f5dd26f08d530d5c55d47f0118738717060b5  9d7dcb47a9967120ec35c50979356fde3c4c4ec4817f347799ad9f5c2b0852a5
3856ca6fafc077314aaa5e60cf7950861156fabbe92881bc6bce5e68fcd2226d  l
[root@dockcon ~]# ls /var/lib/docker/overlay2/272f388add72722e560f11925bf4ee5a3b3fb664fe3a099a9576798745f85c3d/
diff  link
[root@dockcon ~]# cat /var/lib/docker/overlay2/272f388add72722e560f11925bf4ee5a3b3fb664fe3a099a9576798745f85c3d/link
C7FGXOVWEZ6INXOALK3ADGFSA6

可以看到这个link文件和“l”目录下的第四个链接
C7FGXOVWEZ6INXOALK3ADGFSA6 -> ../272f388add72722e560f11925bf4ee5a3b3fb664fe3a099a9576798745f85c3d/diff是对应的

查看下diff目录

[root@dockcon ~]# ls /var/lib/docker/overlay2/272f388add72722e560f11925bf4ee5a3b3fb664fe3a099a9576798745f85c3d/diff/
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

可以看到当前镜像层下也是存在齐全的文件系统的

研究未完成~待续~

你可能感兴趣的