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命令浏览一下这个目录

1、overlay2目录

[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这个目录

(1)imagedb子目录

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,从上往下看,就是底层到项层,

(2)layerdb子目录

对应镜像层的概念。

[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计算而来。

(3)repositories.json

repository是由具有某个功能docker镜像的所有迭代版本构成的镜像库,repository元数据位于/var/lib/docker/image/overlay2/repositories.json文件下。

它存储了所有本地镜像的名字、标签、对应的镜像ID。

三、overlay2子目录

在 /var/lib/docker/overlay2 目录下,每个容器都对应一个文件夹,文件夹的名称是由两个长随机字符串组成的,每个字符串对应一个不同的命名空间。其中一个字符串对应于 Overlay2 驱动程序的命名空间,它用于标识这个容器的图层;另一个字符串对应于挂载点的命名空间,用于在宿主机文件系统中创建一个目录,用于挂载这个容器的可写层。

每个容器的文件夹中包含多个子目录,其中最重要的是 diff 目录,它用于存储容器的可写层。当 Docker 容器需要修改文件时,Overlay2 驱动程序会将这些修改记录在 diff 目录下的文件中。

 




相关推荐

目的 在你的maven项目中创建一个Docker镜像。比方说,build过程可以为java服务输出一个可以运行该服务的Docker镜像。 步骤 有两种配置方式,一种是通过Dockerfile文件,一种

dockerfile-maven-plugin主要作用是在项目构建的时候生成项目的docker镜像文件。 正常情况下,我们开发一个应用程序后,会使用maven进行打包,生成对应的j

一、/var/lib/docker/containers 目录存放的是创建好的容器和主机有关的配置,因为这类配置和本地环境有关,所以不方便放入镜像之中,所以就放在这里。

一、概述 Docker使用Go语言开发,基于Linux内核的cgroup、namespace以及OverlayFS类的Union FS等技术,对进程进行封装隔离。 docker-ce是社区版,dock

一、概述 overlay2和早期的aufs类似,但它性能更好。因为overlay2只有两层,不是多层,所以操作快于aufs。 overlayFS在Linux 3.18开始正式支持,它能将上层目录(up

一、概述     Docker Compose 是 Docker 提供的一个工具,用于定义和运行多容器的 Docker 应用。通过一个 YAML 文件,你可以配置应用的所有服务,然后使用一个命令来创建

一、概述 Portainer 是一个开源的容器管理平台,旨在简化 Docker 和 Kubernetes 环境的管理。它提供了一个直观的 Web 界面,使用户可以轻松地管理容器、镜像、网络、卷、堆栈以