docker存储驱动 overlay2
阅读数:169 评论数:0
跳转到新版页面分类
应用软件
正文
一、简介
docker支持多种graphDriver,包括vfs、devicemapper、overlay、overlay2、aufs等。
docker默认的存储目录是/var/lib/docker
drwx------. 2 root root 24 Mar 28 07:13 builder
drwx------. 4 root root 92 Mar 28 07:13 buildkit
drwx------. 6 root root 4096 Mar 29 10:25 containers
drwx------. 3 root root 22 Mar 28 07:13 image
drwxr-x---. 3 root root 19 Mar 28 07:13 network
drwx------. 17 root root 4096 Mar 30 14:32 overlay2
drwx------. 4 root root 32 Mar 28 07:13 plugins
drwx------. 2 root root 6 Mar 30 14:32 runtimes
drwx------. 2 root root 6 Mar 28 07:13 swarm
drwx------. 2 root root 6 Mar 30 14:32 tmp
drwx------. 2 root root 6 Mar 28 07:13 trust
drwx------. 2 root root 25 Mar 28 07:13 volumes
containers |
里面都是容器,每启动一个容器便会在这里记录 config.v2.json:包含容器的配置信息,如容器的名称、镜像、挂载卷、环境变量等。
hostname:包含容器的主机名。
resolv.conf:包含容器的 DNS 配置信息。
checkpoints:用于存储容器的检查点(Checkpoint)文件。
logs:用于存储容器的日志文件。
mounts:包含容器的挂载卷信息。
state:包含容器的状态信息,如容器的运行状态、进程信息等。
|
image |
默认里面只有一个overlay2目录 image/overlay2/distribution: 从远端拉到本地的镜像相关元数据 image/overlay2/imagedb: 镜像数据库 image/overlay2/layerdb: 镜像每层的元数据 image/overlay2/layerdb/mounts: 每个容器ID等信息 image/overlay/repositories.json: 镜像的相关信息 |
network | 存储 Docker 网络的数据,包含 Docker 网络的配置和状态信息。 |
overlay2 | Docker 存储驱动程序之一 Overlay2 的默认存储目录,用于保存 Docker 容器镜像和容器数据。 |
tmp | 存储 Docker 引擎的临时数据,如构建镜像时的临时文件等。 |
swarm | 存储 Docker Swarm 模式下的数据,包括 Swarm 集群的配置和状态信息。 |
trust | 存储 Docker 引擎的签名和证书数据,用于 Docker 镜像的安全性验证。 |
二、image子目录
[root@10 image]# ll
total 0
drwx------. 5 root root 81 Mar 28 10:00 overlay2
docker会在/var/lib/docker/image目录下按每个存储驱动的名字创建一个目录,如这里的overlay2。
接下来,使用tree命令浏览一下这个目录
[root@10 image]# tree -L 2 overlay2/
overlay2/
|-- distribution
| |-- diffid-by-digest
| `-- v2metadata-by-diffid
|-- imagedb
| |-- content
| `-- metadata
|-- layerdb
| |-- mounts
| |-- sha256
| `-- tmp
`-- repositories.json
这里关键的是imagedb和layerdb目录,它们是用来存储元数据的地方,区分image和layer是因为可能有多个image会指向某个layer。比nginx的docker镜像为例:
[root@10 sha256]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
...
nginx latest 2bcb04bdb83f 3 days ago 109MB
...
可以看到,imageID,我们再打印/var/lib/docker/image/overlay2/imagedb/content/sha256这个目录
image元数据包括了镜像架构(如amd64)、操作系统、镜像默认配置、构建该镜像的容器ID和配置、创建时间、创建该镜像的docker版本、构建镜像的历史信息以及rootfs组成。其中构建镜像的历史信息和rootfs组成部分除了具了描述镜像的作用外,还将镜像和构建该镜像的镜像层关联起来。
oot@10 sha256]# ll
total 20
-rw-------. 1 root root 6025 Mar 28 09:01 2bcb04bdb83f7c5dc30f0edaca1609a716bda1c7d2244d4f5fbbdfef33da366c
-rw-------. 1 root root 1512 Mar 28 10:00 6d1ef012b5674ad8a127ecfa9b5e6f5178d171b90ee462846974177fd9bdd39f
-rw-------. 1 root root 1497 Mar 28 08:51 d8233ab899d419c58cf3634c0df54ff5d8acc28f8173f09c21df4a07229e1205
-rw-------. 1 root root 1686 Mar 28 10:00 eb426204290971fb3c7cfbf25e34308233b75080b6b3735ba5295056d915a998
第一行正是记录我们nginx镜像元数据的文件,接下来cat一个这个文件,得到一个长长的json
......
"rootfs":{"type":"layers","diff_ids":
[
"sha256:5dacd731af1b0386ead06c8b1feff9f65d9e0bdfec032d2cd0bc03690698feda",
"sha256:dd0338cdfab32cdddd6c30efe8c89d0229d9f939e2bb736fbb0a52f27c2b0ee9",
"sha256:7e274c0effe81c48f9337879b058c729c33bd0199e28e2c55093d79398f5e8c0"
]
}}
......
上面只展示了关键的一部分,也就是rootfs,可以看到rootfs的diff_ids是一个包含了三个元素的数据,这个三个元素正是组成了nginx镜像的三个layerID,从上往下看,就是底层到项层,
对应镜像层的概念。
[root@10 layerdb]# ll
total 4
drwxr-xr-x. 3 root root 78 Mar 30 14:55 mounts
drwxr-xr-x. 8 root root 4096 Mar 28 10:00 sha256
drwxr-xr-x. 2 root root 6 Mar 28 10:00 tmp
只管mounts和sha256两个目录,再打印一个sha256目录
[root@10 sha256]# ll /var/lib/docker/image/overlay2/layerdb/sha256/
total 0
drwx------. 2 root root 85 Mar 28 09:01 166d13b0f0cb542034a2aef1c034ee2271e1d6aaee4490f749e72d1c04449c5b
drwx------. 2 root root 71 Mar 28 10:00 3fc64803ca2de7279269048fe2b8b3c73d4536448c87c32375b2639ac168a48b
drwx------. 2 root root 71 Mar 28 09:01 5dacd731af1b0386ead06c8b1feff9f65d9e0bdfec032d2cd0bc03690698feda
drwx------. 2 root root 85 Mar 28 10:00 95c536e393c4ffb38d29829c8ed21ae788832580a77436f15907bf646fe13387
drwx------. 2 root root 71 Mar 28 08:51 adab5d09ba79ecf30d3a5af58394b23a447eda7ffffe16c500ddc5ccb4c0222f
drwx------. 2 root root 85 Mar 28 09:01 dfce9ec5eeabad339cf90fce93b20f179926d5819359141e49e0006a52c066ca
在这里我们可以发现最底层的layer,因为docker使用chainID的方式去保存这些layer,所以上层的sha256 id是根据下一层的id和记录的id计算而来。
repository是由具有某个功能docker镜像的所有迭代版本构成的镜像库,repository元数据位于/var/lib/docker/image/overlay2/repositories.json文件下。
它存储了所有本地镜像的名字、标签、对应的镜像ID。
三、overlay2子目录
每个容器的文件夹中包含多个子目录,其中最重要的是 diff 目录,它用于存储容器的可写层。当 Docker 容器需要修改文件时,Overlay2 驱动程序会将这些修改记录在 diff 目录下的文件中。