docker with devicemapper storage driver

storage driver的选择依据很多的条件,比如发行版版本,团队技术积累,稳定性等。

device mapper是redhat/centos中最适合的, 稳定性也可以,内核原生支持,基于块设备,对于高负载情况下可以性能较好,支持quota。

缺点是:占用内存较多,启动同一个镜像的多个实例,需要多次加载并在内存中保存多个实例的信息,在高密度的情况下不适用;在小文件的情况下性能不如aufs,overlay。

接下里我们就对device mappper做个剖析。

Device Mapper介绍

首先请看:Linux 内核中的 Device Mapper 机制

device mapper中允许有不同的target driver,docker结合使用了thin provisioningsnapshot两种技术,thin provisioning 就是一种对disk超配的机制,snapshot 是COW的机制。

根据device mapper Document,device mapper thin provisioning snapshot使用方式大概分为以下几步:

  1. 准备data与metadata device,可以是实际的物理设备或LVM(loop-lvm 模式在生产环境一般不用)。data device用来存放实际的数据,metadata device 用来存储元数据信息。
  2. 利用data,metadata device创建一个thin pool (即thinp): dmsetup create poolname --table "0 20971520 thin-pool $metadata_dev $data_dev $data_block_size $low_water_mark"
  3. 创建对应的thinly-provisioned volume
  4. 创建snapshots并mount

创建完成后可以通过dmsetup status看到相关信息,docker自己创建的thinpool信息如下:

[[email protected] ~]# dmsetup status
vg_root-dmdata: 0 419430400 linear
vg_root-dmmeta: 0 62914560 linear
docker-253:2-812-pool: 0 419430400 thin-pool 65465 11492/4161600 581965/3276800 - rw no_discard_passdown queue_if_no_space -
docker-253:2-812-1e1c90db3592bb7cca6df78a7f823db3ba53420640be5a4c62893bfbf6d2527b: 0 20971520 thin 236288 20971519
.....

可以看到有data, metadata device, thin pool, thin volume对象,其中thinpool的输出含义为: start_sector sector_num device_type transaction_id used_metadata_blocks/total_metadata_blocks used_data_blocks/total_data_blocks held_metadata_root ro|rw|out_of_data_space [no_]discard_passdown [error|queue]_if_no_space needs_check|- metadata_low_watermark 各个字段具体含义参见device mapper thin-provisioning

Device Mapper在docker中的应用

docker使用devicemapper storage driver会自动完成上述对象的创建,将image和conainer layer信息存储在thinpool中,并mount到/var/lib/docker/devicemapper/目录下暴露给container使用,其中metadata目录下包含了各个layer的snapshot的信息,他会为每个layer创建一个文件来记录信息,如下:

[[email protected] devicemapper]# cat metadata/1e1c90db3592bb7cca6df78a7f823db3ba53420640be5a4c62893bfbf6d2527b
{"device_id":32867,"size":10737418240,"transaction_id":65437,"initialized":false,"deleted":false}

容器的writable layer是在真正启动运行的时候active, 对应的thin volume才能被dmsetup status可见。可以参看这篇文章了解更多Docker内部存储结构(devicemapper)解析(下篇)

data目录包含了各个container的mountpoint, 可以df命令看到每个container的mount 信息。

thinpool的信息除了使用dmsetup指令查看外,也可以通过docker info直接输出:

[[email protected] ~]# docker info
Containers: 10
 Running: 4
 Paused: 0
 Stopped: 6
Images: 26
Server Version: 17.03.2-ce
Storage Driver: devicemapper
 Pool Name: docker-253:2-812-pool
 Pool Blocksize: 65.54 kB
 Base Device Size: 10.74 GB
 Backing Filesystem: xfs
 Data file: /dev/vg_root/dmdata
 Metadata file: /dev/vg_root/dmmeta
 Data Space Used: 38.14 GB
 Data Space Total: 214.7 GB
 Data Space Available: 176.6 GB
 Metadata Space Used: 47.07 MB
 Metadata Space Total: 17.05 GB
 Metadata Space Available: 17 GB
 Thin Pool Minimum Free Space: 21.47 GB
 Udev Sync Supported: false
 Deferred Removal Enabled: false
 Deferred Deletion Enabled: false
 Deferred Deleted Device Count: 0
 Library Version: 1.02.82 (2013-10-04)
Logging Driver: json-file
Cgroup Driver: cgroupfs
........

注意其中Thin Pool Minimum Free Space字段就是创建thinp时的$low_water_mark,它表示在当data device容量还剩下该阈值的时候就无法写入数据了,也就是docker info中 "Data Space Available","Thin Pool Minimum Free Space"两个字段相等时此时就无法写入数据了。

在docker的官方文档里有详细介绍: How the devicemapper storage driver works

refs

docker官方介绍:Use the Device Mapper storage driver

moby repo: devicemapper - a storage backend based on Device Mapper 包含docker info dm 各个字段含义

docker device mapper flag配置

DOCKER基础技术:DEVICEMAPPER 左耳朵耗子出品, 五颗星

剖析Docker文件系统:Aufs与Devicemapper

device mapper Document 必看其中的thin-provisioning, snapshot两章,包含一些底层的使用方式,与参数细节

dockercon 各种storage driver的使用: Deep dive into Docker storage drivers: video PPT

原文地址:https://www.cnblogs.com/gaorong/p/9739995.html

时间: 2024-08-03 01:20:47

docker with devicemapper storage driver的相关文章

Docker: How to configure Docker with devicemapper

Background: Device Mapper is a kernel-based framework that underpins many advancedvolume management technologies on Linux. Docker's devicemapper storage driverleverages the thin provisioning and snapshotting capabilities of this frameworkfor image an

docker 启动报错 driver not supported

场景:升级docker 至 docker-ce-17.03.3 启动异常报错 systemctl start docker 报错内容: level=error msg="[graphdriver] prior storage driver overlay2 failed: driver not supported" 解决办法: sudo mv /var/lib/docker /var/lib/docker.old service docker start rm -rf /var/lib

TP框架中/ThinkPHP/Library/Think/Storage/Driver/File.class.php 错误

/ThinkPHP/Library/Think/Storage/Driver/File.class.php LINE: 48错误 这是一个将windows下运行正常的ThinkPHP框架移到Linux下会出现的一个问题: :( STORAGE_WRITE_ERROR:./Runtime/Cache/Install/c6bbce5b1f1dcf027c8ceb5cf5141b65.PHP 错误位置 FILE: /home/wwwroot/testisale/ThinkPHP/Library/Thi

/ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48

针对网上这个问题,本人有点失望满篇赘述,却未说道重点: 下面我说一下,你可能用的是linux或ubuntu的系统 thinkphp框架放到服务器上必会提示Runtime文件夹没有权限 此时可以切到Runtime上一级文件夹 执行命令chmod -R 777 Runtime ok问题已解决!

LINUX USB MASS STORAGE DRIVER流程图

docker2

DOCKER_STORAGE_OPTIONS=-s devicemapper --storage-opt dm.datadev=/home/dock-data --storage-opt dm.metadatadev=/home/dock-meta 为了解决报错,要设置以上变量 结果却明白了字符设备与块设备的区别,以上创建的是一个普通文件,也就是一个字符设备, [[email protected] ~]# docker run busybox /bin/echo Hello DockerUsag

原创docker dcos 的安装

原创哈,上个星期无意间发现了一个可以好东西 DC/OS https://dcos.io 这个是官网哈 然后就痛苦的折磨了一个多星期; 基本是参照到https://dcos.io/docs/1.7/administration/installing/custom/advanced/ 这个来弄的,中间遇到不少坑 基本的docker 那些自行安装哈,只写一些细节上面的东西 mkdir /tmp/dcos && cd /tmp/dcos curl -O https://downloads.dcos

docker 不同引擎导致历史垃圾镜像无法自动清除,致硬盘空间报警

查看硬盘占用大户是/var/lib/docker/vfs/dir 直觉是images文件,历史原因累积了大量的image docker rmi 清除掉不用的image文件 可用空间有提升但提升不大 /var/lib/docker/vfs/dir的大小完全没有变化 https://docs.docker.com/engine/userguide/storagedriver/vfs-driver/ 官方资料显示 /var/lib/docker/vfs 是 Storage Driver: vfs 时i

centos 安装docker

看官网安装步骤,比所有博主写的好,错了还可以排错 https://docs.docker.com/install/linux/docker-ce/centos/#install-from-a-package SET UP THE REPOSITORY Install required packages. yum-utils provides the yum-config-manager utility, and device-mapper-persistent-data and lvm2 are