20201111 docker目录结构

参考:https://segmentfault.com/a/1190000017579626

只拉了一个centos:8镜像

[root@centos7 ~]# docker pull centos:8
8: Pulling from library/centos
3c72a8ed6814: Pull complete 
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:8
docker.io/library/centos:8
[root@centos7 ~]# docker images --digests 
REPOSITORY          TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
centos              8                   sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd   0d120b6ccaa8        3 months ago        215MB

/var/lib/docker目录结构

image-20201111161534330

1、/var/lib/docker/builder

[root@centos7 ~]# ls /var/lib/docker/builder/
fscache.db
[root@centos7 ~]# file /var/lib/docker/builder/fscache.db 
/var/lib/docker/builder/fscache.db: data

2、/var/lib/docker/buildkit

image-20201111161919672

3、/var/lib/docker/containers

这个目录存放容器运行时的一些数据,目前没有运行容器,所以该目录为空

[root@centos7 ~]# ls /var/lib/docker/containers/

4、/var/lib/docker/image

[root@centos7 ~]# tree -C /var/lib/docker/image
/var/lib/docker/image
└── overlay2
    ├── distribution
    │   ├── diffid-by-digest
    │   │   └── sha256
    │   │       ├── 0ca72de6f95718a4bd36e45f03fffa98e53819be7e75cb8cd1bcb0705b845939
    │   │       ├── 171857c49d0f5e2ebf623e6cb36a8bcad585ed0c2aa99c87a055df034c1e5848
    │   │       ├── 188c0c94c7c576fff0792aca7ec73d67a2f7f4cb3a6e53a84559337260b36964
    │   │       ├── 3c72a8ed68140139e483fe7368ae4d9651422749e91483557cbd5ecf99a96110
    │   │       ├── 419640447d267f068d2f84a093cb13a56ce77e130877f5b8bdb4294f4a90a84f
    │   │       ├── 61e52f862619ab016d3bcfbd78e5c7aaaa1989b4c295e6dbcacddd2d7b93e1f5
    │   │       ├── 6a5697faee43339ef8e33e3839060252392ad99325a48f7c9d7e93c22db4d4cf
    │   │       ├── 85defa007a8b33f817a5113210cca4aca6681b721d4b44dc94928c265959d7d5
    │   │       ├── 9dd8e8e549988a3e2c521f27f805b7a03d909d185bb01cdb4a4029e5a6702919
    │   │       ├── a254829d9e55168306fd80a49e02eb015551facee9c444d9dce3b26d19238b82
    │   │       ├── ba13d3bc422b493440f97a8f148d245e1999cb616cb05876edc3ef29e79852f2
    │   │       └── f2dc206a393cd74df3fea6d4c1d3cefe209979e8dbcceb4893ec9eadcc10bc14
    │   └── v2metadata-by-diffid
    │       └── sha256
    │           ├── 0c2689e3f9206b1c4adfb16a1976d25bd270755e734588409b31ef29e3e756d6
    │           ├── 2367050c34dd9fd39052c35bf9a930e94a2be7202b33e1f8e64c1f04dd82011e
    │           ├── 291f6e44771a7b4399b0c6fb40ab4fe0331ddf76eda11080f052b003d96c7726
    │           ├── 2c8583333eb335ac202e1b798f9078ad0128f34c25a3dfe6f05e6816d3480900
    │           ├── 3fd9df55318470e88a15f423a7d2b532856eb2b481236504bf08669013875de1
    │           ├── 47dde53750b4a8ed24acebe52cf31ad131e73a9611048fc2f92c9b6274ab4bf3
    │           ├── 7a694df0ad6cc5789a937ccd727ac1cda528a1993387bf7cd4f3c375994c54b6
    │           ├── 80580270666742c625aecc56607a806ba343a66a8f5a7fd708e6c4e4c07a3e9b
    │           ├── 93e19e6dd56b059a7356aa864f9916185559a56ff18da4b189a3fcc13d3aa0ee
    │           ├── ace0eda3e3be35a979cec764a3321b4c7d0b9e4bb3094d20d3ff6782961a8d54
    │           ├── cc9d18e90faad04bc3893cfaa50b7846ee75f48f5b8377a213fa52af2189095c
    │           └── e2a648dc6400feb0d24484d83ba5800ed58adbcfdb9986f80d4ae106ac891968
    ├── imagedb
    │   ├── content
    │   │   └── sha256
    │   │       └── 0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566
    │   └── metadata
    │       └── sha256
    ├── layerdb
    │   ├── sha256
    │   │   └── 291f6e44771a7b4399b0c6fb40ab4fe0331ddf76eda11080f052b003d96c7726
    │   │       ├── cache-id
    │   │       ├── diff
    │   │       ├── size
    │   │       └── tar-split.json.gz
    │   └── tmp
    └── repositories.json

15 directories, 30 files

repositories.json文件

repositories.json存储了本地所有的image列表,里面的centos:8centos@sha256:76d其实是同一个镜像,上面docker images --digests命令可以看到

[root@centos7 ~]# cat /var/lib/docker/image/overlay2/repositories.json | jq
{
  "Repositories": {
    "centos": {
      "centos:8": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
      "centos@sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566"
    }
  }
}

imagedb目录

[root@centos7 ~]# tree -C /var/lib/docker/image/overlay2/imagedb/
/var/lib/docker/image/overlay2/imagedb/
├── content
│   └── sha256
│       └── 0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566
└── metadata
    └── sha256

4 directories, 1 file

该目录存储了镜像的相关信息,每个镜像的内容都包含在自己的目录下面,目录名就是该镜像的 Image ID

metadata目录保存每个镜像的父镜像ID,这里因为centos:8镜像没有父镜像,所以该目录为空

content目录 存储镜像的JSON格式描述信息

  • config字段:image运行为容器时的默认参数
  • container:此处是一个容器id,该镜像当初是通过docker build构建过来的,该id就是构建镜像时产生的临时容器的ID
  • container_config:和上面一样,临时容器的配置
  • history:构建该镜像的所有命令
  • rootfs:该镜像包含的layer层的diff id

总结:单个image的配置信息在content目录中,以image id为文件名存储,image之间的关系存储在metadata中,以parent文件存储。

[root@centos7 ~]# cat /var/lib/docker/image/overlay2/imagedb/content/sha256/0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566 | jq
{
  "architecture": "amd64",
  "config": {
    "Hostname": "",
    "Domainname": "",
    "User": "",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ],
    "Cmd": [
      "/bin/bash"
    ],
    "ArgsEscaped": true,
    "Image": "sha256:69587a438b2c9b803db8ed4f6e6b5abce25a6b8ec2583a394807cf82bfd23693",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": {
      "org.label-schema.build-date": "20200809",
      "org.label-schema.license": "GPLv2",
      "org.label-schema.name": "CentOS Base Image",
      "org.label-schema.schema-version": "1.0",
      "org.label-schema.vendor": "CentOS"
    }
  },
  "container": "3b04ecd9fb2d3f921f12d858edf5f3a6aa7c36c8e1e6f74bd32555fd4d7f7da2",
  "container_config": {
    "Hostname": "3b04ecd9fb2d",
    "Domainname": "",
    "User": "",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": [
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ],
    "Cmd": [
      "/bin/sh",
      "-c",
      "#(nop) ",
      "CMD [\"/bin/bash\"]"
    ],
    "ArgsEscaped": true,
    "Image": "sha256:69587a438b2c9b803db8ed4f6e6b5abce25a6b8ec2583a394807cf82bfd23693",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": {
      "org.label-schema.build-date": "20200809",
      "org.label-schema.license": "GPLv2",
      "org.label-schema.name": "CentOS Base Image",
      "org.label-schema.schema-version": "1.0",
      "org.label-schema.vendor": "CentOS"
    }
  },
  "created": "2020-08-10T18:19:49.837885498Z",
  "docker_version": "18.09.7",
  "history": [
    {
      "created": "2020-08-10T18:19:49.200589992Z",
      "created_by": "/bin/sh -c #(nop) ADD file:538afc0c5c964ce0dde0141953a4dcf03c2d993c5989c92e7fee418e9305e2a3 in / "
    },
    {
      "created": "2020-08-10T18:19:49.654025965Z",
      "created_by": "/bin/sh -c #(nop)  LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20200809",
      "empty_layer": true
    },
    {
      "created": "2020-08-10T18:19:49.837885498Z",
      "created_by": "/bin/sh -c #(nop)  CMD [\"/bin/bash\"]",
      "empty_layer": true
    }
  ],
  "os": "linux",
  "rootfs": {
    "type": "layers",
    "diff_ids": [
      "sha256:291f6e44771a7b4399b0c6fb40ab4fe0331ddf76eda11080f052b003d96c7726"
    ]
  }
}

layerdb目录

存储Docker镜像的Layer信息,当前只有一个centos:8镜像,该镜像只有1层

[root@centos7 ~]# tree -C /var/lib/docker/image/overlay2/layerdb/
/var/lib/docker/image/overlay2/layerdb/
├── sha256
│   └── 291f6e44771a7b4399b0c6fb40ab4fe0331ddf76eda11080f052b003d96c7726
│       ├── cache-id
│       ├── diff
│       ├── size
│       └── tar-split.json.gz
└── tmp

3 directories, 4 files
  • cache-id:内容为一个uuid,指向layer本地真正的出处位置,这一串id就是/var/lib/docker/overlayer2下面的一个目录

    [root@centos7 ~]# cat /var/lib/docker/image/overlay2/layerdb/sha256/291f6e44771a7b4399b0c6fb40ab4fe0331ddf76eda11080f052b003d96c7726/cache-id 
    41460518d78d1f54347d24bb73156ce660746ebd23c372177600246780c33cf2
    

    真正存储镜像的位置在这里

    [root@centos7 ~]# tree -CL 2 /var/lib/docker/overlay2/
    /var/lib/docker/overlay2/
    ├── 41460518d78d1f54347d24bb73156ce660746ebd23c372177600246780c33cf2
    │   ├── diff
    │   └── link
    ├── backingFsBlockDev
    └── l
        └── VXVZBYKWC6KJQTQINL5S74CCUZ -> ../41460518d78d1f54347d24bb73156ce660746ebd23c372177600246780c33cf2/diff
    
  • diff:该layer 层的diff id

    [root@centos7 ~]# cat /var/lib/docker/image/overlay2/layerdb/sha256/291f6e44771a7b4399b0c6fb40ab4fe0331ddf76eda11080f052b003d96c7726/diff 
    sha256:291f6e44771a7b4399b0c6fb40ab4fe0331ddf76eda11080f052b003d96c7726
    
  • size:该layer的大小,单位字节

    [root@centos7 ~]# cat /var/lib/docker/image/overlay2/layerdb/sha256/291f6e44771a7b4399b0c6fb40ab4fe0331ddf76eda11080f052b003d96c7726/size 
    215102299
    [root@centos7 ~]# echo $((215102299/1000/1000))
    215
    [root@centos7 ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    centos              8                   0d120b6ccaa8        3 months ago        215MB
    
  • tar-split.json.gz:layer层数据tar压缩的split文件。使用tar-split.json.gz

    
    

    distribution目录

    Layer层diff id和digest的关系

    [root@centos7 ~]# tree -C /var/lib/docker/image/overlay2/distribution/
    /var/lib/docker/image/overlay2/distribution/
    ├── diffid-by-digest
    │   └── sha256
    │       ├── 0ca72de6f95718a4bd36e45f03fffa98e53819be7e75cb8cd1bcb0705b845939
    │       ├── 171857c49d0f5e2ebf623e6cb36a8bcad585ed0c2aa99c87a055df034c1e5848
    │       ├── 188c0c94c7c576fff0792aca7ec73d67a2f7f4cb3a6e53a84559337260b36964
    │       ├── 3c72a8ed68140139e483fe7368ae4d9651422749e91483557cbd5ecf99a96110
    │       ├── 419640447d267f068d2f84a093cb13a56ce77e130877f5b8bdb4294f4a90a84f
    │       ├── 61e52f862619ab016d3bcfbd78e5c7aaaa1989b4c295e6dbcacddd2d7b93e1f5
    │       ├── 6a5697faee43339ef8e33e3839060252392ad99325a48f7c9d7e93c22db4d4cf
    │       ├── 85defa007a8b33f817a5113210cca4aca6681b721d4b44dc94928c265959d7d5
    │       ├── 9dd8e8e549988a3e2c521f27f805b7a03d909d185bb01cdb4a4029e5a6702919
    │       ├── a254829d9e55168306fd80a49e02eb015551facee9c444d9dce3b26d19238b82
    │       ├── ba13d3bc422b493440f97a8f148d245e1999cb616cb05876edc3ef29e79852f2
    │       └── f2dc206a393cd74df3fea6d4c1d3cefe209979e8dbcceb4893ec9eadcc10bc14
    └── v2metadata-by-diffid
        └── sha256
            ├── 0c2689e3f9206b1c4adfb16a1976d25bd270755e734588409b31ef29e3e756d6
            ├── 2367050c34dd9fd39052c35bf9a930e94a2be7202b33e1f8e64c1f04dd82011e
            ├── 291f6e44771a7b4399b0c6fb40ab4fe0331ddf76eda11080f052b003d96c7726
            ├── 2c8583333eb335ac202e1b798f9078ad0128f34c25a3dfe6f05e6816d3480900
            ├── 3fd9df55318470e88a15f423a7d2b532856eb2b481236504bf08669013875de1
            ├── 47dde53750b4a8ed24acebe52cf31ad131e73a9611048fc2f92c9b6274ab4bf3
            ├── 7a694df0ad6cc5789a937ccd727ac1cda528a1993387bf7cd4f3c375994c54b6
            ├── 80580270666742c625aecc56607a806ba343a66a8f5a7fd708e6c4e4c07a3e9b
            ├── 93e19e6dd56b059a7356aa864f9916185559a56ff18da4b189a3fcc13d3aa0ee
            ├── ace0eda3e3be35a979cec764a3321b4c7d0b9e4bb3094d20d3ff6782961a8d54
            ├── cc9d18e90faad04bc3893cfaa50b7846ee75f48f5b8377a213fa52af2189095c
            └── e2a648dc6400feb0d24484d83ba5800ed58adbcfdb9986f80d4ae106ac891968