一、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 使用 60% 時自動擴容,100 表示 disable,最小為 50lvmthin — LVM thin provisioning
- 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) ... ...
三、參考
- Docker 官方文檔:
- 性能相關:
- 部署相關: