插件窝 干货文章 Docker 和 Containerd 目录结构及存储机制详解

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

存储 Containerd Docker 数据 546    来源:    2025-04-01

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

一、Docker 目录结构

Docker 默认将数据存储在 /var/lib/docker 目录下(Linux 系统),主要包含以下子目录:

/var/lib/docker/
├── buildkit/            # BuildKit 构建缓存
├── containers/          # 容器运行时数据
├── image/               # 镜像存储
│   ├── overlay2/        # Overlay2 存储驱动数据
│   └── [其他存储驱动]
├── network/             # 网络配置
├── plugins/             # 插件存储
├── runtimes/            # 运行时数据
├── swarm/               # Swarm 集群数据
├── tmp/                 # 临时文件
├── trust/               # 信任证书
├── volumes/             # 卷数据
└── [其他文件]

关键目录详解

  1. image/overlay2/

    • layerdb/: 存储镜像层元数据
    • imagedb/: 存储镜像元数据
    • distribution/: 存储从 registry 拉取的镜像摘要信息
  2. containers/

    • 每个容器有一个独立目录,包含:
      • config.v2.json: 容器配置
      • hostname: 容器主机名
      • hosts: 容器 hosts 文件
      • resolv.conf: DNS 配置
      • [container-id]-json.log: 容器日志
  3. volumes/

    • 每个卷有一个独立目录,包含卷数据

二、Containerd 目录结构

Containerd 默认数据存储在 /var/lib/containerd 目录下:

/var/lib/containerd/
├── io.containerd.content.v1.content/  # 内容存储
├── io.containerd.metadata.v1.bolt/    # 元数据数据库
├── io.containerd.runtime.v1.linux/    # 运行时数据
├── io.containerd.snapshotter.v1.[snapshotter]/  # 快照存储
│   └── [snapshotter-specific-data]
├── tmp/                               # 临时文件
└── [其他文件]

关键目录详解

  1. io.containerd.content.v1.content/

    • 存储所有内容可寻址的 blob 数据
    • 使用 SHA256 摘要作为文件名
  2. io.containerd.metadata.v1.bolt/

    • 包含 meta.db BoltDB 数据库文件
    • 存储命名空间、容器、镜像等元数据
  3. io.containerd.snapshotter.v1.[snapshotter]/

    • 根据使用的快照驱动不同(如 overlayfs、zfs 等)
    • 存储镜像层和容器可写层的快照

三、存储机制对比

Docker 存储机制

  1. 存储驱动

    • 支持多种驱动:overlay2、aufs、btrfs、zfs、devicemapper 等
    • overlay2 是默认推荐驱动
  2. 镜像存储

    • 使用分层存储模型
    • 每层存储为目录,包含 diff(变更)和 merged(合并视图)
  3. 容器存储

    • 每个容器在镜像层之上添加可写层
    • 使用 Copy-on-Write (CoW) 机制

Containerd 存储机制

  1. 内容存储

    • 基于内容可寻址存储 (CAS)
    • 每个对象通过其内容的 SHA256 哈希引用
  2. 快照系统

    • 插件式架构支持多种快照驱动
    • 负责管理容器文件系统的快照
  3. 元数据存储

    • 使用 BoltDB 存储元数据
    • 支持多租户命名空间隔离

四、迁移与清理

迁移存储位置

Docker:

# 1. 停止Docker
sudo systemctl stop docker

# 2. 编辑配置文件 /etc/docker/daemon.json
{
  "data-root": "/new/path/to/docker"
}

# 3. 复制数据
rsync -a /var/lib/docker/ /new/path/to/docker/

# 4. 启动Docker
sudo systemctl start docker

Containerd:

# 1. 停止containerd
sudo systemctl stop containerd

# 2. 编辑配置文件 /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd]
  root = "/new/path/to/containerd"

# 3. 复制数据
rsync -a /var/lib/containerd/ /new/path/to/containerd/

# 4. 启动containerd
sudo systemctl start containerd

清理存储空间

Docker:

# 清理无用数据
docker system prune -a -f --volumes

# 查看磁盘使用
docker system df

Containerd:

# 使用crictl清理
crictl rmi --prune

# 或者使用ctr命令
ctr images ls -q | xargs ctr images rm

五、性能优化建议

  1. 存储驱动选择

    • Linux 首选 overlay2
    • 避免使用 devicemapper 在 loopback 模式
  2. 文件系统

    • 使用 xfs 或 ext4 文件系统
    • 为 Docker/Containerd 数据目录单独挂载高性能存储
  3. 定期维护

    • 设置定期清理策略
    • 监控存储使用情况
  4. 日志管理

    • 配置日志轮转和大小限制
    • 考虑使用日志驱动将日志发送到外部系统

通过深入了解 Docker 和 Containerd 的存储机制,可以更好地管理容器化环境的存储资源,优化性能并避免存储相关问题。