Docker Device Mapper 使用 direct-lvm

一、Device Mapper: loop-lvm

默认 CentOS7 下 Docker 使用的 Device Mapper 设备默认使用 loopback 设备,后端为自动生成的稀疏文件,如下:

# ls -lsh /var/lib/docker/devicemapper/devicemapper/
总用量 510M
508M -rw-------. 1 root root 100G 10月 30 00:00 data
1.9M -rw-------. 1 root root 2.0G 10月 30 00:00 metadata

data [存放数据] 和 metadata [存放元数据] 的大小从输出可以看出初始化默认为 100G 和 2G 大小,都是稀疏文件,使用多少占用多少。

Docker 在初始化的过程中,创建 data 和 metadata 这两个稀疏文件,并分别附加到回环设备/dev/loop0 和 /dev/loop1 上,然后基于回环设备创建 thin pool。 默认一个 container 最大存放数据不超过 10G[注:docker 1.8 之后默认的大小已经为 100G,建议生产环境针对 container pool 大小监控。],如果需要调整则需要修改 /etc/sysconfig/docker 配置文件添加相关选项 --storage-opt 调整即可(详细参考 man docker 查看 STORAGE DRIVER OPTIONS 具体参数说明)。

# docker info
Containers: 2
Images: 13
Storage Driver: devicemapper
 Pool Name: docker-253:1-100673362-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: xfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 533.5 MB
 Data Space Total: 107.4 GB
 Data Space Available: 40.75 GB
 Metadata Space Used: 1.221 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.146 GB
 Udev Sync Supported: true
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
... ...
# lsblk
... ...
loop0                                                                                         7:0    0  100G  0 loop
└─docker-253:1-100673362-pool                                                               252:0    0  100G  0 dm
  ├─docker-253:1-100673362-61f1302169c719e4f671942d6158bba061a0b5081c98d40e8ca9749f1a521ca4 252:1    0   10G  0 dm
  └─docker-253:1-100673362-79c4340c3e06584d4e3630ad4a9b3a768066a52b0a04c9cb7bffa0b45bec8747 252:2    0   10G  0 dm
loop1                                                                                         7:1    0    2G  0 loop
└─docker-253:1-100673362-pool                                                               252:0    0  100G  0 dm
  ├─docker-253:1-100673362-61f1302169c719e4f671942d6158bba061a0b5081c98d40e8ca9749f1a521ca4 252:1    0   10G  0 dm
  └─docker-253:1-100673362-79c4340c3e06584d4e3630ad4a9b3a768066a52b0a04c9cb7bffa0b45bec8747 252:2    0   10G  0 dm
... ...

二、Device Mapper: direct-lvm

direct-lvm 也是使用 LVM, device mapper the dm-thinp 内核模块,使用 direct-lvm 不再使用 loopback 设备,直接使用 raw 分区(no filesystem),在中等负载和高密度环境下会有更好的性能优势,另外官方也是不建议生产环境系统使用默认的 LVM thin pool,至于两种类型具体的性能对比可以参考 Comprehensive Overview of Storage Scalability in Docker 这篇文章。

CentOS7 从 docker-1.6.2-14.el7.centos.x86_64.rpm 开始提供 docker-storage-setup工具,方便配置 direct-lvm,所以推荐使用该工具配置。当然也可以手动配置 lvm,添加相关配置选项,不过过程较为繁琐一点,至于如何手动配置笔者没有尝试,不过本文附加了相关部署的参考文章,有需求的可以看看,这里只介绍使用 docker-storage-setup 配置 direct-lvm。

示例配置文件位置 /usr/lib/docker-storage-setup/docker-storage-setup,可以查看其中相关配置的详细说明,或者通过 man docker-storage-setup 获取帮助,以下介绍几个关键的选项:

  • DATA_SIZE=40%FREE

    • 定义创建 DATA thin pool 的大小,默认为 VG 的 40%
  • MIN_DATA_SIZE=2G
    • 定义 DATA pool 最小值,默认为 2G,如果 VG 小于 2G 则创建失败
  • CHUNK_SIZE=512K
    • 定义 thin pool 的 CHUNK 大小,默认 512k
  • AUTO_EXTEND_POOL=yes
    • 定义是否自动扩容 thin pool 大小,默认为自动扩容
  • POOL_AUTOEXTEND_THRESHOLD=60
  • POOL_AUTOEXTEND_PERCENT=20
    • 定义每次扩容的大小,默认为 20%,即当前 pool 大小为 100G,那么自动扩容 20G,扩容后大小为 120G, 100 表示 disable

docker-storage-setup 设置之后自动扩容的实际配置在 /etc/lvm/profile/ 目录下:

因为测试的 LVM 卷组名为 docker-vg,因此 docker-storage-setup 自动生成配置文件为/etc/lvm/profile/docker-vg--docker-pool-extend.profile

# cat /etc/lvm/profile/docker-vg--docker-pool-extend.profile
activation {
        thin_pool_autoextend_threshold=60
        thin_pool_autoextend_percent=20
}

使用 lvs -o+seg_monitor 可验证监控状态。

示例

主机先添加一块设备,本例设备名为 /dev/vdc,添加 docker-storage-setup 配置文件:

# systemctl stop docker # 停止当前运行的 docker
# cat /etc/sysconfig/docker-storage-setup
DEVS=/dev/vdc   # A quoted, space-separated list of devices to be used. 如果添加多个设备则以空格分隔 DEVS="/dev/sdc /dev/sdd /dev/sde"
VG=docker-vg    # The volume group to use for docker storage.
SETUP_LVM_THIN_POOL=yes
# docker-storage-setup  # 执行 setup 操作,相关 lvm 将自动创建

创建完成之后,可以查看相关的配置

# cat /etc/sysconfig/docker-storage     # 配置已经自动修改
DOCKER_STORAGE_OPTIONS=-s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.thinpooldev=/dev/mapper/docker--vg-docker--pool
# grep ‘sysconfig/docker-storage‘ /usr/lib/systemd/system/docker.service
EnvironmentFile=-/etc/sysconfig/docker-storage  # 可以看出 docker 启动会自动加载该配置文件

删除源数据并启动 docker

# cat /etc/sysconfig/docker-storage-setup
# DEVS=/dev/vdc     # 注释该行
VG=docker-vg
SETUP_LVM_THIN_POOL=yes
# rm -rf /var/lib/docker
# systemctl restart lvm2-monitor    # 确保 lvm2-monitor 服务运行
# systemctl start docker
# docker info
Containers: 39
Images: 98
Storage Driver: devicemapper
 Pool Name: docker--vg-docker--pool     # 此处已经变为相关的设备文件
 Pool Blocksize: 524.3 kB
 Backing Filesystem: <unknown>
 Data file:
 Metadata file:
 Data Space Used: 14.16 GB
 Data Space Total: 64.35 GB
 Data Space Available: 50.19 GB
 Metadata Space Used: 4.702 MB
 Metadata Space Total: 109.1 MB
 Metadata Space Available: 104.3 MB
 Udev Sync Supported: true
 Library Version: 1.02.93-RHEL7 (2015-01-28)
... ...

三、参考

时间: 2024-10-07 12:06:59

Docker Device Mapper 使用 direct-lvm的相关文章

Docker存储驱动之Device Mapper简介

Device Mapper是一个基于kernel的框架,它增强了很多Linux上的高级卷管理技术.Docker的devicemapper驱动在镜像和容器管理上,利用了该框架的超配和快照功能.为了区别,本文使用Device Mapper指驱动中的框架,而devicemapper指Docker的存储驱动. 注意:商业支持的Docker Engine(CS-Engine)建议在RHEL和CentOS上使用devicemapper存储驱动. AUFS之外的另一种选择 Docker最初运行在Ubuntu和

使用 Device Mapper来改变Docker容器的大小

作者:Jérôme Petazzoni ( Docker 布道师) 译者:Mark Shao ( EMC 中国高级工程师) 如果在 CentOS . REHL . Fedor 或者其他默认没有 AUFS 支持的 Linux 发行版上使用 Docker ,你可能需要用到 Device Mapper 的存储插件.将这个插件设置为默认,它会把你所有的容器存储到一个 100G 的简短文件中,并且限制每个容器最大为 10GB .这篇文章将展示如何突破这个限制,并且把容器的存储移动到一个指定的分区或者 LV

docker 配置Btrfs和Device mapper存储驱动设置

运行环境: docker -v Docker version 1.12.1, build 23cf638 uname -a Linux ceph-6-29 3.10.0-327.28.3.el7.x86_64 #1 SMP Thu Aug 18 19:05:49 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux\ 一:docker 首次安装完成,默认存储设备为loop 回环设备,会创建一个100G的用于存储数据,和一个2G的用于存储元数据的稀疏文件,然后分别附加到回

Device Mapper Multipath(DM-Multipath)

Device Mapper Multipath(DM-Multipath)可以将服务器节点和存储阵列之间的多条I/O链路配置为一个单独的设备.这些I/O链路是由不同的线缆.交换机.控制器组成的SAN物理链路.Multipath将这些链路聚合在一起,生成一个单独的新的设备. 1.DM-Multipath概览: (1)数据冗余 DM-Multipath可以实现在active/passive模式下的灾难转移.在active/passive模式下,只有一半的链路在工作,如果链路上的某一部分(线缆.交换机

Linux 内核中的 Device Mapper 机制

http://www.68idc.cn/help/server/linux/20141127133367.html 结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物 简介: 本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,

[转] Linux 内核中的 Device Mapper 机制

本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略,当前比较流行的 Linux 下的逻辑卷管理器如 LVM2(Linux Volume Manager 2 version).EVMS(Enterprise Volume Management System).dmraid(Device M

Linux系统中的Device Mapper学习

2016-12-16 15:42 潇湘隐者 阅读(11906) 评论(0) 编辑 收藏 在linux系统中你使用一些命令时(例如nmon.iostat 如下截图所示),有可能会看到一些名字为dm-xx的设备,那么这些设备到底是什么设备呢,跟磁盘有什么关系呢?以前不了解的时候,我也很纳闷. 其实dm是Device Mapper的缩写,Device Mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管

docker深入2-存储驱动之使用devicemapper(direct-lvm)模式

2016/12/9 一.现状 1.默认使用的是 devicemapper(loop-lvm) [[email protected] lib]# docker info      (略)         Server Version: 1.12.3 Storage Driver: devicemapper  Pool Name: docker-253:3-33517-pool  Pool Blocksize: 65.54 kB  Base Device Size: 10.74 GB  Backin

docker with devicemapper storage driver

storage driver的选择依据很多的条件,比如发行版版本,团队技术积累,稳定性等. device mapper是redhat/centos中最适合的, 稳定性也可以,内核原生支持,基于块设备,对于高负载情况下可以性能较好,支持quota. 缺点是:占用内存较多,启动同一个镜像的多个实例,需要多次加载并在内存中保存多个实例的信息,在高密度的情况下不适用:在小文件的情况下性能不如aufs,overlay. 接下里我们就对device mappper做个剖析. Device Mapper介绍