Device Mapper 是一个基于内核的框架,它支持 Linux 上的许多高级卷管理技术。Docker的devicemapper存储驱动程序利用此框架的精简配置和快照功能来管理映像和容器。为了使Device Mapper在生产环境中实现最佳性能,我们需要将底层修改为direct-lvm模式。而设置方法又分为自动设置和手动设置。二者的主要区别在于前者只能配置一个块设备,并且只有在第一次安装后才能设置生效;后者可以配置多个块设备。下面基于Centos版本和基于Ubuntu版本进行两种方式的演示。后期遇到其他Linux版本会实时更新。

一、参考文献

Docker官方指南

二、环境介绍

1、Ubuntu版本:Ubuntu20.0.4 2、Centos版本:Centos7-X86_64-Eeverything2009

三、Docker自动设置direct-lvm

3.1 基于Ubuntu版本Linux设置

1、执行apt-get install thin-provisioning-tools lvm2 -y命令安装包和依赖源。

root@zq-virtual-machine:/home/zq/Desktop# apt-get install thin-provisioning-tools lvm2 -y

说明:Debian、SLES 15和Ubuntu一样也需要下载相同的包!!! 2、执行vi /etc/docker/daemon.json命令编辑daemon.json文件,添加以下内容。

root@zq-virtual-machine:/home/zq/Desktop# vi /etc/docker/daemon.json 
{
"storage-driver": "devicemapper",
"storage-opts": [
  "dm.directlvm_device=/dev/sdb",
  "dm.thinp_percent=95",
  "dm.thinp_metapercent=1",
  "dm.thinp_autoextend_threshold=80",
  "dm.thinp_autoextend_percent=20",
  "dm.directlvm_device_force=false"
]
}

3、执行cat /etc/docker/daemon.json命令检查配置文件。

root@zq-virtual-machine:/home/zq/Desktop# cat /etc/docker/daemon.json 
{
"storage-driver": "devicemapper",
"storage-opts": [
  "dm.directlvm_device=/dev/sdb",
  "dm.thinp_percent=95",
  "dm.thinp_metapercent=1",
  "dm.thinp_autoextend_threshold=80",
  "dm.thinp_autoextend_percent=20",
  "dm.directlvm_device_force=false"
]
}

4、针对第三步进行选项说明。

选项 说明
dm.directlvm_device 块设备的路径
dm.thinp_percent 从传入的块设备中用于存储的空间百分比
dm.thinp_metapercent 用于来自传入块设备的元数据存储的空间百分比
dm.thinp_autoextend_threshold lvm 应自动扩展精简池的阈值,占总存储空间的百分比
dm.thinp_autoextend_percent 触发自动扩展时增加精简池的百分比
dm.directlvm_device_force 允许用户决定是否将块设备格式化为新的文件系统

5、执行systemctl restart docker命令重启Docker。

root@zq-virtual-machine:/home/zq/Desktop# systemctl restart docker

6、执行systemctl status docker命令查看Docker状态,这里观察到,Docker状态为active (running)。

root@zq-virtual-machine:/home/zq/Desktop# systemctl status docker
 docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-10-03 14:59:24 CST; 25s ago
TriggeredBy:  docker.socket
       Docs: https://docs.docker.com
   Main PID: 10491 (dockerd)
      Tasks: 10
     Memory: 79.4M
     CGroup: /system.slice/docker.service
             └─10491 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

7、执行docker system info命令验证结果,这里观察到Storage Driver为devicemapper,默认为Overlay2。

root@zq-virtual-machine:/home/zq/Desktop# docker system info 
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.9.1-docker)
  compose: Docker Compose (Docker Inc., v2.10.2)
  scan: Docker Scan (Docker Inc., v0.17.0)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 20.10.18
 Storage Driver: devicemapper

3.2 基于Centos版本Linux设置

1、执行yum install device-mapper-persistent-data lvm2 -y命令安装包和依赖源。

[root@localhost student]# yum install device-mapper-persistent-data lvm2  -y

说明:RHEL和Centos一样也需要下载相同的包!!! 2、执行vi /etc/docker/daemon.json命令编辑daemon.json文件,添加以下内容。

root@zq-virtual-machine:/home/zq/Desktop# vi /etc/docker/daemon.json 
{
"storage-driver": "devicemapper",
"storage-opts": [
  "dm.directlvm_device=/dev/sdb",
  "dm.thinp_percent=95",
  "dm.thinp_metapercent=1",
  "dm.thinp_autoextend_threshold=80",
  "dm.thinp_autoextend_percent=20",
  "dm.directlvm_device_force=false"
]
}

3、执行cat /etc/docker/daemon.json命令检查配置文件。

[root@localhost student]# cat  /etc/docker/daemon.json
{
"storage-driver": "devicemapper",
"storage-opts": [
  "dm.directlvm_device=/dev/sdb",
  "dm.thinp_percent=95",
  "dm.thinp_metapercent=1",
  "dm.thinp_autoextend_threshold=80",
  "dm.thinp_autoextend_percent=20",
  "dm.directlvm_device_force=false"
]
}

4、针对第三步进行选项说明。

选项 说明
dm.directlvm_device 块设备的路径
dm.thinp_percent 从传入的块设备中用于存储的空间百分比
dm.thinp_metapercent 用于来自传入块设备的元数据存储的空间百分比
dm.thinp_autoextend_threshold lvm 应自动扩展精简池的阈值,占总存储空间的百分比
dm.thinp_autoextend_percent 触发自动扩展时增加精简池的百分比
dm.directlvm_device_force 允许用户决定是否将块设备格式化为新的文件系统

5、执行systemctl restart docker命令重启Docker。

[root@localhost student]# systemctl restart docker

6、执行systemctl status docker命令查看Docker状态,这里观察到,Docker状态为active (running)。

[root@localhost student]# systemctl status docker
 docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2022-10-03 16:43:19 CST; 54s ago

7、执行docker system info命令验证结果,这里观察到Storage Driver为devicemapper,默认为Overlay2。

[root@localhost student]# docker system info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.9.1-docker)
  compose: Docker Compose (Docker Inc., v2.10.2)
  scan: Docker Scan (Docker Inc., v0.17.0)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 20.10.18
 Storage Driver: devicemapper

四、Docker手动设置direct-lvm(LVM模式)

4.1 基于Ubuntu版本Linux设置

1、执行fdisk -l查看/dev/sdd空间是否充足。

root@zq-virtual-machine:/home/zq/Desktop# fdisk -l

Disk /dev/sdd: 5 GiB, 5368709120 bytes, 10485760 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

2、执行systemctl stop docker命令停止Docker服务。

root@zq-virtual-machine:/home/zq/Desktop# systemctl stop docker

3、执行apt-get install thin-provisioning-tools lvm2 -y命令安装包和依赖源。

root@zq-virtual-machine:/home/zq/Desktop# apt-get install thin-provisioning-tools lvm2 -y

4、执行pvcreate /dev/sdd命令在块设备上创建物理卷 。

root@zq-virtual-machine:/home/zq/Desktop# pvcreate /dev/sdd
  Physical volume "/dev/sdd" successfully created.

5、执行vgcreate docker /dev/sdd命令在块设备上创建物理卷 。

root@zq-virtual-machine:/home/zq/Desktop# vgcreate docker /dev/sdd
  Volume group"docker"successfully created

6、使用lvcreate命令创建名为thinpool和thinpoolmeta逻辑卷。其中最后一个参数指定在空间不足时允许自动扩展数据或元数据的可用空间量。

root@zq-virtual-machine:/home/zq/Desktop# lvcreate --wipesignatures y -n thinpool docker -l 95%VG
root@zq-virtual-machine:/home/zq/Desktop# lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG

7、使用命令将卷转换为精简池和精简池元数据的存储位置lvconvert。

root@zq-virtual-machine:/home/zq/Desktop# lvconvert -y \
> --zero n \
> -c 512K \
> --thinpool docker/thinpool \
> --poolmetadata docker/thinpoolmeta

8、通过配置文件配置精简池的自动扩展lvm。

root@zq-virtual-machine:/home/zq/Desktop# vi /etc/lvm/profile/docker-thinpool.profile

9、指定thin_pool_autoextend_threshold和thin_pool_autoextend_percent值。其中thin_pool_autoextend_threshold代表尝试自动扩展可用空间之前使用的空间百分比(100 = 禁用,不推荐);thin_pool_autoextend_percent代表自动扩展时添加到设备的空间量(0 = 禁用)。

下面的示例在磁盘使用率达到 80% 时增加了 20% 的容量。

activation {
  thin_pool_autoextend_threshold=80
  thin_pool_autoextend_percent=20
}

10、执行lvchange --metadataprofile docker-thinpool docker/thinpool命令应用 LVM 配置文件lvchange。

root@zq-virtual-machine:/home/zq/Desktop# lvchange --metadataprofile docker-thinpool docker/thinpool
  Logical volume docker/thinpool changed.

11、执行lvs -o+seg_monitor命令查看对逻辑卷是否启动监视。

root@zq-virtual-machine:/home/zq/Desktop# lvs -o+seg_monitor
  LV           VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Monitor  
  thinpool     docker twi-a-t--- <19.00g             1.21   7.88                             monitored
  thinpoolmeta docker -wi-a----- 204.00m 

12、如果第11步中Monitor列中的输出如上所述报告卷为not monitored,则需要显式启用监控。完成后,再使用lvs -o+seg_monitor命令进行查看。

root@zq-virtual-machine:/home/zq/Desktop# lvchange --monitor y docker/thinpool
root@zq-virtual-machine:/home/zq/Desktop# lvs -o+seg_monitor

说明:如果没有这一步,无论应用配置文件中的任何设置如何,都不会发生逻辑卷的自动扩展。

13、如果/var/lib/docker/存在,则先执行mkdir /var/lib/docker.bk命令创建一个新的目录,再执行mv /var/lib/docker/* /var/lib/docker.bk命令将其移动到新创建的目录中,以便 Docker 可以使用新的 LVM 池来存储映像和容器的内容。

root@zq-virtual-machine:/home/zq/Desktop#  mkdir /var/lib/docker.bk
root@zq-virtual-machine:/home/zq/Desktop#  mv /var/lib/docker/* /var/lib/docker.bk

14、执行vi /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"
    ]
}

15、执行reboot命令重启虚拟机,

root@zq-virtual-machine:/home/zq/Desktop# reboot

16、启动 Docker系统和服务。

root@zq-virtual-machine:/home/zq/Desktop# systemctl start docker
root@zq-virtual-machine:/home/zq/Desktop# service docker start

17、执行docker info命令验证Docker是否正在使用新配置。按照官方文档介绍:如果 Docker 配置正确,Data fileand和Metadata file为空,池名称为docker-thinpool。这里观察到,Data fileand和Metadata file为空,池名称为docker-thinpool,配置正确。

root@zq-virtual-machine:/home/zq/Desktop# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.9.1-docker)
  compose: Docker Compose (Docker Inc., v2.10.2)
  scan: Docker Scan (Docker Inc., v0.17.0)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 20.10.18
 Storage Driver: devicemapper
  Pool Name: docker-thinpool
  Pool Blocksize: 524.3kB
  Base Device Size: 10.74GB
  Backing Filesystem: ext4
  Udev Sync Supported: true
  Data Space Used: 246.4MB
  Data Space Total: 20.4GB
  Data Space Available: 20.15GB
  Metadata Space Used: 16.85MB
  Metadata Space Total: 213.9MB
  Metadata Space Available: 197.1MB
  Thin Pool Minimum Free Space: 2.039GB
  Deferred Removal Enabled: true
  Deferred Deletion Enabled: true
  Deferred Deleted Device Count: 0
  Library Version: 1.02.167 (2019-11-30)
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
 runc version: v1.1.4-0-g5fd4c4d
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: default
 Kernel Version: 5.15.0-48-generic
 Operating System: Ubuntu 20.04.4 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 1.896GiB
 Name: zq-virtual-machine
 ID: 77L7:DHZ7:NR67:CAD6:66MB:6N42:CZRR:UHH5:UHF4:NRIN:D3YM:PIJ7
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

18、确认配置正确后,执行rm -rf /var/lib/docker.bk命令可以删除 /var/lib/docker.bk之前的配置所在的目录。

root@zq-virtual-machine:/home/zq/Desktop# rm -rf /var/lib/docker.bk

4.2 基于Centos版本Linux设置

1、执行fdisk -l查看/dev/sdc空间是否充足。

[root@localhost student]# fdisk -l

Disk /dev/sdc: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

2、执行systemctl stop docker命令停止Docker服务。

[root@localhost student]# systemctl stop docker

3、执行yum install device-mapper-persistent-data lvm2 -y命令安装包和依赖源。

[root@localhost student]# yum install device-mapper-persistent-data lvm2  -y

4、执行pvcreate /dev/sdc命令在块设备上创建物理卷 。

[root@localhost student]# pvcreate /dev/sdc
  Physical volume "/dev/sdc" successfully created.

5、执行vgcreate docker /dev/sdc命令在同一设备上创建卷组。

root@localhost student]# vgcreate docker /dev/sdc
  Volume group"docker"successfully created

6、使用lvcreate命令创建名为thinpool和thinpoolmeta逻辑卷。其中最后一个参数指定在空间不足时允许自动扩展数据或元数据的可用空间量。

[root@localhost student]# lvcreate --wipesignatures y -n thinpool docker -l 95%VG
[root@localhost student]# lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG

7、使用命令将卷转换为精简池和精简池元数据的存储位置lvconvert。

[root@localhost student]# lvconvert -y \
> --zero n \
> -c 512K \
> --thinpool docker/thinpool \
> --poolmetadata docker/thinpoolmeta

8、通过配置文件配置精简池的自动扩展lvm。

[root@localhost student]# vi /etc/lvm/profile/docker-thinpool.profile

9、指定thin_pool_autoextend_threshold和thin_pool_autoextend_percent值。其中thin_pool_autoextend_threshold代表尝试自动扩展可用空间之前使用的空间百分比(100 = 禁用,不推荐);thin_pool_autoextend_percent代表自动扩展时添加到设备的空间量(0 = 禁用)。

下面的示例在磁盘使用率达到 80% 时增加了 20% 的容量。

activation {
  thin_pool_autoextend_threshold=80
  thin_pool_autoextend_percent=20
}

10、执行lvchange --metadataprofile docker-thinpool docker/thinpool命令应用 LVM 配置文件lvchange。

[root@localhost student]# lvchange --metadataprofile docker-thinpool docker/thinpool
  Logical volume docker/thinpool changed.

11、执行lvs -o+seg_monitor命令查看对逻辑卷是否启动监视。

[root@localhost student]# lvs -o+seg_monitor
  LV           VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Monitor  
  root         centos -wi-ao---- <16.00g                                                              
  swap         centos -wi-ao----   2.00g                                                              
  thinpool     docker twi-a-t--- <19.00g             0.10   7.87           monitored                  
  thinpoolmeta docker -wi-a----- 204.00m      

说明:如果没有这一步,无论应用配置文件中的任何设置如何,都不会发生逻辑卷的自动扩展。

12、如果第11步中Monitor列中的输出如上所述报告卷为not monitored,则需要显式启用监控。完成后,再使用lvs -o+seg_monitor命令进行查看。

[root@localhost student]# lvchange --monitor y docker/thinpool
[root@localhost student]# lvs -o+seg_monitor

13、如果/var/lib/docker/存在,则先执行mkdir /var/lib/docker.bk命令创建一个新的目录,再执行mv /var/lib/docker/* /var/lib/docker.bk命令将其移动到新创建的目录中,以便 Docker 可以使用新的 LVM 池来存储映像和容器的内容。

[root@localhost student]# mkdir /var/lib/docker.bk
[root@localhost student]# mv /var/lib/docker/* /var/lib/docker.bk

14、执行vi /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"
    ]
}

15、执行reboot命令重启虚拟机,

[root@localhost student]# reboot

16、启动 Docker系统和服务。

[root@localhost docker.bk]# systemctl start docker
[root@localhost student]# service docker start

17、执行docker info命令验证Docker是否正在使用新配置。按照官方文档介绍:如果 Docker 配置正确,Data fileand和Metadata file为空,池名称为docker-thinpool。这里观察到,Data fileand和Metadata file为空,池名称为docker-thinpool,配置正确。

[root@localhost student]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.9.1-docker)
  compose: Docker Compose (Docker Inc., v2.10.2)
  scan: Docker Scan (Docker Inc., v0.17.0)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 20.10.18
 Storage Driver: devicemapper
  Pool Name: docker-thinpool
  Pool Blocksize: 524.3kB
  Base Device Size: 10.74GB
  Backing Filesystem: xfs
  Udev Sync Supported: true
  Data Space Used: 19.92MB
  Data Space Total: 20.4GB
  Data Space Available: 20.38GB
  Metadata Space Used: 16.84MB
  Metadata Space Total: 213.9MB
  Metadata Space Available: 197.1MB
  Thin Pool Minimum Free Space: 2.039GB
  Deferred Removal Enabled: true
  Deferred Deletion Enabled: true
  Deferred Deleted Device Count: 0
  Library Version: 1.02.170-RHEL7 (2020-03-24)
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
 runc version: v1.1.4-0-g5fd4c4d
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-1160.76.1.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 1.777GiB
 Name: localhost.localdomain
 ID: FA6V:WFI3:FKKN:CH6E:PWJT:4GDE:U2KX:AKJX:3X2B:WAPW:4VNU:JIGW
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

WARNING: the devicemapper storage-driver is deprecated, and will be removed in a future release.

18、确认配置正确后,执行rm -rf /var/lib/docker.bk命令可以删除 /var/lib/docker.bk之前的配置所在的目录。

[root@localhost student]# rm -rf /var/lib/docker.bk