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信息如下:

[root@gaorong-pc ~]# 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创建一个文件来记录信息,如下:

[root@gaorong-pc 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直接输出:

[root@gaorong-pc ~]# 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

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

docker with devicemapper storage driver的更多相关文章

  1. Docker storage driver(十四)

    目录 一.storage driver 作用 1.Images and layers 2.Container and layers Copy-on-Write 3.Data volumes and t ...

  2. Linux kernel support docker storage driver aufs

    How to make docker use aufs in CentOS 7? - Server Faulthttps://serverfault.com/questions/650208/how- ...

  3. docker storage driver

    docker默认有2种方式用于持久化数据,volumes和bind mounts,也可以使用tmpfs,其中使用volume是持久化数据的最好方式,volume由docker控制管理,使用docker ...

  4. Docker中的Cgroup Driver:Cgroupfs 与 Systemd

    在安装kubernetes的过程中,会出现 failed to create kubelet: misconfiguration: kubelet cgroup driver: "cgrou ...

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

        /ThinkPHP/Library/Think/Storage/Driver/File.class.php LINE: 48错误 这是一个将windows下运行正常的ThinkPHP框架移到L ...

  6. docker 存储驱动(storage driver)知识总结

    http://www.sohu.com/a/101016494_116235 一,先看docker镜像是如何构建和存储. 下面是ubuntu:15.04的镜像分层.一共是4层,每一层都由一些只读并且描 ...

  7. docker中 devicemapper驱动挂载容器镜像文件

    详解docker中容器devicemapper设备的挂载流程

  8. LINUX USB MASS STORAGE DRIVER流程图

  9. docker2

    https://github.com/docker/distribution daocloud 数人云 时速云 http://jpetazzo.github.io/2014/06/23/docker- ...

随机推荐

  1. 视觉SLAM的数学基础 第一篇 3D空间的位置表示

    视觉SLAM中的数学基础 第一篇 3D空间的位置表示 前言 转眼间一个学期又将过去,距离我上次写<一起做RGBD SLAM>已经半年之久.<一起做>系列反响很不错,主要由于它为 ...

  2. RocketMQ broker jvm 监控

    1. jps 获取要监控broker jvm 的进程ID jsp 2. nohup 输出监控日志 nohup jstat -gc -t [pid] [interval] -t 会在每一条记录前加时间戳 ...

  3. .NET基础 (17)反射

    反射1 请解释反射的基本原理和其实现的基石2 .NET提供了哪些类型来实现反射3 如何实现动态地发射程序集4 如何利用反射来实现工厂模式 反射1 请解释反射的基本原理和其实现的基石 反射是一种动态分析 ...

  4. java成长之路-开篇

    一,为了生活 从业7年,主要还是运用.net过日子.今儿下决心再次准备学习java并想达到一定高度,也还是想以后能主要用java赚钱过日子.抱歉眼界所到,平均情况下,java平台的收入还是比.net的 ...

  5. 软件工程:java实现wordcount基本功能

    github链接:https://github.com/Nancy0611/wc 一:项目相关要求 该项目能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的功 ...

  6. java-01 JAVA三大版本比较&JDK、JRE、JVM 的关系

    1. java三大版本比较 1.1 java SE javaSE 是java标准版的简称,其定位是个人计算机应用(应用原生界面比较ugly) 全称:Java Platform Standard Edi ...

  7. SSH案例--入门级

    1.项目功能展示 (1)注册 (2)修改地址与级别信息,点击修改   (3)再添加一位成员,进行删除 点击第二行的删除 (4)登录模块测试 输入数据库中没有的信息: 输入数据库中存在的信息: 2. W ...

  8. angular响应式表单 - 状态字段

    用于表单验证的过程: touched,untoched pristine,dirty pending

  9. [C#学习笔记]C#中的decimal类型——《CLR via C#》

    System.Decimal是非常特殊的类型.在CLR中,Decimal类型不是基元类型.这就意味着CLR没有知道如何处理Decimal的IL指令. 在文档中查看Decimal类型,可以看到它提供了一 ...

  10. C#基础之流程控制语句详解

    C#程序的执行都是一行接一行.自上而下地进行,不遗漏任何代码.为了让程序能按照开发者所设计的流程进行执行,必然需要进行条件判断.循环和跳转等过程,这就需要实现流程控制.C#中的流程控制包含了条件语句. ...