Device Mapper 是 Linux 内核中的一套块设备映射框架,也是许多高级卷管理能力的基础。Docker 的 device mapper 存储驱动正是基于这套机制,利用精简配置与快照能力来管理镜像和容器。
与基于文件系统层工作的存储方式不同,device mapper 直接在块级别运行,并使用专门分配给 Docker 的块设备来存储数据。因此,这种方式通常比在操作系统文件系统之上进行文件级操作更高效,也可以通过为主机增加物理存储来扩展容量。
在支持 device mapper 的系统中,Linux 内核通常已经具备相关能力,但若要配合 Docker 使用,仍然需要额外的配置和依赖组件。
适用环境与依赖
device mapper 存储驱动可用于运行 Docker Engine 的多种 Linux 发行版环境,例如 CentOS、Fedora、Ubuntu 和 Debian。
在使用前,需要先安装以下软件包:
- lvm2
- device-mapper-persistent-data
另外需要注意,切换 Docker 存储驱动后,系统中此前已创建的本地容器和镜像将无法继续直接访问。为了避免数据丢失,建议提前做好备份,例如使用 docker save 导出镜像,或将现有镜像推送到 Docker Hub 或私有镜像仓库。
测试环境下配置 device mapper
下面介绍的是用于测试的 loop-lvm 模式配置方法。这种模式通过“回环设备”机制,把本地磁盘上的普通文件模拟成块设备来使用。
虽然 loop-lvm 配置简单,适合验证环境是否具备基础依赖,例如内核支持、用户空间工具是否齐全等,但它并不适合生产环境。原因在于回环设备会额外经过文件系统层,IO 开销较大,性能较差,还可能引入竞争条件。
因此,loop-lvm 更适合作为排查和验证用途。在正式生产环境中,应使用 direct-lvm 模式。
配置步骤
在开始之前,请先确认系统已经满足所需前提条件,并已安装必要依赖。
1. 停止 Docker 服务
$ sudo systemctl stop docker
2. 编辑 /etc/docker/daemon.json
如果该文件不存在,可以直接创建。假设文件当前为空,可写入以下内容:
{
“storage-driver”: “devicemapper”
}
需要特别注意,daemon.json 必须是合法的 JSON 格式,否则 Docker 将无法正常启动。
3. 启动 Docker 服务
$ sudo systemctl start docker
4. 验证当前存储驱动
执行 docker info,确认 Storage Driver 已切换为 devicemapper:
$ docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 17.03.1-ce
Storage Driver: devicemapper
Pool Name: docker-202:1-8413957-pool
Pool Blocksize: 65.54 kB
Base Device Size: 10.74 GB
Backing filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data space used: 11.8 MB
Data space total: 107.4 GB
Data space available: 7.44 GB
Metadata space used: 581.6 KB
Metadata space total: 2.147 GB
Metadata space available: 2.147 GB
Thin Pool minimum free space: 10.74 GB
Udev Sync supported: true
Deferred Removal Enabled: false
Deferred Deletion Enabled: false
Deferred Deleted Device Count: 0
Data loop file: /var/lib/docker/devicemapper/data
Metadata loop file: /var/lib/docker/devicemapper/metadata
Library Version: 1.02.135-RHEL7 (2016-11-16)
如何判断是否处于 loop-lvm 模式
如果在 docker info 的输出中看到 Data loop file 和 Metadata loop file,并且它们位于 /var/lib/docker/devicemapper/ 目录下,就说明当前系统使用的是 loop-lvm 模式。这里的文件本质上是通过回环方式挂载的稀疏文件,而不是真正的物理块设备。
再次强调,这种模式仅适合测试和基础验证,不建议用于生产环境。若要在正式业务场景中使用 device mapper,应进一步配置 direct-lvm 模式,以获得更稳定的性能和更可靠的行为。
