devicemapper驱动将每一个 Docker镜像 和容器存储在它自身的具有精简置备(thin-provisioned)、写时拷贝(copy-on-write)和快照功能(snapshotting)的虚拟设备上。由于Device Mapper技术是在块(block)层面而非文件层面,所以Docker Engine的devicemapper存储驱动使用的是块设备来存储数据而非文件系统。(摘自网络)
一、Devicemapper的模式
devicemapper是RHEL下 Docker Engine 的默认存储驱动,它有两种配置模式:loop-lvm和direct-lvm。
loop-lvm是默认的模式,它使用OS层面离散的文件来构建精简池(thin pool)。该模式主要是设计出来让Docker能够简单的被”开箱即用(out-of-the-box)”而无需额外的配置。但如果是在生产环境的部署Docker,官方明文不推荐使用该模式。我们使用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.
direct-lvm是Docker推荐的生产环境的推荐模式,他使用块设备来构建精简池来存放镜像和容器的数据。
二、配置Devicemapper direct-lvm模式
1. 停止docker
[root@hathor70 ~]# systemctl stop docker
2. 查看本机磁盘,使用空余的磁盘做lvm
[root@hathor70 ~]# fdisk -l
Disk /dev/sda: 146.0 GB, 145999527936 bytes, 285155328 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
Disk label type: dos
Disk identifier: 0x000e2af0
Device Boot Start End Blocks Id System
/dev/sda1 2048 25167871 12582912 83 Linux
/dev/sda2 25167872 41945087 8388608 82 Linux swap / Solaris
/dev/sda3 * 41945088 50333695 4194304 83 Linux
/dev/sda4 50333696 285155327 117410816 5 Extended
/dev/sda5 50337792 67115007 8388608 83 Linux
/dev/sda6 67117056 83894271 8388608 83 Linux
/dev/sda7 83896320 285155327 100629504 83 Linux
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
Disk /dev/sdb: 146.0 GB, 145999527936 bytes, 285155328 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
Disk label type: gpt
# Start End Size Type Name
1 34 285155294 136G Microsoft basic primary
3. 创建PV
[root@hathor70 ~]# pvcreate /dev/sda7 /dev/sdb1
Physical volume "/dev/sdb" successfully created.
4. 创建VG
[root@hathor70 ~]# vgcreate docker /dev/sda7 /dev/sdb1
Volume group "docker" successfully created
5. 查看VG信息
[root@hathor70 ~]# vgdisplay docker
--- Volume group ---
VG Name docker
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 231.93 GiB
PE Size 4.00 MiB
Total PE 59375
Alloc PE / Size 57592 / 224.97 GiB
Free PE / Size 1783 / 6.96 GiB
VG UUID ZOTofh-XYtf-bCbk-cttv-ARjX-lhDi-ahl5Zb
6. 创建thinpool
1)创建pool
[root@hathor70 ~]# lvcreate --wipesignatures y -n thinpool docker -l 95%VG
Logical volume "thinpool" created.
[root@hathor70 ~]# lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
Logical volume "thinpoolmeta" created.
说明: 数据LV大小为VG的95%,元数据LV大小为VG的1%,剩余的空间用来自动扩展。
2)将pool转换为thinpool
[root@hathor70 ~]# lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta
WARNING: Converting logical volume docker/thinpool and docker/thinpoolmeta to thin pool's data and metadata volumes with metadata wiping.
THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
Converted docker/thinpool to thin pool.
7. 配置thinpool
1)配置池的自动扩展
创建 docker-thinpool.profile,添加池的自动扩展
[root@hathor70 ~]# vim /etc/lvm/profile/docker-thinpool.profile
activation {
thin_pool_autoextend_threshold=80
thin_pool_autoextend_percent=20
}
2)应用配置变更
应用docker-thinpool.profile配置
[root@hathor70 ~]# lvchange --metadataprofile docker-thinpool docker/thinpool
Logical volume docker/thinpool changed.
3)状态监控检查
[root@hathor70 ~]# lvs -o+seg_monitor
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Monitor
thinpool docker twi-aot--- 220.34g 0.69 0.03 monitored
8. 配置Docker服务并启动
1) 添加参数
[root@hathor70 ~]# vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool --storage-opt dm.use_deferred_removal=true --storage-opt dm.use_deferred_deletion=true --storage-opt dm.basesize=30G'
if [ -z "${DOCKER_CERT_PATH}" ]; then
DOCKER_CERT_PATH=/etc/docker
fi
参数作用:
--storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool 存储到哪里
--storage-opt dm.use_deferred_removal=true --storage-opt dm dm.use_deferred_deletion=true 官方说:unintentionally leaking mount points 不明白具体意思
--storage-opt dm.basesize=30G 设置每个容器最大使用空间
[root@hathor70 ~]# vim /etc/sysconfig/docker-storage
DOCKER_STORAGE_OPTIONS="--storage-driver=devicemapper"
--storage-driver=devicemapper --storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool --storage-opt dm.use_deferred_removal=true --storage-opt dm.use_deferred_deletion=true --storage-opt dm.basesize=30G
参数作用 :
--storage-driver=devicemapper 使用什么存储驱动
2) 重启服务
[root@hathor70 ~]# systemctl restart docker
9. 查看信息
[root@hathor70 ~]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.12.6
Storage Driver: devicemapper
Pool Name: docker-thinpool
Pool Blocksize: 524.3 kB
Base Device Size: 32.21 GB
Backing Filesystem: xfs
Data file:
Metadata file:
Data Space Used: 1.611 GB
Data Space Total: 236.6 GB
Data Space Available: 235 GB
Metadata Space Used: 651.3 kB
Metadata Space Total: 2.487 GB
Metadata Space Available: 2.487 GB
Thin Pool Minimum Free Space: 23.66 GB
Udev Sync Supported: true
Deferred Removal Enabled: true
Deferred Deletion Enabled: true
Deferred Deleted Device Count: 0
Library Version: 1.02.135-RHEL7 (2016-11-16)
Logging Driver: journald
Cgroup Driver: systemd
Plugins:
Volume: local
Network: null host bridge overlay
Swarm: inactive
Runtimes: docker-runc runc
Default Runtime: docker-runc
Security Options: seccomp
Kernel Version: 3.10.0-514.6.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
Number of Docker Hooks: 2
CPUs: 24
Total Memory: 11.56 GiB
Name: hathor70
ID: TP5U:HQCL:7TSU:KVVV:6QHK:V6AI:O76G:PYHL:ILA3:NSBN:OOVG:ZPFS
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Insecure Registries:
127.0.0.0/8
Registries: docker.io (secure)
10. 其他相关:
1)lvs 查看thinpool 使用情况
[root@hathor70 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
thinpool docker twi-aot--- 220.34g 0.68 0.03
2)测试
a.进入容器
手动在机器上启动一个容器测试,进入至容器中,可以看到根目录为 30G
[root@check-deploy-1858202602-9f6kn /]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/docker-8:6-395678-48a8cb18f633a222739468414e8ccc12170e094728eea44c6b8296c803c8b514 xfs 30G 726M 30G 3% /
tmpfs tmpfs 5.8G 0 5.8G 0% /dev
tmpfs tmpfs 5.8G 0 5.8G 0% /sys/fs/cgroup
/dev/sda6 ext4 7.8G 2.2G 5.3G 29% /etc/hosts
shm tmpfs 64M 0 64M 0% /dev/shm
b.测试
往容器中根目录下写文件,此处写了多个文件,写至testfile.3时报错无可用空间
[root@check-deploy-1858202602-9f6kn /]# dd if=/dev/zero of=/testfile.3 bs=1440k seek=8190
dd: error writing ‘/testfile.3’: No space left on device
2574+0 records in
2573+0 records out
3795283968 bytes (3.8 GB) copied, 35.1777 s, 108 MB/s
允许DOCKER配置DIRECT-LVM模式
使用Docker 17.06
和更高版本,Docker可以为您管理块设备,简化direct-lvm
模式配置。这仅适用于全新的Docker设置。您只能使用单个块设备。如果需要使用多个块设备,请手动配置direct-lvm模式。添加了以下新配置选项:
选项 | 描述 | 需要? | 默认 | 例 |
---|---|---|---|---|
dm.directlvm_device |
要配置的块设备的路径direct-lvm 。 |
是 | dm.directlvm_device="/dev/xvdf" |
|
dm.thinp_percent |
传入块设备中用于存储的空间百分比。 | 没有 | 95 | dm.thinp_percent=95 |
dm.thinp_metapercent |
传入块设备中用于元数据存储的空间百分比。 | 没有 | 1 | dm.thinp_metapercent=1 |
dm.thinp_autoextend_threshold |
lvm何时应自动将精简池扩展为总存储空间的百分比的阈值。 | 没有 | 80 | dm.thinp_autoextend_threshold=80 |
dm.thinp_autoextend_percent |
触发自动扩展时增加精简池的百分比。 | 没有 | 20 | dm.thinp_autoextend_percent=20 |
dm.directlvm_device_force |
是否格式化块设备,即使其上已存在文件系统。如果设置为false 并且存在文件系统,则会记录错误并保持文件系统不变。 |
没有 | 假 | dm.directlvm_device_force=true |
编辑daemon.json
文件并设置适当的选项,然后重新启动Docker以使更改生效。以下daemon.json
配置设置上表中的所有选项。
{
"storage-driver": "devicemapper",
"storage-opts": [
"dm.directlvm_device=/dev/sdb1",
"dm.thinp_percent=95",
"dm.thinp_metapercent=1",
"dm.thinp_autoextend_threshold=80",
"dm.thinp_autoextend_percent=20",
"dm.directlvm_device_force=false"
]
}
如果当前的块存储已经有文件系统,就需要设置dm.directlvm_device_force=false
Error starting daemon: error initializing graphdriver: /dev/sdb1 has a filesystem already ,use dm.directlvm_device_force=true if you want to wipe the device
重新启动Docker以使更改生效。Docker调用命令为您配置块设备。
警告:不支持Docker为您准备块设备后更改这些值并导致错误。