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