溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

怎么配置docker使用devicemapper

發(fā)布時(shí)間:2021-12-30 09:32:14 來(lái)源:億速云 閱讀:155 作者:iii 欄目:云計(jì)算

本篇內(nèi)容介紹了“怎么配置docker使用devicemapper”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

devicemapper 最佳實(shí)踐

docker 最先是跑在ubuntu和debian上的,使用aufs存儲(chǔ)器. 由于docker越來(lái)越流行,許多公司希望在RHEL上使用,但是上游內(nèi)核中沒(méi)有包括aufs,所以rhel不能使用aufs. 最終開(kāi)發(fā)者們開(kāi)發(fā)了一個(gè)新的后端存儲(chǔ)引擎devicemapper,基于已有的Device Mapper技術(shù),并且使docker支持可插拔,現(xiàn)在全世界有很多真實(shí)案例在生產(chǎn)環(huán)境使用devicemapper.

鏡像層與共享

devicemapper存儲(chǔ)每個(gè)鏡像和容器在自己的虛擬設(shè)備上,也就是說(shuō)這些設(shè)備是按需分配(copy-on-write snapshot devices),Device Mapper技術(shù)是工作在block級(jí)別的而不是文件級(jí)別的.

devicemapper創(chuàng)建鏡像的方式是:

  1. devicemapper基于塊設(shè)備或loop mounted sparse files來(lái)創(chuàng)建一個(gè)虛擬池.

  2. 然后在上面創(chuàng)建一個(gè)有文件系統(tǒng)的基礎(chǔ)設(shè)備(base device).

  3. 每個(gè)鏡像層就是基于這個(gè)基礎(chǔ)設(shè)備的COW快照(snapshot),也就是說(shuō)這些快照初始化時(shí)是空的,只有數(shù)據(jù)寫(xiě)入時(shí)才會(huì)占用池中的空間.


devicemapper的讀操作

  1. 容器中的應(yīng)用請(qǐng)求塊0x44f,因?yàn)槿萜鲗右彩莻€(gè)虛擬的快照,不存數(shù)據(jù),只有指針.通過(guò)指針找到存放數(shù)據(jù)的鏡像層.

  2. 根據(jù)指針找到a005e層的0xf33.

  3. devicemapper copy其中的數(shù)據(jù)到容器內(nèi)存中.

  4. 存儲(chǔ)驅(qū)動(dòng)器返回?cái)?shù)據(jù)給請(qǐng)求的應(yīng)用.

devicemapper的寫(xiě)操作

devicemapper寫(xiě)操作是通過(guò)allocate-on-demand(按需分配)的方式.更新數(shù)據(jù)是通過(guò)COW方式. 因?yàn)?code>devicemapper是一種基于塊的技術(shù),所以就算修改一個(gè)大文件,也不會(huì)copy整個(gè)文件過(guò)來(lái).只會(huì)copy對(duì)應(yīng)要修改的塊.

寫(xiě)新數(shù)據(jù)

寫(xiě)56k的數(shù)據(jù)到容器中:

  1. 應(yīng)用請(qǐng)求寫(xiě)56k的數(shù)據(jù)到容器

  2. 按需分配一個(gè)新的64k大小的塊在容器層.(超過(guò)64k,則分配多個(gè))

  3. 數(shù)據(jù)寫(xiě)入新分配的塊中

修改數(shù)據(jù)

  1. 應(yīng)用請(qǐng)求修改容器中數(shù)據(jù)

  2. cow操作定位到要更新的塊

  3. 分配新的塊在容器層并將數(shù)據(jù)copy過(guò)來(lái)

  4. 對(duì)數(shù)據(jù)進(jìn)行修改

配置docker使用devicemapper

基于rhel的分支默認(rèn)使用的devicemapper,并且默認(rèn)配置成loop-lvm模式運(yùn)行.這種模式使用文件來(lái)作為虛擬池(thin pool)構(gòu)建鏡像和容器的層. 但是生產(chǎn)環(huán)境不因該使用這種模式.

通過(guò)docker info命令來(lái)檢查

[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運(yùn)行在loop-lvm模式下,并且還有個(gè)WARNING.

為生產(chǎn)環(huán)境配置direct-lvm模式

生產(chǎn)環(huán)境下因該使用direct-lvm,如果之前有鏡像在loop-lvm模式下創(chuàng)建,需要切換,則因該將鏡像做備份.(push到hub或私有registry)

我給虛擬機(jī)分配個(gè)30G磁盤(pán)

1.停止docker daemon

[root@srv00 ~]# systemctl stop docker

2.創(chuàng)建相關(guān)的邏輯卷和thinpool

創(chuàng)建pv

[root@srv00 ~]# fdisk -l <==檢查下磁盤(pán)
...
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)建一個(gè)thin pool,名字叫thinpool,先來(lái)創(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%留給它們自動(dòng)擴(kuò)展

轉(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的自動(dòng)擴(kuò)展參數(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%時(shí)進(jìn)行擴(kuò)展.擴(kuò)展的大小是空閑空間的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存儲(chǔ)目錄

[root@srv00 ~]# rm -rf /var/lib/docker/*

注意備份重要鏡像等

4.修改啟動(dòng)參數(shù)并啟動(dòng)

我們通過(guò)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= 第一行是空.否則啟動(dòng)會(huì)報(bào)錯(cuò),并且修改daemon參數(shù)需要reload

5.檢查確認(rèn)

[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性能影響

之前講說(shuō),如果容器中要寫(xiě)數(shù)據(jù),則會(huì)在容器層分配新的塊,每個(gè)快64k,如果要寫(xiě)的數(shù)據(jù)大于64k,則會(huì)分配多個(gè)塊. 如果容器中有許多小文件的寫(xiě)操作..則會(huì)影響性能.

  • Copy-on-write 性能影響

容器中第一次更新一個(gè)已有數(shù)據(jù)時(shí),就會(huì)進(jìn)行cow操作,如果更新大文件的某一部分,則只會(huì)copy相應(yīng)的數(shù)據(jù)快,這個(gè)性能提升很大. 如果更新大量小文件(<=64k),devicemapper的性能就比AUFS差.

  • 其他

    • loop-lvm模式的性能很差,不推薦使用在生產(chǎn)環(huán)境.生產(chǎn)環(huán)境使用direct-lvm模式,它是直接操作raw設(shè)備.

    • 使用ssd的話(huà)提升更明顯

    • devicemapper內(nèi)存使用不是最有效的.運(yùn)行n個(gè)容器會(huì)加載n次相同文件到內(nèi)存.所以不是運(yùn)行pass平臺(tái)和高密度容器最好的選擇.

  • 當(dāng)然容器中寫(xiě)操作多的話(huà)要盡量使用data volume,它是繞過(guò)storage driver,性能有保證

“怎么配置docker使用devicemapper”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI