当前需要设置的宿主机是环境是搭建在vbox虚拟机上的centos7系统。测试环境中出现过一次意外情况,当时为了测试docker日志文件限制,运行了一个docker容器,但是后面忘记停止了,几天后发现了,想去操作,发现容器命令都无效了,停止不了,也登陆不上去。不明原因,最终只能重启docker服务。

问题原因排查:  

  经过一番查证,发现可能与docker存储模式有关系。分别是docker默认的loop volume和Direct LVM。我们先看下loop volume和Direct LVM 之间的区别在哪里?

  1. 对于centos/rhel这类没有相关驱动的系统,一般使用devicemapper驱动利用LVM的一些机制来模拟分层存储。这样的做法除了性能比较差之外,稳定性一般也不好,而且配置相对复杂。Docker安装在CentOS/RHEL 上后,会默认选择 devicemapper,但是为了简化配置,其 devicemapper 是跑在一个稀疏文件模拟的块设备上,也被称为 loop-lvm。这样的选择是因为不需要额外配置就可以运行 Docker,这是自动配置唯一能做到的事情。但是 loop-lvm 的做法非常不好,其稳定性、性能更差,无论是日志还是 docker info 中都会看到警告信息。官方文档有明确的文章讲解了如何配置块设备给 devicemapper 驱动做存储层的做法,这类做法也被称为配置 direct-lvm。
  2. 除了前面说到的问题外,devicemapper + loop-lvm 还有一个缺陷,因为它是稀疏文件,所以它会不断增长。用户在使用过程中会注意到/var/lib/docker/devicemapper/devicemapper/data 不断增长,而且无法控制。很多人会希望删除镜像或者可以解决这个问题,结果发现效果并不明显。原因就是这个稀疏文件的空间释放后基本不进行垃圾回收的问题。因此往往会出现即使删除了文件内容,空间却无法回收,随着使用这个稀疏文件一直在不断增长。
  3. 对于 CentOS/RHEL 的用户来说,在没有办法使用 UnionFS 的情况下,一定要配置 direct-lvm 给 devicemapper,无论是为了性能、稳定性还是空间利用率

   查找了网上的一些测试说明,得出如下的结论:

   Loop Volume VS  Direct LVM
       direct lvm直接使用dm-thin内核模块,直接使用raw分区,在高负载和高密度下具有性能优势。
       direct lvm的O_DIRECT
       direct lvm的读写性能表现更加稳定。
       direct lvm能避免loop 的block limitation
综上,我们可以看到,loop volume 相对不稳定,这个可能是造成docker卡死的原因,因此,我们需要对虚拟机的docker存储模式设置为Direct LVM。
 
设置Direct LVM:
  一、创建一块设备存储,大小为8G
  

  

  其余略。

  二、配置Direct LVM

  1. fdisk -l 查看磁盘信息

    [root@etcd1 dev]# fdisk -l
    
    Disk /dev/sda: 42.9 GB, 42949672960 bytes, 83886080 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: 0x000a5130 Device Boot Start End Blocks Id System
    /dev/sda1 2048 4095 1024 83 Linux
    /dev/sda2 * 4096 2101247 1048576 83 Linux
    /dev/sda3 2101248 83886079 40892416 8e Linux LVM Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 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 /dev/mapper/VolGroup00-LogVol00: 40.2 GB, 40231763968 bytes, 78577664 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 /dev/mapper/VolGroup00-LogVol01: 1610 MB, 1610612736 bytes, 3145728 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

    可以看到  /dev/sdb 是我们新增的磁盘块设备。

  2. 创建pv
    [root@etcd1 dev]# pvcreate /dev/sdb
    Physical volume "/dev/sdb" successfully created.
  3. 创建vg (从生成pv后的硬盘 创建类似一个虚拟硬盘的东西)
    [root@etcd1 dev]# vgcreate  vgdocker /dev/sdb
    Volume group "vgdocker" successfully created

    vgdocker”为vg名,“/dev/sdb” 为组成VG的PV路径.
    创建完成之后,执行 vgdisplay 进行查看:

    [root@etcd1 dev]# vgdisplay
    --- Volume group ---
    VG Name vgdocker
    System ID
    Format lvm2
    Metadata Areas 1
    Metadata Sequence No 6
    VG Access read/write
    VG Status resizable
    MAX LV 0
    Cur LV 1
    Open LV 0
    Max PV 0
    Cur PV 1
    Act PV 1
    VG Size <8.00 GiB
    PE Size 4.00 MiB
    Total PE 2047
    Alloc PE / Size 1984 / 7.75 GiB
    Free PE / Size 63 / 252.00 MiB
    VG UUID ydhjST-R1MI-iBBY-RIEm-YDmS-mVUr-GvB5SN --- Volume group ---
    VG Name VolGroup00
    System ID
    Format lvm2
    Metadata Areas 1
    Metadata Sequence No 3
    VG Access read/write
    VG Status resizable
    MAX LV 0
    Cur LV 2
    Open LV 2
    Max PV 0
    Cur PV 1
    Act PV 1
    VG Size <38.97 GiB
    PE Size 32.00 MiB
    Total PE 1247
    Alloc PE / Size 1247 / <38.97 GiB
    Free PE / Size 0 / 0
    VG UUID Bmtp50-WfBl-wRER-UckX-ryOe-RMgL-osDsd4

      

  4. 创建能够组成 thin-pool 的两个LV
    [root@etcd1 dev]# lvcreate --wipesignatures y -n thinpool -l 95%VG vgdocker
    Logical volume "thinpool" created.
    [root@etcd1 dev]# lvcreate --wipesignatures y -n thinpoolmeta -l 1%VG vgdocker
    Logical volume "thinpoolmeta" created.
  5. 根据上一步的两个LV创建thin-pool(thinpool 是docker storage能用的)  

    [root@etcd1 dev]# lvconvert -y --zero n -c 512K --thinpool vgdocker/thinpool --poolmetadata vgdocker/thinpoolmeta
    Thin pool volume with chunk size 512.00 KiB can address at most 126.50 TiB of data.
    WARNING: Converting logical volume vgdocker/thinpool and vgdocker/thinpoolmeta to thin pool's data and metadata
     volumes with metadata wiping.
    THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
    Converted vgdocker/thinpool_tdata to thin pool.

        

  6. 配置thin-pool的自动扩展
    修改lvm配置文件
    [root@etcd1 dev]#  vi /etc/lvm/profile/docker-thinpool.profile
    activation {
    thin_pool_autoextend_threshold=80
    thin_pool_autoextend_percent=20
    }
  7. 激活lv的配置文件LVM profile
    [root@etcd1 dev]# lvchange --metadataprofile docker-thinpool vgdocker/thinpool
    Logical volume vgdocker/thinpool changed.

      

  8. 对主机上的逻辑卷启用监视

    [root@etcd1 dev]# lvs -o+seg_monitor
    LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Monitor
    LogVol00 VolGroup00 -wi-ao---- <37.47g
    LogVol01 VolGroup00 -wi-ao---- 1.50g
    thinpool vgdocker twi-a-t--- 7.59g 0.00 0.05 monitored

    如果没有这个步骤,即使在LVM配置文件出现时也不会发生自动扩展。  

  9. 备份Docker原有数据  
    如果曾经在这个主机上运行过Docker,或者如果/var/ lib/docker存在,那么将它移出后,Docker就可以使用新的LVM池来存储镜像和容器的内容了。

    [root@etcd1 dev]# mkdir /var/lib/docker.bk
    [root@etcd1 dev]# cp /var/lib/docker/*/var/lib/docker.bk

      

  10. 编辑 /etc/docker/daemon.json
    配置devicemapper存储驱动程序所需的选项。如果该文件以前是空的,那么现在应该包含以下内容:
    {
    "storage-driver":"devicemapper",
    "storage-opts": [
    "dm.thinpooldev=/dev/mapper/docker-thinpool",
    "dm.use_deferred_removal=true",
    "dm.use_deferred_deletion=true"
    ]
    }

    “/dev/mapper/docker-thinpool”为上述步骤中产生的thin-pool

    注意:

    延迟删除选项,dm.use_deferred_deletion=true,在使用默认内核版本3.18时还不支持RHEL、CentOS或Ubuntu 14.04。

  11. 启动Docker
    [root@etcd1 dev]# systemctl daemon-reload
    [root@etcd1 dev]# systemctl restart docker
  12. 查看Docker启动信息
    [root@etcd1 dev]# docker info
    Containers: 0
    Running: 0
    Paused: 0
    Stopped: 0
    Images: 0
    Server Version: 1.13.1
    Storage Driver: devicemapper
    Pool Name: vgdocker-thinpool
    Pool Blocksize: 524.3 kB
    Base Device Size: 10.74 GB
    Backing Filesystem: xfs
    Data file:
    Metadata file:
    Data Space Used: 19.92 MB
    Data Space Total: 8.154 GB
    Data Space Available: 8.134 GB
    Metadata Space Used: 45.06 kB
    Metadata Space Total: 83.89 MB
    Metadata Space Available: 83.84 MB
    Thin Pool Minimum Free Space: 815.3 MB
    Udev Sync Supported: true
    Deferred Removal Enabled: true
    Deferred Deletion Enabled: true
    Deferred Deleted Device Count: 0
    Library Version: 1.02.140-RHEL7 (2017-05-03)
    Logging Driver: json-file
    Cgroup Driver: cgroupfs
    Plugins:
    Volume: local
    Network: bridge host macvlan null overlay
    Swarm: inactive
    Runtimes: runc
    Default Runtime: runc
    Init Binary: docker-init
    containerd version: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1
    runc version: 9df8b306d01f59d3a8029be411de015b7304dd8f
    init version: 949e6fa
    Security Options:
    seccomp
    Profile: default
    Kernel Version: 3.10.0-693.17.1.el7.x86_64
    Operating System: CentOS Linux 7 (Core)
    OSType: linux
    Architecture: x86_64
    CPUs: 1
    Total Memory: 488.4 MiB
    Name: etcd1.wae.haplat.net
    ID: AR6D:ZTRJ:PESP:REXP:ZZ5G:7EBB:CQZQ:5KAR:JR4L:S4VO:6PCR:EFMY
    Docker Root Dir: /var/lib/docker
    Debug Mode (client): false
    Debug Mode (server): false
    Username: hakimdstx
    Registry: https://index.docker.io/v1/
    WARNING: bridge-nf-call-iptables is disabled
    WARNING: bridge-nf-call-ip6tables is disabled
    Experimental: false
    Insecure Registries:
    127.0.0.0/8
    Registry Mirrors:
    https://registry.docker-cn.com
    Live Restore Enabled: false

      

  13. 验证配置正确后,删除/var/lib/docker.bk目录了
    [root@etcd1 dev]# rm -rf /var/lib/docker.bk
    

     

综上,完成

【引用】

  [1] Devicemapper的direct-lvm模式

docker 配置 direct-lvm的更多相关文章

  1. 为docker配置固定ip

    docker默认使用bridge模式,通过网桥连接到宿主机,而容器内部的ip则从网桥所在的ip段取未用的ip.这样做一个不方便的地方在于容器内部的ip不是固定的,想要连接容器时只能通过映射到宿主机的端 ...

  2. docker 配置桥接网络

    2.5 docker配置桥接网络(上): 为了使本地网络中的机器和Docker 容器更方便的通信,我们经常会有将Docker容器 配置到和主机同一网段的需求. 这个需求其实很容器实现, 我们只需要将D ...

  3. centos为docker配置加速器

    国内拉去docker镜像慢得可怜,为了解决这个问题,可为docker配置加速器. 1.修改daemon配置文件 sudo mkdir -p /etc/dockervim /etc/docker/dae ...

  4. docker配置代理的用户名密码

    公司访问外网全部需要经过代理服务器,在使用docker的过程中,发现就算为docker配置了代理,还是会因为没有代理服务器认证,导致pull操作失败,报如下错误: Error response fro ...

  5. Docker配置参考

    Docker配置参考 一.参数列表 参考网址:https://docs.docker.com/engine/reference/commandline/dockerd/#options Usage: ...

  6. Docker 配置固定IP及桥接的实现方法(转载)

    这篇文章主要介绍了Docker 配置固定IP和桥接的实现方法的相关资料,这里详细介绍了Docker 的四种网络模式及如何实现桥接的案例,需要的朋友可以参考下 docker默认使用bridge模式,通过 ...

  7. windows7下docker配置镜像加速

    原文地址:https://blog.csdn.net/slibra_L/article/details/77505003 1,本文目的:windows7下docker配置镜像加速,下面是具体操作步骤: ...

  8. 使用docker配置etcd集群

    docker配置etcd集群与直接部署etcd集群在配置上并没有什么太大差别. 我这里直接使用docker-compose来实现容器化的etcd部署 环境如下: HostName IP etcd1 1 ...

  9. docker配置与实践#可以好好看看

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 L ...

随机推荐

  1. Java多线程大合集

    1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成 ...

  2. Noip2018 考前准备

    目录 基础算法 二分 模拟(未补) 高精(未学习) 搜索(未补) 排序 图论 树的直径 树的重心 最短路算法 Spfa Dijkstra Floyd 最小生成树 kruskal 数论 线性筛 线性筛素 ...

  3. perl:split函数用法

    本文和大家重点讨论一下Perl split函数的用法,Perl中的一个非常有用的函数是Perl split函数-把字符串进行分割并把分割后的结果放入数组中.这个Perl split函数使用规则表达式( ...

  4. python计算机基础(一)

    什么是编程语言? 跟计算机交流的语言 什么是编程? 编程就是写代码,让计算机能够听懂的语言 为什么要编程? 让计算机为我们做事,取代人 计算机5大组成分别有什么作用? CPU:控制,判断,配作用,内存 ...

  5. Processed foods make us fatter easily

    From Business Insider Here's an experiment: sit alone in a hospital room for two weeks and eat nothi ...

  6. linux实时查看更新日志命令

    很多时候在调试生成或正式平台服务器的时候想查看实时的日志输出,在Linux中可以使用tail 或 watch来实现. 比如我们项目中有个 app.log 的日志文件,我们普通读取都使用 vi app. ...

  7. Leetcode 368.最大整除子集

    最大整除子集 给出一个由无重复的正整数组成的集合,找出其中最大的整除子集,子集中任意一对 (Si,Sj) 都要满足:Si % Sj = 0 或 Sj % Si = 0. 如果有多个目标子集,返回其中任 ...

  8. PTA 10-排序5 PAT Judge (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/677 5-15 PAT Judge   (25分) The ranklist of PA ...

  9. Scala基础知识[一]

    摘要:在Scala 是 Scalable Language 的简写,是一门多范式(multi-paradigm)的编程语言.设计初衷是要集成面向对象编程和函数式编程的各种特性.Scala 运行在Jav ...

  10. BZOJ-1507 文本编辑器(Editor)

    一道极其相似的题...http://hi.baidu.com/8361101/item/5b149103cbf4007cbee97e5f 就多了个区间查找,少了个翻转... 少了翻转的话貌似可以不用S ...