千家信息网

怎么配置docker使用devicemapper

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容介绍了"怎么配置docker使用devicemapper"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够
千家信息网最后更新 2026年11月02日怎么配置docker使用devicemapper

本篇内容介绍了"怎么配置docker使用devicemapper"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

devicemapper 最佳实践

docker 最先是跑在ubuntu和debian上的,使用aufs存储器. 由于docker越来越流行,许多公司希望在RHEL上使用,但是上游内核中没有包括aufs,所以rhel不能使用aufs. 最终开发者们开发了一个新的后端存储引擎devicemapper,基于已有的Device Mapper技术,并且使docker支持可插拔,现在全世界有很多真实案例在生产环境使用devicemapper.

镜像层与共享

devicemapper存储每个镜像和容器在自己的虚拟设备上,也就是说这些设备是按需分配(copy-on-write snapshot devices),Device Mapper技术是工作在block级别的而不是文件级别的.

devicemapper创建镜像的方式是:

  1. devicemapper基于块设备或loop mounted sparse files来创建一个虚拟池.

  2. 然后在上面创建一个有文件系统的基础设备(base device).

  3. 每个镜像层就是基于这个基础设备的COW快照(snapshot),也就是说这些快照初始化时是空的,只有数据写入时才会占用池中的空间.


devicemapper的读操作

  1. 容器中的应用请求块0x44f,因为容器层也是个虚拟的快照,不存数据,只有指针.通过指针找到存放数据的镜像层.

  2. 根据指针找到a005e层的0xf33.

  3. devicemapper copy其中的数据到容器内存中.

  4. 存储驱动器返回数据给请求的应用.

devicemapper的写操作

devicemapper写操作是通过allocate-on-demand(按需分配)的方式.更新数据是通过COW方式. 因为devicemapper是一种基于块的技术,所以就算修改一个大文件,也不会copy整个文件过来.只会copy对应要修改的块.

写新数据

写56k的数据到容器中:

  1. 应用请求写56k的数据到容器

  2. 按需分配一个新的64k大小的块在容器层.(超过64k,则分配多个)

  3. 数据写入新分配的块中

修改数据

  1. 应用请求修改容器中数据

  2. cow操作定位到要更新的块

  3. 分配新的块在容器层并将数据copy过来

  4. 对数据进行修改

配置docker使用devicemapper

基于rhel的分支默认使用的devicemapper,并且默认配置成loop-lvm模式运行.这种模式使用文件来作为虚拟池(thin pool)构建镜像和容器的层. 但是生产环境不因该使用这种模式.

通过docker info命令来检查

[root@srv00 ~]# docker info  WARNING: Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.... Data loop file: /var/lib/docker/devicemapper/devicemapper/data Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata Library Version: 1.02.107-RHEL7 (2015-12-01) ...

Data loop file,Metadata loop file指示了docker运行在loop-lvm模式下,并且还有个WARNING.

为生产环境配置direct-lvm模式

生产环境下因该使用direct-lvm,如果之前有镜像在loop-lvm模式下创建,需要切换,则因该将镜像做备份.(push到hub或私有registry)

我给虚拟机分配个30G磁盘

1.停止docker daemon

[root@srv00 ~]# systemctl stop docker

2.创建相关的逻辑卷和thinpool

创建pv

[root@srv00 ~]# fdisk -l <==检查下磁盘...Disk /dev/xvdb: 32.2 GB, 32212254720 bytes, 62914560 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytes[root@srv00 ~]# pvcreate /dev/xvdb  Physical volume "/dev/xvdb" successfully created

创建vg

[root@srv00 ~]# vgcreate vgdocker /dev/xvdb  Volume group "vgdocker" successfully created

创建一个thin pool,名字叫thinpool,先来创建逻辑卷

[root@srv00 ~]# lvcreate --wipesignatures y -n thinpool -l 95%VG vgdocker  Logical volume "thinpool" created.[root@srv00 ~]# lvcreate --wipesignatures y -n thinpoolmeta -l 1%VG vgdocker    Logical volume "thinpoolmeta" created.[root@srv00 ~]# lvscan  ACTIVE            '/dev/centos/swap' [4.00 GiB] inherit  ACTIVE            '/dev/centos/root' [35.47 GiB] inherit  ACTIVE            '/dev/vgdocker/thinpool' [28.50 GiB] inherit  ACTIVE            '/dev/vgdocker/thinpoolmeta' [304.00 MiB] inherit

剩余的4%留给它们自动扩展

转换成thin pool

[root@srv00 ~]# lvconvert -y --zero n -c 512K --thinpool vgdocker/thinpool --poolmetadata vgdocker/thinpoolmeta  WARNING: Converting logical volume vgdocker/thinpool and vgdocker/thinpoolmeta to pool's data and metadata volumes.  THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)  Converted vgdocker/thinpool to thin pool.

设置thinpool的自动扩展参数,并应用此profile

[root@srv00 ~]# vi /etc/lvm/profile/docker-thinpool.profileactivation {    thin_pool_autoextend_threshold=80    thin_pool_autoextend_percent=20}[root@srv00 ~]# lvchange --metadataprofile docker-thinpool vgdocker/thinpool  Logical volume "thinpool" changed.

当空间大于80%时进行扩展.扩展的大小是空闲空间的20%

查看thinpool是否是已监视状态

[root@srv00 ~]# lvs -o+seg_monitor  LV       VG        Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Monitor    root     centos    -wi-ao---- 35.47g                                                                swap     centos    -wi-ao----  4.00g                                                                thinpool vgdocker twi-a-t--- 28.50g             0.00   0.02                             monitored

3.删除docker存储目录

[root@srv00 ~]# rm -rf /var/lib/docker/*

注意备份重要镜像等

4.修改启动参数并启动

我们通过systemd的drop-in方式修改,也是官方推荐的

[root@srv00 ~]# mkdir /etc/systemd/system/docker.service.d[root@srv00 ~]# vi /etc/systemd/system/docker.service.d/daemon.conf[Service]ExecStart=ExecStart=/usr/bin/docker daemon -H fd:// --storage-driver=devicemapper --storage-opt=dm.thinpooldev=/dev/mapper/vgdocker-thinpool --storage-opt dm.use_deferred_removal=true[root@srv00 ~]# systemctl daemon-reload[root@srv00 ~]# systemctl start docker

ExecStart= 第一行是空.否则启动会报错,并且修改daemon参数需要reload

5.检查确认

[root@srv00 docker]# docker infoContainers: 0 Running: 0 Paused: 0 Stopped: 0Images: 0Server Version: 1.11.1Storage Driver: devicemapper Pool Name: vgdocker-thinpool Pool Blocksize: 524.3 kB Base Device Size: 10.74 GB Backing Filesystem: xfs ... [root@srv00 docker]# lvs -a  LV               VG       Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert  root             centos   -wi-ao----  35.47g                                                      swap             centos   -wi-ao----   4.00g                                                      [lvol0_pmspare]  vgdocker ewi------- 304.00m                                                      thinpool         vgdocker twi-a-t---  28.50g             0.07   0.02                              [thinpool_tdata] vgdocker Twi-ao----  28.50g                                                      [thinpool_tmeta] vgdocker ewi-ao---- 304.00m                                                    [root@srv00 docker]# lsblkNAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTsr0                        11:0    1 114.4M  0 rom  xvda                      202:0    0    40G  0 disk ├─xvda1                   202:1    0   500M  0 part /boot└─xvda2                   202:2    0  39.5G  0 part   ├─centos-root           253:0    0  35.5G  0 lvm  /  └─centos-swap           253:1    0     4G  0 lvm  [SWAP]xvdb                      202:16   0    30G  0 disk ├─vgdocker-thinpool_tmeta 253:2    0   304M  0 lvm  │ └─vgdocker-thinpool     253:5    0  28.5G  0 lvm  └─vgdocker-thinpool_tdata 253:3    0  28.5G  0 lvm    └─vgdocker-thinpool     253:5    0  28.5G  0 lvm

然后就可以正常的docker run 了

devicemapper的性能影响

  • Allocate-on-demand性能影响

之前讲说,如果容器中要写数据,则会在容器层分配新的块,每个快64k,如果要写的数据大于64k,则会分配多个块. 如果容器中有许多小文件的写操作..则会影响性能.

  • Copy-on-write 性能影响

容器中第一次更新一个已有数据时,就会进行cow操作,如果更新大文件的某一部分,则只会copy相应的数据快,这个性能提升很大. 如果更新大量小文件(<=64k),devicemapper的性能就比AUFS差.

  • 其他

    • loop-lvm模式的性能很差,不推荐使用在生产环境.生产环境使用direct-lvm模式,它是直接操作raw设备.

    • 使用ssd的话提升更明显

    • devicemapper内存使用不是最有效的.运行n个容器会加载n次相同文件到内存.所以不是运行pass平台和高密度容器最好的选择.

  • 当然容器中写操作多的话要尽量使用data volume,它是绕过storage driver,性能有保证

"怎么配置docker使用devicemapper"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

数据 容器 文件 镜像 性能 模式 环境 设备 分配 生产 配置 存储 应用 更新 方式 影响 运行 按需分配 内存 参数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东万易互联网科技有限公司惠州分公司 上海卓越科技互联网 互联网科技产业 科技金融是不是互联网金融 圆梦互联网科技 南京欣网互联网科技 互联网科技公司介绍 联恩商钥互联网科技有限公司 青岛中康互联网医疗科技有限公司 剑昆互联网络科技有限公司临桂 消费医药和互联网科技 电子科技大学互联网创业大赛 互联网科技研发水平 科技大学互联网 互联网第三次科技革命特征 广州百诚互联网科技有限公司官网 卡尔迅互联网科技有限公司 科技互联网行业投资研究 保山互联网科技靠谱吗 互联网金融金融科技 广东猪兼强互联网科技有限公司 美国互联网前沿科技 安控科技rtu产品工业互联网 互联网金融中的现代科技 乌苏新华互联网科技做什么的 畅思互联网科技 伍佰万互联网科技怎么赚钱 产业互联网科技服务公司 吉林省码上互联网科技电话 云南互联网科技学费
0