详解 Docker 和 Containerd 目录结构及存储机制
本文将详细介绍 Docker 和 Containerd 这两种流行的容器运行时工具的目录结构和存储机制,并对它们之间的主要区别进行对比。感兴趣的读者一同来探究一下吧!首先,让我们来了解一下它们的目录结构和存储机制。Docker 和 Containerd 都有自己独特的方式来组织目录结构和管理存储。接下来,我们将分别探讨它们的存储路径、挂载点管理、配置文件和日志文件等方面的不同之处。通过对比这些关键细节,我们可以更清晰地了解 Docker 和 Containerd 之间的差异。
一、Docker 目录结构与存储机制
1. Docker 存储目录
Docker 默认将数据存储在 /var/lib/docker 目录下。这个目录包含以下子目录和文件:
/var/lib/docker/containers:- 存储每个容器的配置文件和日志文件。
- 每个容器的目录以容器 ID 命名,包含
config.v2.json和日志文件。

/var/lib/docker/overlay2:- 存储使用 Overlay2 存储驱动的容器文件系统。每个容器的文件系统由多个层组成,包括只读层(镜像层)和可写层(容器层)。
merged:联合挂载后的目录,容器的根目录。diff:容器的可写层,存储容器运行时的修改。lower:记录父层的哈希值。
/var/lib/docker/volumes:- 存储 Docker 卷的数据。
- 每个卷的目录以卷名命名,包含卷的数据。
/var/lib/docker/network:- 存储 Docker 网络相关的配置和状态信息。
/var/lib/docker/image:- 存储镜像的元数据。
/var/lib/docker/containers:- 存储容器的配置文件和日志文件。
2. Docker 容器的根目录
Docker 容器的根目录位于 /var/lib/docker/overlay2 下的 merged 目录。例如:
/var/lib/docker/overlay2/<layer_id>/merged
3. 查看 Docker 容器的挂载点
可以使用以下命令查看 Docker 容器的挂载点:
docker inspect --format '{{.GraphDriver.Data.WorkDir}}' <容器 ID>
二、Containerd 目录结构与存储机制
1. Containerd 存储目录
Containerd 默认将数据存储在 /var/lib/containerd 目录下。这个目录包含以下子目录和文件:

/var/lib/containerd/io.containerd.content.v1.content:
存储容器镜像的内容。
/var/lib/containerd/io.containerd.grpc.v1.cri:
存储与 Kubernetes CRI(Container Runtime Interface)相关的数据。
/var/lib/containerd/io.containerd.metadata.v1.bolt:
存储元数据,使用 BoltDB。
/var/lib/containerd/io.containerd.runtime.v1.linux:
存储容器的运行时信息。
/var/lib/containerd/io.containerd.runtime.v2.task:
存储容器的运行时任务信息。
/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs:
存储使用 OverlayFS 文件系统的容器快照。
/var/lib/containerd/tmpmounts:
存储临时挂载点。
2. Containerd 容器的根目录
Containerd 容器的根目录通常位于 /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs 下的某个快照目录中。例如:
/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/<snapshot_id>/fs
<snapshot_id>:快照的唯一标识符。
3. 查看 Containerd 容器的挂载点
可以使用以下命令查看 Containerd 容器的挂载点:
crictl inspect <容器 ID> | jq -r '.info.runtimeSpec.mounts[] | select(.destination == "/") | .source'
4. 查找快照与容器的对应关系
以下是一个示例脚本,帮助你找到每个快照对应的容器:
#!/bin/bash
# 获取所有容器的 ID
container_ids=$(crictl ps -q)
# 遍历每个容器
for container_id in $container_ids; do
# 获取容器的挂载点路径
mount_path=$(crictl inspect $container_id | jq -r '.info.runtimeSpec.mounts[] | select(.destination == "/") | .source')
# 检查挂载点路径是否在 snapshots 目录中
if [ -n "$mount_path" ]; then
snapshot_id=$(basename $mount_path)
echo "Container ID: $container_id, Snapshot ID: $snapshot_id"
fi
done
三、Docker 和 Containerd 的主要区别
1. 存储路径
- Docker:
/var/lib/docker/overlay2 - Containerd:
/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs
2. 挂载点管理
- Docker:使用
docker inspect查看挂载点。 - Containerd:使用
crictl inspect查看挂载点。
3. 配置文件
- Docker:
/etc/docker/daemon.json - Containerd:
/etc/containerd/config.toml
4. 日志文件
- Docker:
/var/log/docker.log - Containerd:
/var/log/containerd.log
四、实用命令
1. Docker 查看容器的挂载点:
docker inspect --format '{{.GraphDriver.Data.WorkDir}}' <容器 ID>
2. Containerd
查看容器的挂载点:
crictl inspect <容器 ID> | jq -r '.info.runtimeSpec.mounts[] | select(.destination == "/") | .source'
查看所有容器的挂载点:
crictl ps -q | xargs -I {} sh -c 'crictl inspect {} | jq -r ".info.runtimeSpec.mounts[] | select(.destination == \"/\") | .source"'
五、总结
- Docker 和 Containerd 都使用 OverlayFS 文件系统来管理容器的文件系统。
- Docker 的存储路径在
/var/lib/docker/overlay2,而 Containerd 的存储路径在/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs。 - Docker 使用
docker inspect查看容器的挂载点,而 Containerd 使用crictl inspect查看挂载点。 - Docker 的配置文件是
/etc/docker/daemon.json,而 Containerd 的配置文件是/etc/containerd/config.toml。
以上关于详解 Docker 和 Containerd 目录结构及存储机制的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 详解 Docker 和 Containerd 目录结构及存储机制


微信
支付宝