Device Mapper是一個(gè)基于kernel的框架,它增強(qiáng)了很多Linux上的高級(jí)卷管理技術(shù)。Docker的devicemapper驅(qū)動(dòng)在鏡像和容器管理上,利用了該框架的超配和快照功能。為了區(qū)別,本文使用Device Mapper指驅(qū)動(dòng)中的框架,而devicemapper指Docker的存儲(chǔ)驅(qū)動(dòng)。
  注意:商業(yè)支持的Docker Engine(CS-Engine)建議在RHEL和CentOS上使用devicemapper存儲(chǔ)驅(qū)動(dòng)。

AUFS之外的另一種選擇

  Docker最初運(yùn)行在Ubuntu和Devian上,并且使用AUFS作為存儲(chǔ)后端。當(dāng)Docker變得流行后,很多想使用它的公司正在使用RHEL。不幸的是,因?yàn)長(zhǎng)inux主線kernel并不包含AUFS,所以RHEL并沒有支持AUFS。
  為了改變這種情況,Red Hat開發(fā)者研究將AUFS包含進(jìn)kernel主線。最后,他們認(rèn)為開發(fā)一種新的存儲(chǔ)后端是更好的主意。此外,他們打算使用已經(jīng)存在的Device Mapper技術(shù)作為新存儲(chǔ)后端的基礎(chǔ)。
  Red Hat與Docker公司合作貢獻(xiàn)這個(gè)新驅(qū)動(dòng)。因?yàn)檫@次合作,Docker Engine被重新設(shè)計(jì)為存儲(chǔ)驅(qū)動(dòng)插件化。因此devicemapper成為Docker支持的第二個(gè)存儲(chǔ)驅(qū)動(dòng)。
  Device Mapper在2.6.9之后就被何如Linux kernel主線,也是RHEL家族發(fā)布包的核心部分。這意味著devicemapper存儲(chǔ)驅(qū)動(dòng)基于穩(wěn)定的代碼,有著大量的工作產(chǎn)品和極強(qiáng)的社區(qū)支持。

鏡像分層和共享

  devicemapper驅(qū)動(dòng)把每個(gè)鏡像和容器都存儲(chǔ)在它自己的虛擬設(shè)備中,這些設(shè)備是超配的copy-on-write快照設(shè)備。Device Mapper技術(shù)工作在塊級(jí)別而不是文件級(jí)別,也就是說devicemapper存儲(chǔ)驅(qū)動(dòng)的超配和copy-on-write操作直接操作塊,而不是整個(gè)文件。
  注意:快照也是使用的thin設(shè)備或者虛擬設(shè)備。
  使用devicemapper時(shí),Docker如下創(chuàng)建鏡像:
    ?devicemapper存儲(chǔ)驅(qū)動(dòng)創(chuàng)建一個(gè)thin池。
    這個(gè)池是在塊設(shè)備或者loop mounted sparse file上創(chuàng)建的。
    ?然后創(chuàng)建一個(gè)基礎(chǔ)設(shè)備。
    該基礎(chǔ)設(shè)備是一個(gè)帶文件系統(tǒng)的thin設(shè)備??梢酝ㄟ^docker info命令中的Backing filesystem值,來查看后端使用的是哪種文件系統(tǒng)。
    ?每個(gè)新的鏡像(和鏡像層)都是該基礎(chǔ)設(shè)備的快照。
    這些都是超配的copy-on-write快照。也就是說它們初始化的時(shí)候是空的,只有在有數(shù)據(jù)寫向它們時(shí),才會(huì)從池中消耗空間。
  使用devicemapper,容器層是基于鏡像的快照。和鏡像一樣,容器快照也是超配的copy-on-write快照。容器快照保存了容器的所有更新,當(dāng)向容器寫數(shù)據(jù)時(shí),devicemapper按需從池中分配空間給容器層。
  下圖展示了一個(gè)thin池、基礎(chǔ)設(shè)備和兩個(gè)鏡像。
  
  如果你仔細(xì)觀察圖片,你會(huì)發(fā)現(xiàn)每個(gè)鏡像層都是它下層的快照,鏡像的最底層是池中基礎(chǔ)設(shè)備的快照。這個(gè)基礎(chǔ)設(shè)備是Device Mapper產(chǎn)生的,并不是一個(gè)Docker鏡像層。
  而容器又是鏡像的一個(gè)快照,下圖展示了兩個(gè)容器在整個(gè)存儲(chǔ)驅(qū)動(dòng)的層次。