Docker 和 Containerd 目录结构及存储机制详解

 更新时间:2025年02月11日 15:05:58   作者:喝醉酒的小白  
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

<layer_id>:容器的文件系统层的唯一标识符。

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"'

五、总结

  • DockerContainerd 都使用 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 目录结构及存储机制的文章就介绍到这了,更多相关Docker 和 Containerd 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用docker搭建sonarqube的方法

    使用docker搭建sonarqube的方法

    这篇文章主要介绍了使用docker搭建sonarqube的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Docker容器如何查看ip地址的实现方法

    Docker容器如何查看ip地址的实现方法

    这篇文章主要介绍了Docker容器如何查看ip地址的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 推送docker镜像到harbor的实现方式

    推送docker镜像到harbor的实现方式

    这篇文章主要介绍了推送docker镜像到harbor的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Docker volumes数据导出的五种实用方法

    Docker volumes数据导出的五种实用方法

    在容器化应用的日常运维中,数据管理是一个至关重要的环节,Docker volumes作为Docker推荐的数据持久化方案,承载着应用程序的关键数据,本文将详细介绍5种实用的Docker volumes数据导出方法,每种方法都有其适用场景,需要的朋友可以参考下
    2025-09-09
  • 使用Docker部署war包项目的实现

    使用Docker部署war包项目的实现

    这篇文章主要介绍了使用Docker部署war包项目的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 基于docker部署Jenkins的详细教程

    基于docker部署Jenkins的详细教程

    这篇文章主要介绍了基于docker部署Jenkins,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Linux下docker 容器退出bash的两种实现方法

    Linux下docker 容器退出bash的两种实现方法

    这篇文章主要介绍了Linux下docker 容器退出bash的两种实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Docker 监控平台部署的两种实现步骤

    Docker 监控平台部署的两种实现步骤

    本文主要介绍了Docker 监控平台部署的两种实现步骤,包括cAdvisor、Prometheus和Grafana,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • Docker容器内安装ps命令的详细操作步骤

    Docker容器内安装ps命令的详细操作步骤

    在 Docker 容器的日常管理和故障排查过程中,ps命令是一个不可或缺的工具,当我们在容器内执行ps命令时,可能会遇到报错,下面我们就来看看如何根据不同的 Linux 发行版,采用相应的方法来安装ps命令吧
    2025-06-06
  • Docker内如何访问本机(宿主机)的具体方法

    Docker内如何访问本机(宿主机)的具体方法

    这篇文章主要介绍了Docker内如何访问本机(宿主机)的具体方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10

最新评论