美文网首页容器化和自动化运维
Docker存储驱动devicemapper配置

Docker存储驱动devicemapper配置

作者: jianweixs | 来源:发表于2017-12-15 20:57 被阅读0次

    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为您准备块设备后更改这些值并导致错误。

    相关文章

      网友评论

        本文标题:Docker存储驱动devicemapper配置

        本文链接:https://www.haomeiwen.com/subject/hotjwxtx.html