十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
本篇內(nèi)容介紹了“怎么配置docker使用devicemapper”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
定遠網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)公司2013年至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
docker 最先是跑在ubuntu和debian上的,使用aufs存儲器. 由于docker越來越流行,許多公司希望在RHEL上使用,但是上游內(nèi)核中沒有包括aufs,所以rhel不能使用aufs. 最終開發(fā)者們開發(fā)了一個新的后端存儲引擎devicemapper
,基于已有的Device Mapper
技術(shù),并且使docker支持可插拔,現(xiàn)在全世界有很多真實案例在生產(chǎn)環(huán)境使用devicemapper
.
devicemapper
存儲每個鏡像和容器在自己的虛擬設(shè)備上,也就是說這些設(shè)備是按需分配(copy-on-write snapshot devices),Device Mapper
技術(shù)是工作在block級別的而不是文件級別的.
devicemapper
創(chuàng)建鏡像的方式是:
devicemapper
基于塊設(shè)備或loop mounted sparse files
來創(chuàng)建一個虛擬池.
然后在上面創(chuàng)建一個有文件系統(tǒng)的基礎(chǔ)設(shè)備(base device).
每個鏡像層就是基于這個基礎(chǔ)設(shè)備的COW快照(snapshot),也就是說這些快照初始化時是空的,只有數(shù)據(jù)寫入時才會占用池中的空間.
容器中的應(yīng)用請求塊0x44f
,因為容器層也是個虛擬的快照,不存數(shù)據(jù),只有指針.通過指針找到存放數(shù)據(jù)的鏡像層.
根據(jù)指針找到a005e
層的0xf33
.
devicemapper
copy其中的數(shù)據(jù)到容器內(nèi)存中.
存儲驅(qū)動器返回數(shù)據(jù)給請求的應(yīng)用.
devicemapper
寫操作是通過allocate-on-demand
(按需分配)的方式.更新數(shù)據(jù)是通過COW方式. 因為devicemapper
是一種基于塊的技術(shù),所以就算修改一個大文件,也不會copy整個文件過來.只會copy對應(yīng)要修改的塊.
寫56k的數(shù)據(jù)到容器中:
應(yīng)用請求寫56k的數(shù)據(jù)到容器
按需分配一個新的64k大小的塊在容器層.(超過64k,則分配多個)
數(shù)據(jù)寫入新分配的塊中
應(yīng)用請求修改容器中數(shù)據(jù)
cow操作定位到要更新的塊
分配新的塊在容器層并將數(shù)據(jù)copy過來
對數(shù)據(jù)進行修改
devicemapper
基于rhel的分支默認使用的devicemapper
,并且默認配置成loop-lvm
模式運行.這種模式使用文件來作為虛擬池(thin pool)構(gòu)建鏡像和容器的層. 但是生產(chǎn)環(huán)境不因該使用這種模式.
通過docker info命令來檢查
[root@srv00 ~]# 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. ... Data loop file: /var/lib/docker/devicemapper/devicemapper/data Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata Library Version: 1.02.107-RHEL7 (2015-12-01) ...
Data loop file
,Metadata loop file
指示了docker運行在loop-lvm
模式下,并且還有個WARNING.
direct-lvm
模式生產(chǎn)環(huán)境下因該使用direct-lvm
,如果之前有鏡像在loop-lvm
模式下創(chuàng)建,需要切換,則因該將鏡像做備份.(push到hub或私有registry)
我給虛擬機分配個30G磁盤
1.停止docker daemon
[root@srv00 ~]# systemctl stop docker
2.創(chuàng)建相關(guān)的邏輯卷和thinpool
創(chuàng)建pv
[root@srv00 ~]# fdisk -l <==檢查下磁盤 ... Disk /dev/xvdb: 32.2 GB, 32212254720 bytes, 62914560 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 [root@srv00 ~]# pvcreate /dev/xvdb Physical volume "/dev/xvdb" successfully created
創(chuàng)建vg
[root@srv00 ~]# vgcreate vgdocker /dev/xvdb Volume group "vgdocker" successfully created
創(chuàng)建一個thin pool,名字叫thinpool
,先來創(chuàng)建邏輯卷
[root@srv00 ~]# lvcreate --wipesignatures y -n thinpool -l 95%VG vgdocker Logical volume "thinpool" created. [root@srv00 ~]# lvcreate --wipesignatures y -n thinpoolmeta -l 1%VG vgdocker Logical volume "thinpoolmeta" created. [root@srv00 ~]# lvscan ACTIVE '/dev/centos/swap' [4.00 GiB] inherit ACTIVE '/dev/centos/root' [35.47 GiB] inherit ACTIVE '/dev/vgdocker/thinpool' [28.50 GiB] inherit ACTIVE '/dev/vgdocker/thinpoolmeta' [304.00 MiB] inherit
剩余的4%留給它們自動擴展
轉(zhuǎn)換成thin pool
[root@srv00 ~]# lvconvert -y --zero n -c 512K --thinpool vgdocker/thinpool --poolmetadata vgdocker/thinpoolmeta WARNING: Converting logical volume vgdocker/thinpool and vgdocker/thinpoolmeta to pool's data and metadata volumes. THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.) Converted vgdocker/thinpool to thin pool.
設(shè)置thinpool的自動擴展參數(shù),并應(yīng)用此profile
[root@srv00 ~]# vi /etc/lvm/profile/docker-thinpool.profile activation { thin_pool_autoextend_threshold=80 thin_pool_autoextend_percent=20 } [root@srv00 ~]# lvchange --metadataprofile docker-thinpool vgdocker/thinpool Logical volume "thinpool" changed.
當(dāng)空間大于80%時進行擴展.擴展的大小是空閑空間的20%
查看thinpool是否是已監(jiān)視狀態(tài)
[root@srv00 ~]# lvs -o+seg_monitor LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Monitor root centos -wi-ao---- 35.47g swap centos -wi-ao---- 4.00g thinpool vgdocker twi-a-t--- 28.50g 0.00 0.02 monitored
3.刪除docker存儲目錄
[root@srv00 ~]# rm -rf /var/lib/docker/*
注意備份重要鏡像等
4.修改啟動參數(shù)并啟動
我們通過systemd的drop-in方式修改,也是官方推薦的
[root@srv00 ~]# mkdir /etc/systemd/system/docker.service.d [root@srv00 ~]# vi /etc/systemd/system/docker.service.d/daemon.conf [Service] ExecStart= ExecStart=/usr/bin/docker daemon -H fd:// --storage-driver=devicemapper --storage-opt=dm.thinpooldev=/dev/mapper/vgdocker-thinpool --storage-opt dm.use_deferred_removal=true [root@srv00 ~]# systemctl daemon-reload [root@srv00 ~]# systemctl start docker
ExecStart=
第一行是空.否則啟動會報錯,并且修改daemon參數(shù)需要reload
5.檢查確認
[root@srv00 docker]# docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 1.11.1 Storage Driver: devicemapper Pool Name: vgdocker-thinpool Pool Blocksize: 524.3 kB Base Device Size: 10.74 GB Backing Filesystem: xfs ... [root@srv00 docker]# lvs -a LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root centos -wi-ao---- 35.47g swap centos -wi-ao---- 4.00g [lvol0_pmspare] vgdocker ewi------- 304.00m thinpool vgdocker twi-a-t--- 28.50g 0.07 0.02 [thinpool_tdata] vgdocker Twi-ao---- 28.50g [thinpool_tmeta] vgdocker ewi-ao---- 304.00m [root@srv00 docker]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 114.4M 0 rom xvda 202:0 0 40G 0 disk ├─xvda1 202:1 0 500M 0 part /boot └─xvda2 202:2 0 39.5G 0 part ├─centos-root 253:0 0 35.5G 0 lvm / └─centos-swap 253:1 0 4G 0 lvm [SWAP] xvdb 202:16 0 30G 0 disk ├─vgdocker-thinpool_tmeta 253:2 0 304M 0 lvm │ └─vgdocker-thinpool 253:5 0 28.5G 0 lvm └─vgdocker-thinpool_tdata 253:3 0 28.5G 0 lvm └─vgdocker-thinpool 253:5 0 28.5G 0 lvm
然后就可以正常的docker run 了
devicemapper
的性能影響Allocate-on-demand
性能影響
之前講說,如果容器中要寫數(shù)據(jù),則會在容器層分配新的塊,每個快64k,如果要寫的數(shù)據(jù)大于64k,則會分配多個塊. 如果容器中有許多小文件的寫操作..則會影響性能.
Copy-on-write
性能影響
容器中第一次更新一個已有數(shù)據(jù)時,就會進行cow操作,如果更新大文件的某一部分,則只會copy相應(yīng)的數(shù)據(jù)快,這個性能提升很大. 如果更新大量小文件(<=64k),devicemapper
的性能就比AUFS差.
其他
loop-lvm
模式的性能很差,不推薦使用在生產(chǎn)環(huán)境.生產(chǎn)環(huán)境使用direct-lvm
模式,它是直接操作raw設(shè)備.
使用ssd的話提升更明顯
devicemapper
內(nèi)存使用不是最有效的.運行n個容器會加載n次相同文件到內(nèi)存.所以不是運行pass平臺和高密度容器最好的選擇.
當(dāng)然容器中寫操作多的話要盡量使用data volume,它是繞過storage driver,性能有保證
“怎么配置docker使用devicemapper”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!