container 存儲是臨時的,也就是說當這個container被刪除之后,所有的內(nèi)容都不會保留。容器化的應用總是被假設在一個空的存儲上運行,這就使的創(chuàng)建和銷毀容器非常簡單。
然而,如果容器重啟前后需要數(shù)據(jù)一致,則僅有臨時的container的存儲是不夠的,像數(shù)據(jù)庫。為了支撐這些應用,則需要為container提供持續(xù)化存儲。
一個正在運行的container實際上是在其base container image上重新建了一層,這一層就是container storage. 首先,這一層是僅供該容器讀寫,創(chuàng)建工作文件,臨時文件和日志文件等。這些文件是變化的,這些文件的丟失不會影響到container中的application. container的storage層是獨屬當前所運行的容器的。即使是基于同一個image創(chuàng)建的container也不會共享這個storage而是擁有各自的。
容器化的應用不應該用container storage去存儲持久化的數(shù)據(jù)。因為呈程序本身不能控制這些數(shù)據(jù)會被保存多久。盡管這樣作有時候也可以保持一段時間。
docker會保留已經(jīng)停止的container一段時間,以便于調(diào)試和定位問題,例如docker logs去查log等。但是container storage是一個臨時觀念。重啟container,將會獲取一個新的container storage.
docker 進程可以申請綁定host上的目錄到一個正在運行的container. 這個host目錄可以看成這個容器化程序的container storage的一部分,就像一個遠端的網(wǎng)絡卷,可以看成這個container文件系統(tǒng)的一部分,但是這個host的目錄當container停止的時候不會被回收而可被其他container利用。
例如。一個數(shù)據(jù)庫container可以在啟動的時候綁定一個host目錄去存儲數(shù)據(jù)庫文件。如果這個數(shù)據(jù)庫的容器掛了,我們可以重新創(chuàng)建一個container綁定同一個host目錄,已保證數(shù)據(jù)庫數(shù)據(jù)持續(xù)可用。而對數(shù)據(jù)庫container而言,host目錄的路徑并不重要,因為對container而言,它使用的路徑而是掛載后的路徑。
但是我們需要注意host目錄的權限。container的作為操作系統(tǒng)中的進程同樣是基于userID和groupID的,所以請卻到該進程的用戶可以訪問這個host目錄。
在RHEL,這個host目錄還需要配置合適的SELinux上下文,可通過類似“chcon -t svirt_sandbox_file_t /var/dbfiles”的命令來實現(xiàn)。
等創(chuàng)建和配置了host目錄后,我們就可以用“-v”指令掛載到container了。
例如,host目錄為"/var/dbfiles", 我們預期其在container內(nèi)部為“/var/lib/mysql",則我們可以用命令 “docker run -v /var/dbfiles:/var/lib/mysql mysql”來實現(xiàn)。