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) ... ... 

三、參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM