跳转至

devicemapper 实践

devicemapper 是 Docker 中一种重要的存储驱动,广泛应用于生产环境中。它通过 Linux 内核的 Device Mapper 技术实现容器的存储管理,提供了高效的数据持久化和存储资源管理能力。

devicemapper 基于 Linux 内核的 Device Mapper 框架,通过以下机制实现容器的存储管理:

  1. 存储池(Thin Pool)
    devicemapper 使用一个存储池来管理容器的存储资源。存储池由两个部分组成:
  2. 数据卷(Data Volume):存储实际数据。
  3. 元数据卷(Metadata Volume):存储数据的元信息(如块映射关系)。

  4. 写时复制(Copy-on-Write, CoW)
    当容器需要修改数据时,devicemapper 会创建一个新的数据块,而不是直接修改原始数据。这种机制确保了数据的高效管理和快速快照。

  5. 快照(Snapshot)
    devicemapper 支持快速创建容器的快照,这对于备份和恢复操作非常有用。

配置方法

1. 安装与启用 devicemapper

在大多数 Linux 发行版中,devicemapper 是 Docker 的默认存储驱动。如果未启用,可以通过以下步骤配置:

  1. 编辑 Docker 配置文件 /etc/docker/daemon.json

    {
      "storage-driver": "devicemapper",
      "storage-opts": [
        "dm.thinpooldev=/dev/mapper/docker-thinpool",
        "dm.use_deferred_removal=true",
        "dm.use_deferred_deletion=true"
      ]
    }
    

  2. 重启 Docker 服务:

    sudo systemctl restart docker
    

2. 创建 Thin Pool

devicemapper 需要一个 Thin Pool 来管理存储资源。以下是创建 Thin Pool 的步骤:

  1. 创建物理卷(PV)和卷组(VG):

    pvcreate /dev/sdb
    vgcreate docker /dev/sdb
    

  2. 创建 Thin Pool:

    lvcreate --thinpool docker-thinpool --size 100G docker
    

  3. 配置 Thin Pool 自动扩展:

    lvchange --metadataprofile docker-thinpool docker/docker-thinpool
    

性能优化

1. 调整 Thin Pool 大小

Thin Pool 的大小直接影响容器的存储性能。建议根据实际需求动态调整 Thin Pool 的大小:

lvextend --size +50G /dev/docker/docker-thinpool

2. 启用延迟删除

延迟删除(Deferred Deletion)可以减少删除操作对性能的影响:

{
  "storage-opts": [
    "dm.use_deferred_deletion=true"
  ]
}

3. 监控 Thin Pool 使用情况

使用 dmsetup 命令监控 Thin Pool 的使用情况:

dmsetup status docker-thinpool

应用场景

1. 数据持久化

devicemapper 支持数据卷的持久化存储,适用于需要长期保存数据的场景(如数据库容器)。

2. 快速快照

通过 devicemapper 的快照功能,可以快速备份和恢复容器数据。

3. 多租户环境

在需要隔离存储资源的多租户环境中,devicemapper 提供了高效的资源管理能力。


与其他存储驱动的对比

特性 devicemapper overlay2 aufs
性能
快照支持
数据持久化
资源隔离
适用场景 生产环境 开发环境 旧版本兼容

参考文档