1.overlay2存储驱动架构图

docker diff merge目录过大 docker的overlay2_f5

2.概念介绍

  • 当需要修改一个文件时,使用cow(copy-on_write,写时拷贝)将文件从只读属性的Lower复制到读写属性的Upper进行修改,结果也保存在Upper层
  • 在Docker中,底下的只读层就是Image,可写层就是Container
  • 如上图所示,当我们在容器中访问(包括增删改查操作)某个文件时,如果在UpperDir中(即容器层)访问不到,就去LowerDir(即镜像层)访问,如果LowerDir和UpperDir中都有,那么UpperDir会覆盖LowerDir中的文件,从而被优先访问

概念

介绍

LowerDir

镜像层,只读

UpperDir

容器层,可读可写

MergedDir

LowerDir和UpperDir的合集,作为视图层

初看上面的内容肯定会不理解,没关系,请跟着下面的实例演示操作一遍。

3.实例演示

该实例默认在已安装docker环境下操作,如未安装,请先安装docker环境

step.1 查看overlay2的镜像结构

# 进入/var/lib/docker/overlay2
[root@iz2ze78arq0qlz2ldzoxk3z docker]# cd /var/lib/docker/overlay2/
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]#
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# ll
total 4
drwx------ 2 root root 4096 Oct  9 17:38 l
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]#

step.2 下载nginx镜像,并运行nginx容器

# 下载并以后台的方式启动nginx,起名为nginx-1,设置公网访问为3344,设置启动占用端口为80
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# docker run -d --name nginx-1 -p 3344:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
d121f8d1c412: Pull complete
66a200539fd6: Pull complete
e9738820db15: Pull complete
d74ea5811e8a: Pull complete
ffdacbba6928: Pull complete
Digest: sha256:fc66cdef5ca33809823182c9c5d72ea86fd2cef7713cf3363e1a0b12a5d77500
Status: Downloaded newer image for nginx:latest
b46631088793c232075fb5020963a1f6bb455de2113896534f56e670c35c5d7f
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
b46631088793        nginx               "/docker-entrypoint.…"   37 seconds ago      Up 37 seconds       0.0.0.0:3344->80/tcp   nginx-1
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]#

step.3 再次查看overlay2的目录结构

[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# ll
total 32
drwx------ 4 root root 4096 Oct  9 17:40 0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b
drwx------ 3 root root 4096 Oct  9 17:40 2332b96407caa708d39dd4dd8baf5ee477c451ae7ffe86346825807a25fc4192
drwx------ 4 root root 4096 Oct  9 17:40 2350cc6a94b0bd0edc875315895a5a07be5bb6b2019f211d09f50703a55394fd
drwx------ 5 root root 4096 Oct  9 17:40 5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5
drwx------ 4 root root 4096 Oct  9 17:40 5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5-init
drwx------ 4 root root 4096 Oct  9 17:40 856c994fa5ee5ceb2443634d5e0d5648c5444fa439eaa0ee1b9e4bda16149a28
drwx------ 4 root root 4096 Oct  9 17:40 9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e
drwx------ 2 root root 4096 Oct  9 17:40 l
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]#

step.4 查看nginx镜像的详细信息

# 查看nginx的镜像详细信息,992e3b7be046是下载的nginx的镜像Id,可以通过docker images获取
docker inspect 992e3b7be046

# 由于篇幅有限,只列出部分内容,其中我们着重关注GraphDriver
[
    {
        ... ...
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/2350cc6a94b0bd0edc875315895a5a07be5bb6b2019f211d09f50703a55394fd/diff:/var/lib/docker/overlay2/856c994fa5ee5ceb2443634d5e0d5648c5444fa439eaa0ee1b9e4bda16149a28/diff:/var/lib/docker/overlay2/0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b/diff:/var/lib/docker/overlay2/2332b96407caa708d39dd4dd8baf5ee477c451ae7ffe86346825807a25fc4192/diff",
                "MergedDir": "/var/lib/docker/overlay2/9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e/merged",
                "UpperDir": "/var/lib/docker/overlay2/9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e/diff",
                "WorkDir": "/var/lib/docker/overlay2/9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e/work"
            },
            "Name": "overlay2"
        }
        ... ...
    }
]
# 为了方便观看,我们把这些目录路径分行列举出来
【LowerDir】
/var/lib/docker/overlay2/2350cc6a94b0bd0edc875315895a5a07be5bb6b2019f211d09f50703a55394fd/diff
/var/lib/docker/overlay2/856c994fa5ee5ceb2443634d5e0d5648c5444fa439eaa0ee1b9e4bda16149a28/diff
/var/lib/docker/overlay2/0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b/diff
/var/lib/docker/overlay2/2332b96407caa708d39dd4dd8baf5ee477c451ae7ffe86346825807a25fc4192/diff

【UpperDir】
/var/lib/docker/overlay2/9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e/diff

【MergedDir】
/var/lib/docker/overlay2/9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e/merged

【WorkDir】
/var/lib/docker/overlay2/9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e/work

# 为了方便对比,我们再把overlay2目录下的内容列出来
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# ll
total 32
drwx------ 4 root root 4096 Oct  9 17:40 0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b
drwx------ 3 root root 4096 Oct  9 17:40 2332b96407caa708d39dd4dd8baf5ee477c451ae7ffe86346825807a25fc4192
drwx------ 4 root root 4096 Oct  9 17:40 2350cc6a94b0bd0edc875315895a5a07be5bb6b2019f211d09f50703a55394fd
drwx------ 5 root root 4096 Oct  9 17:40 5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5
drwx------ 4 root root 4096 Oct  9 17:40 5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5-init
drwx------ 4 root root 4096 Oct  9 17:40 856c994fa5ee5ceb2443634d5e0d5648c5444fa439eaa0ee1b9e4bda16149a28
drwx------ 4 root root 4096 Oct  9 17:40 9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e
drwx------ 2 root root 4096 Oct  9 17:40 l
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]#

可以看到,当前overlay2目录下除了

5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5
5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5-init

这个两个目录以外,其他目录都能一一对应nginx镜像的LowerDir、UpperDir、MergedDir、WorkDir的前缀,多出来的这两个目录我们放到后面说,可以先提一下的是这两个目录是nginx容器对应的目录。

step.5 查看nginx镜像层结构

nginx镜像层的LowerDir中的目录从上往下越来越底层,最底层2232b96是centos层,0772590是nginx层,我们以nginx层为例来查看镜像层结构

# 在此之前先查看一下软链接目录的内容,我们列举出来,方便后面对比
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# ll l/
total 28
lrwxrwxrwx 1 root root 72 Oct  9 17:40 25M3DGCRDJ3JGEGYYO6FOUGS6N -> ../2350cc6a94b0bd0edc875315895a5a07be5bb6b2019f211d09f50703a55394fd/diff
lrwxrwxrwx 1 root root 72 Oct  9 17:40 BWR6CCYRZHPZGWV5PJA56ZQCZX -> ../856c994fa5ee5ceb2443634d5e0d5648c5444fa439eaa0ee1b9e4bda16149a28/diff
lrwxrwxrwx 1 root root 72 Oct  9 17:40 DYRJLUUELXIXC3AOLOHHNBUNTW -> ../0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b/diff
lrwxrwxrwx 1 root root 72 Oct  9 17:40 GGBFM2XRVEIMSKUL6YZW2LAIDA -> ../9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e/diff
lrwxrwxrwx 1 root root 72 Oct  9 17:40 LOA76ZICCXWTAYB7FP4L5HKOPW -> ../2332b96407caa708d39dd4dd8baf5ee477c451ae7ffe86346825807a25fc4192/diff
lrwxrwxrwx 1 root root 77 Oct  9 17:40 TY2VIEJBHC6N7YJULFALY635MT -> ../5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5-init/diff
lrwxrwxrwx 1 root root 72 Oct  9 17:40 Y2LEYQL6SK6TKJFUATQYSHMBWX -> ../5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5/diff
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]#

# 进入nginx镜像层
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# cd 0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b
[root@iz2ze78arq0qlz2ldzoxk3z 0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b]# ll
total 16
-rw------- 1 root root    0 Oct  9 17:40 committed
drwxr-xr-x 8 root root 4096 Oct  9 17:40 diff
-rw-r--r-- 1 root root   26 Oct  9 17:40 link
-rw-r--r-- 1 root root   28 Oct  9 17:40 lower
drwx------ 2 root root 4096 Oct  9 17:40 work

# 查看link文件的内容
[root@iz2ze78arq0qlz2ldzoxk3z 0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b]# cat link
DYRJLUUELXIXC3AOLOHHNBUNTW
[root@iz2ze78arq0qlz2ldzoxk3z 0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b]#
# 可以发现这与overlay2目录中的软链接目录 l 内记录的关系一致

# 查看lower文件内容
[root@iz2ze78arq0qlz2ldzoxk3z 0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b]# cat lower
l/LOA76ZICCXWTAYB7FP4L5HKOPW
[root@iz2ze78arq0qlz2ldzoxk3z 0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b]#
# 可以发现lower也对应软链接目录 l 内的某一个软链接,根据对比可知,该软链接对应的目录是
LOA76ZICCXWTAYB7FP4L5HKOPW -> ../2332b96407caa708d39dd4dd8baf5ee477c451ae7ffe86346825807a25fc4192/diff

# 我们再看一下nginx镜像的LowerDir目录内容
【LowerDir】
/var/lib/docker/overlay2/2350cc6a94b0bd0edc875315895a5a07be5bb6b2019f211d09f50703a55394fd/diff
/var/lib/docker/overlay2/856c994fa5ee5ceb2443634d5e0d5648c5444fa439eaa0ee1b9e4bda16149a28/diff
/var/lib/docker/overlay2/0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b/diff
/var/lib/docker/overlay2/2332b96407caa708d39dd4dd8baf5ee477c451ae7ffe86346825807a25fc4192/diff
# 可以发现,2332b96是LowerDir中的最底层,即centos镜像层,因此当前目录中的lower文件软链接的是当前镜像层(nginx镜像层)的上一层(从文中列举的顺序来说是最底层)

# 进入diff目录查看
[root@iz2ze78arq0qlz2ldzoxk3z 0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b]# cd diff/
[root@iz2ze78arq0qlz2ldzoxk3z diff]# ll
total 24
drwxr-xr-x  2 root root 4096 Oct  6 06:44 docker-entrypoint.d
drwxr-xr-x 20 root root 4096 Oct  6 06:44 etc
drwxr-xr-x  5 root root 4096 Oct  6 06:44 lib
drwxrwxrwt  2 root root 4096 Oct  6 06:44 tmp
drwxr-xr-x  7 root root 4096 Sep  8 15:00 usr
drwxr-xr-x  5 root root 4096 Sep  8 15:00 var
[root@iz2ze78arq0qlz2ldzoxk3z diff]# cd usr/share/
[root@iz2ze78arq0qlz2ldzoxk3z share]# ll
total 52
drwxr-xr-x  2 root root 4096 Oct  6 06:44 bug
drwxr-xr-x  3 root root 4096 Oct  6 06:44 ca-certificates
drwxr-xr-x 53 root root 4096 Oct  6 06:44 doc
drwxr-xr-x  2 root root 4096 Oct  6 06:44 doc-base
drwxr-xr-x  3 root root 4096 Oct  6 06:44 fontconfig
drwxr-xr-x  3 root root 4096 Oct  6 06:44 fonts
drwxr-xr-x  2 root root 4096 Oct  6 06:44 java
drwxr-xr-x  3 root root 4096 Oct  6 06:44 nginx
drwxr-xr-x  2 root root 4096 Oct  6 06:44 readline
drwxr-xr-x  3 root root 4096 Oct  6 06:44 sensible-utils
drwxr-xr-x  3 root root 4096 Oct  6 06:44 X11
drwxr-xr-x  3 root root 4096 Oct  6 06:44 xml
drwxr-xr-x  3 root root 4096 Oct  6 06:44 zsh
[root@iz2ze78arq0qlz2ldzoxk3z share]# tree nginx/
nginx/
└── html
    ├── 50x.html
    └── index.html

1 directory, 2 files
[root@iz2ze78arq0qlz2ldzoxk3z share]#
# 根据这些目录结构可以证明这里是nginx镜像层

镜像层目录结构内容:

组成部分

说明

committed

制作镜像时的commit内容,不重要

diff

记录每一层自己内容的数据,顾名思义,diff,不同,代表当前层与上一层的不同内容

link

记录该层链接目录(实际是l目录中的某个链接)

lower

记录该层的上一层链接

work

写时拷贝发生时才使用它,可以理解成专门给写时拷贝场景提供的目录

step.6 回过头再看overlay2目录结构

# 进入/var/lib/docker/overlay2
[root@iz2ze78arq0qlz2ldzoxk3z share]# cd /var/lib/docker/overlay2
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# ll
total 32
drwx------ 4 root root 4096 Oct  9 17:40 0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b
drwx------ 3 root root 4096 Oct  9 17:40 2332b96407caa708d39dd4dd8baf5ee477c451ae7ffe86346825807a25fc4192
drwx------ 4 root root 4096 Oct  9 17:40 2350cc6a94b0bd0edc875315895a5a07be5bb6b2019f211d09f50703a55394fd
drwx------ 5 root root 4096 Oct  9 17:40 5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5
drwx------ 4 root root 4096 Oct  9 17:40 5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5-init
drwx------ 4 root root 4096 Oct  9 17:40 856c994fa5ee5ceb2443634d5e0d5648c5444fa439eaa0ee1b9e4bda16149a28
drwx------ 4 root root 4096 Oct  9 17:40 9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e
drwx------ 2 root root 4096 Oct  9 17:40 l
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]#

# 查看完nginx镜像层的目录内容(对应的是0772590),再看看其他目录的结构
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# ll 2350cc6a94b0bd0edc875315895a5a07be5bb6b2019f211d09f50703a55394fd
total 16
-rw------- 1 root root    0 Oct  9 17:40 committed
drwxr-xr-x 3 root root 4096 Oct  9 17:40 diff
-rw-r--r-- 1 root root   26 Oct  9 17:40 link
-rw-r--r-- 1 root root   86 Oct  9 17:40 lower
drwx------ 2 root root 4096 Oct  9 17:40 work
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# ll 9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e
total 16
-rw------- 1 root root    0 Oct  9 17:40 committed
drwxr-xr-x 3 root root 4096 Oct  9 17:40 diff
-rw-r--r-- 1 root root   26 Oct  9 17:40 link
-rw-r--r-- 1 root root  115 Oct  9 17:40 lower
drwx------ 2 root root 4096 Oct  9 17:40 work
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# 
# 可以看到其他镜像层跟nginx镜像层目录结构都一样

# 但是有一个例外,centos镜像层,即所有镜像都包括的最底层
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# ll 2332b96407caa708d39dd4dd8baf5ee477c451ae7ffe86346825807a25fc4192/
total 8
-rw-------  1 root root    0 Oct  9 17:40 committed
drwxr-xr-x 21 root root 4096 Oct  9 17:40 diff
-rw-r--r--  1 root root   26 Oct  9 17:40 link
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]#
# 可以发现centos镜像层,即最底层,是没有lower和work的,这是因为centos镜像层作为最底层,是没有上一层的,也不允许写时拷贝操作(根本原因是不允许写操作)

step.7 查看nginx容器的详细信息

# 查看nginx的镜像详细信息,b46631088793是下载的nginx的镜像Id,可以通过docker ps获取
docker inspect b46631088793

# 由于篇幅有限,只列出部分内容,其中我们着重关注GraphDriver
[
    {
        ... ...
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5-init/diff:/var/lib/docker/overlay2/9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e/diff:/var/lib/docker/overlay2/2350cc6a94b0bd0edc875315895a5a07be5bb6b2019f211d09f50703a55394fd/diff:/var/lib/docker/overlay2/856c994fa5ee5ceb2443634d5e0d5648c5444fa439eaa0ee1b9e4bda16149a28/diff:/var/lib/docker/overlay2/0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b/diff:/var/lib/docker/overlay2/2332b96407caa708d39dd4dd8baf5ee477c451ae7ffe86346825807a25fc4192/diff",
                "MergedDir": "/var/lib/docker/overlay2/5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5/merged",
                "UpperDir": "/var/lib/docker/overlay2/5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5/diff",
                "WorkDir": "/var/lib/docker/overlay2/5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5/work"
            },
            "Name": "overlay2"
        }
        ... ...
    }
]
# 为了方便观看,我们把这些目录路径分行列出来
【LowerDir】
/var/lib/docker/overlay2/5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5-init/diff
/var/lib/docker/overlay2/9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e/diff
/var/lib/docker/overlay2/2350cc6a94b0bd0edc875315895a5a07be5bb6b2019f211d09f50703a55394fd/diff
/var/lib/docker/overlay2/856c994fa5ee5ceb2443634d5e0d5648c5444fa439eaa0ee1b9e4bda16149a28/diff
/var/lib/docker/overlay2/0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b/diff
/var/lib/docker/overlay2/2332b96407caa708d39dd4dd8baf5ee477c451ae7ffe86346825807a25fc4192/diff

【UpperDir】
/var/lib/docker/overlay2/5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5/diff

【MergedDir】
/var/lib/docker/overlay2/5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5/merged

【WorkDir】
/var/lib/docker/overlay2/5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5/work

# 为了方便对比,我们再把nginx镜像的LowerDir内容列出来
/var/lib/docker/overlay2/2350cc6a94b0bd0edc875315895a5a07be5bb6b2019f211d09f50703a55394fd/diff
/var/lib/docker/overlay2/856c994fa5ee5ceb2443634d5e0d5648c5444fa439eaa0ee1b9e4bda16149a28/diff
/var/lib/docker/overlay2/0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b/diff
/var/lib/docker/overlay2/2332b96407caa708d39dd4dd8baf5ee477c451ae7ffe86346825807a25fc4192/diff

# 可以发现nginx容器中的LowerDir内容比nginx镜像的LowerDir多出了这两个目录
/var/lib/docker/overlay2/5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5-init/diff
/var/lib/docker/overlay2/9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e/diff

其中
/var/lib/docker/overlay2/9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e/diff
是nginx镜像的UpperDir内容

再看nginx容器的UpperDir内容
/var/lib/docker/overlay2/5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5/diff
# 为了方便对比,我们再把overlay2目录下的内容列出来
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# ll
total 32
drwx------ 4 root root 4096 Oct  9 17:40 0772590e61adc3bde67511a9ebe3ecc087aca8e8e2f8071c46c584d79116342b
drwx------ 3 root root 4096 Oct  9 17:40 2332b96407caa708d39dd4dd8baf5ee477c451ae7ffe86346825807a25fc4192
drwx------ 4 root root 4096 Oct  9 17:40 2350cc6a94b0bd0edc875315895a5a07be5bb6b2019f211d09f50703a55394fd
drwx------ 5 root root 4096 Oct  9 17:40 5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5
drwx------ 4 root root 4096 Oct  9 17:40 5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5-init
drwx------ 4 root root 4096 Oct  9 17:40 856c994fa5ee5ceb2443634d5e0d5648c5444fa439eaa0ee1b9e4bda16149a28
drwx------ 4 root root 4096 Oct  9 17:40 9f1d6ac61af19429182c93cff9c0b5973d8604f00f69dc0e9a45895d0df5fb6e
drwx------ 2 root root 4096 Oct  9 17:40 l
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]#

现在就可以明白5e24293开头的这两个目录是哪来的了,没错,就是nginx容器的目录。

step.8 查看nginx容器层结构

# 查看nginx容器的LowerDir中xxx-init目录结构
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# ll 5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5-init/
total 16
-rw------- 1 root root    0 Oct  9 17:40 committed
drwxr-xr-x 4 root root 4096 Oct  9 17:40 diff
-rw-r--r-- 1 root root   26 Oct  9 17:40 link
-rw-r--r-- 1 root root  144 Oct  9 17:40 lower
drwx------ 3 root root 4096 Oct  9 17:40 work
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]#
# 可以看到与其他镜像层目录内容一致

# 查看nginx容器的UpperDir目录结构
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]# ll 5e24293506344c5595d886a3194b95ca3ddf34e5cf1b1566db796be4567a8de5
total 20
drwxr-xr-x 6 root root 4096 Oct  9 17:40 diff
-rw-r--r-- 1 root root   26 Oct  9 17:40 link
-rw-r--r-- 1 root root  173 Oct  9 17:40 lower
drwxr-xr-x 1 root root 4096 Oct  9 17:40 merged
drwx------ 3 root root 4096 Oct  9 17:40 work
[root@iz2ze78arq0qlz2ldzoxk3z overlay2]#
# 可以看到多了一个merged目录,少了一个committed文件

容器层目录结构内容:

组成部分

说明

diff

记录每一层自己内容的数据,顾名思义,diff,不同,代表当前层与上一层的不同内容

link

记录该层链接目录(实际是l目录中的某个链接)

lower

记录该层的上一层链接

merged

LowerDir与UpperDir的合集,merged作为视图层,它对应的是MergedDir,因此镜像是没有该目录的,只有容器才有,我们使用docker inspect [image_id]能看到镜像也有MergedDir是因为它固定展示格式,实际上并不存在

work

写时拷贝发生时才使用它,可以理解成专门给写时拷贝场景提供的目录

step.9 总结

overlay2目录包括三部分内容:

  1. 每个镜像层对应的目录文件
  2. 每个容器层对应的目录文件
  3. l 软链接目录,记录每个镜像层目录的软链关系

至此,请在回过头看文章开头的架构图和概念介绍,应该就能理解了。