container 存儲(chǔ)是臨時(shí)的魔策,也就是說當(dāng)這個(gè)container被刪除之后,所有的內(nèi)容都不會(huì)保留匾南。容器化的應(yīng)用總是被假設(shè)在一個(gè)空的存儲(chǔ)上運(yùn)行猿涨,這就使的創(chuàng)建和銷毀容器非常簡單。
然而冀值,如果容器重啟前后需要數(shù)據(jù)一致也物,則僅有臨時(shí)的container的存儲(chǔ)是不夠的,像數(shù)據(jù)庫列疗。為了支撐這些應(yīng)用滑蚯,則需要為container提供持續(xù)化存儲(chǔ)。
一個(gè)正在運(yùn)行的container實(shí)際上是在其base container image上重新建了一層抵栈,這一層就是container storage. 首先告材,這一層是僅供該容器讀寫,創(chuàng)建工作文件古劲,臨時(shí)文件和日志文件等斥赋。這些文件是變化的,這些文件的丟失不會(huì)影響到container中的application. container的storage層是獨(dú)屬當(dāng)前所運(yùn)行的容器的产艾。即使是基于同一個(gè)image創(chuàng)建的container也不會(huì)共享這個(gè)storage而是擁有各自的疤剑。
容器化的應(yīng)用不應(yīng)該用container storage去存儲(chǔ)持久化的數(shù)據(jù)滑绒。因?yàn)槌食绦虮旧聿荒芸刂七@些數(shù)據(jù)會(huì)被保存多久。盡管這樣作有時(shí)候也可以保持一段時(shí)間隘膘。
docker會(huì)保留已經(jīng)停止的container一段時(shí)間疑故,以便于調(diào)試和定位問題,例如docker logs去查log等棘幸。但是container storage是一個(gè)臨時(shí)觀念焰扳。重啟container倦零,將會(huì)獲取一個(gè)新的container storage.
docker 進(jìn)程可以申請(qǐng)綁定host上的目錄到一個(gè)正在運(yùn)行的container. 這個(gè)host目錄可以看成這個(gè)容器化程序的container storage的一部分误续,就像一個(gè)遠(yuǎn)端的網(wǎng)絡(luò)卷,可以看成這個(gè)container文件系統(tǒng)的一部分扫茅,但是這個(gè)host的目錄當(dāng)container停止的時(shí)候不會(huì)被回收而可被其他container利用蹋嵌。
例如。一個(gè)數(shù)據(jù)庫container可以在啟動(dòng)的時(shí)候綁定一個(gè)host目錄去存儲(chǔ)數(shù)據(jù)庫文件葫隙。如果這個(gè)數(shù)據(jù)庫的容器掛了栽烂,我們可以重新創(chuàng)建一個(gè)container綁定同一個(gè)host目錄,已保證數(shù)據(jù)庫數(shù)據(jù)持續(xù)可用恋脚。而對(duì)數(shù)據(jù)庫container而言腺办,host目錄的路徑并不重要,因?yàn)閷?duì)container而言糟描,它使用的路徑而是掛載后的路徑怀喉。
但是我們需要注意host目錄的權(quán)限。container的作為操作系統(tǒng)中的進(jìn)程同樣是基于userID和groupID的船响,所以請(qǐng)卻到該進(jìn)程的用戶可以訪問這個(gè)host目錄躬拢。
在RHEL,這個(gè)host目錄還需要配置合適的SELinux上下文见间,可通過類似“chcon -t svirt_sandbox_file_t /var/dbfiles”的命令來實(shí)現(xiàn)聊闯。
等創(chuàng)建和配置了host目錄后,我們就可以用“-v”指令掛載到container了米诉。
例如菱蔬,host目錄為"/var/dbfiles", 我們預(yù)期其在container內(nèi)部為“/var/lib/mysql",則我們可以用命令 “docker run -v /var/dbfiles:/var/lib/mysql mysql”來實(shí)現(xiàn)。