devicemapper介绍
devicemapper介紹
Device Mapper是Linux系統中基于內核的高級卷管理技術框架。Docker的devicemapper存儲驅動就是基于該框架的精簡置備和快照功能來實現鏡像和容器的管理。
注:Device Mapper是Linux的一種技術框架,而devicemapper是Docker Engine基于Device Mapper提供的一種存儲驅動。
早期的Docker運行在Ubuntu和Debian Linux上并使用AUFS作為后端存儲。Docker流行之后,越來越多的的公司希望在Red Hat Enterprise Linux這類企業級的操作系統上面運行Docker,但可惜的是RHEL的內核并不支持AUFS。
這個時候紅帽公司出手了,決定和Docker公司合作去開發一種基于Device Mapper技術的后端存儲,也就是現在的devicemapper。
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坑的血淚史,仔細研讀之后發現老司機使用的是loop-lvm模式,那個坑有可能由此引起,最終老司機使用overlayfs的存儲驅動解決了問題。
注:Linux內核在3.18以上才能支持overlayfs,但RHEL 7.2的內核版本為3.10,所以原生并不支持。但是的確有人在RHEL7.2上成功應用了overlayfs驅動,個人猜測可能是手動在內核里面加載了overlay的模塊。
配置direct-lvm模式
停止Docker并備份
如果Docker服務已在運行且有需要保留的鏡像和容器,停服務前把相關數據給備份。個人也強烈建議如果是在生產環境使用Docker的話,拿到host的第一時間就將direct-lvm模式給配置了。(當然也可以選擇其他的storage driver)
查看當前devicemapper模式
[root@docanix ~]# docker info...Storage Driver: devicemapperPool Name: docker-8:3-17702667-poolPool Blocksize: 65.54 kBBase Device Size: 10.74 GBBacking Filesystem: xfsData file: /dev/loop0Metadata file: /dev/loop1Data Space Used: 11.8 MBData Space Total: 107.4 GBData Space Available: 17.15 GBMetadata Space Used: 581.6 kBMetadata Space Total: 2.147 GBMetadata Space Available: 2.147 GBUdev Sync Supported: trueDeferred Removal Enabled: falseDeferred Deletion Enabled: falseDeferred Deleted Device Count: 0Data loop file: /var/lib/docker/devicemapper/devicemapper/dataMetadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata...基于highlight的內容可以看到當前模式為loop-lvm
停止docker服務
[root@docanix ~]# systemctl stop docker [root@docanix ~]# systemctl status docker?.docker.service - Docker Application Container EngineLoaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)Active: inactive (dead) since Sat 2016-08-27 15:54:26 UTC; 1min 28s agoDocs: https://docs.docker.comProcess: 2176 ExecStart=/usr/bin/docker daemon -H fd:// (code=exited, status=0/SUCCESS)Main PID: 2176 (code=exited, status=0/SUCCESS分配裸設備
本例以Nutanix的ABS功能來分配一塊iSCSI盤到docker宿主機,推薦使用外部共享存儲的設備但不局限于此種方式,可根據自己的環境決定。
創建一個Volume?Group
添加50GB的盤
將Volume Group掛給docker宿主機
創建VG
查看設備
[root@docanix ~]# fdisk -l /dev/sdbDisk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 4096 bytes / 4096 bytes創建PV
[root@docanix ~]# pvcreate /dev/sdbPhysical volume "/dev/sdb" successfully created創建VG
[root@docanix ~]# vgcreate docker /dev/sdbVolume group "docker" successfully created查看VG信息
[root@docanix ~]# vgdisplay docker--- Volume group ---VG Name??????? ???????dockerSystem ID????????????Format??????????????? lvm2Metadata Areas??????? 1Metadata Sequence No? 1VG Access???????????? read/writeVG Status???????????? resizableMAX LV??????????????? 0Cur LV??????????????? 0Open LV????? ?????????0Max PV??????????????? 0Cur PV??????????????? 1Act PV??????????????? 1VG Size?????????????? 50.00 GiBPE Size?????????????? 4.00 MiBTotal PE????????????? 12799Alloc PE / Size?????? 0 / 0??Free? PE / Size?????? 12799 / 50.00 GiBVG UUID?????????????? bXJkQH-qSJc-t5JT-f1GL-reTR-XBVf-ylCEFY創建thinpool
創建pool
[root@docanix ~]# lvcreate --wipesignatures y -n thinpool docker -l 95%VGLogical volume "thinpool" created. [root@docanix ~]#? lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VGLogical volume "thinpoolmeta" created.數據LV大小為VG的95%,元數據LV大小為VG的1%,剩余的空間用來自動擴展。
將pool轉換為thinpool
[root@docanix ~]# lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmetaWARNING: Converting logical volume docker/thinpool and docker/thinpoolmeta to pool's data and metadata volumes.THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)Converted docker/thinpool to thin pool.配置thinpool
配置池的自動擴展
[root@docanix ~]# vi /etc/lvm/profile/docker-thinpool.profileactivation {thin_pool_autoextend_threshold=80thin_pool_autoextend_percent=20}應用配置變更
[root@docanix ~]# lvchange --metadataprofile docker-thinpool docker/thinpoolLogical volume "thinpool" changed.狀態監控檢查
[root@docanix ~]# lvs -o+seg_monitorLV?????? VG???? Attr?????? LSize? Pool Origin Data%? Meta%? Move Log Cpy%Sync Convert Monitor?thinpool docker twi-a-t--- 47.50g???????????? 0.00?? 0.02???????????????? ????????????monitored配置Docker
修改服務配置文件
[root@docanix ~]# vi /etc/systemd/system/docker.service--storage-driver=devicemapper --storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool --storage-opt dm.use_deferred_removal=trueExecStart后加入storage相關配置參數,如果配置了$OPTIONS也可以在對應的EnvironmentFile中加入。
清除graphdriver
[root@docanix ~]# rm -rf /var/lib/docker/*之前已提醒數據備份,因為在這里清除graphdriver會將image,Container和volume所有數據都刪除。如果不刪除,則會遇到以下的錯誤導致docker服務起不來
Error starting daemon: error initializing graphdriver: devmapper: Base Device UUID and Filesystem verification failed: devicemapper: Error running deviceCreate (ActivateDevice) dm_task_run failed
啟動docker服務
[root@docanix ~]# systemctl daemon-reload[root@docanix ~]# systemctl start docker檢查devicemapper配置
[root@docanix ~]# docker info...Storage Driver: devicemapperPool Name: docker-thinpoolPool Blocksize: 524.3 kBBase Device Size: 10.74 GBBacking Filesystem: xfsData file:Metadata file:Data Space Used: 20.45 MBData Space Total: 51 GBData Space Available: 50.98 GBMetadata Space Used: 90.11 kBMetadata Space Total: 532.7 MBMetadata Space Available: 532.6 MBThin Pool Minimum Free Space: 5.1 GB...基于highlight的內容可以看到當前模式為direct-lvm
測試
pull一個鏡像看是否數據會寫到thinpool里
[root@docanix ~]# lvsLV?????? VG???? Attr?????? LSize? Pool Origin Data%? Meta%? Move Log Cpy%Sync Convertthinpool docker twi-a-t--- 47.50g???????????? 0.04?? 0.02???????????[root@docanix ~]# docker pull busyboxUsing default tag: latestlatest: Pulling from library/busybox8ddc19f16526: Pull completeDigest: sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6Status: Downloaded newer image for busybox:latest[root@docanix ~]# lvsLV?????? VG???? Attr?????? LSize? Pool Origin Data%? Meta%? Move Log Cpy%Sync Convertthinpool docker twi-a-t--- 47.50g???????????? 0.08?? 0.02可以看到Data%在pull一個busybox鏡像后使用率由0.04變為0.08,說明direct-lvm配置成功且正常工作。
本文:Docker存儲驅動devicemapper介紹和配置
總結
以上是生活随笔為你收集整理的devicemapper介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯笔试 机器学习
- 下一篇: JS 数组 按个数进行分组