Docker鏡像是基于聯(lián)合文件系統(tǒng)(Union File System)的一種層式結(jié)構(gòu),,由一系列指令一步一步構(gòu)建出來,。 Docker鏡像被存儲在一系列的只讀層中。當(dāng)我們創(chuàng)建一個容器時,,Docker會讀取鏡像(只讀),,并在其頂部添加一層讀寫層。如果正在運(yùn)行中的容器修改了現(xiàn)有文件,,該文件將會被拷貝出底層的只讀層,,放到最頂層的讀寫層中。讀寫層中原來的舊版本文件(未被更改過的文件)仍然存在于鏡像中,。所以當(dāng)Docker容器被刪除后,,再基于原來的鏡像創(chuàng)建容器時,將創(chuàng)建一個沒有任何數(shù)據(jù)更改的容器,,在之前那個容器中的數(shù)據(jù)更改會丟失掉,。 為什么需要Volume 為了能夠持久化這些更改過的數(shù)據(jù),并且能夠很容易實(shí)現(xiàn)容器間共享數(shù)據(jù),,Docker提出了Volume的概念,。Volume是外部默認(rèn)的聯(lián)合文件系統(tǒng)或者是存在于宿主文件系統(tǒng)中正常的文件或文件夾。 數(shù)據(jù)卷可以帶來以下好處:
Docker volume 有如下幾種形態(tài): 不使用 Docker volume 默認(rèn)情況下,,容器不使用任何 volume,此時,,容器的數(shù)據(jù)被保存在容器之內(nèi),,它只在容器的生命周期內(nèi)存在,會隨著容器的被刪除而被刪除,。當(dāng)然,,也可以使用 docker commit 命令將它持久化為一個新的鏡像,。 Data volume (數(shù)據(jù)卷) 一個 data volume 是容器中繞過 Union 文件系統(tǒng)的一個特定的目錄。它被設(shè)計用來保存數(shù)據(jù),,而不管容器的生命周期,。因此,當(dāng)你刪除一個容器時,,Docker 肯定不會自動地刪除一個volume,。有如下幾種方式來使用 data volume: (1)使用 “-v 容器內(nèi)目錄” 形式
這種情況當(dāng)容器被刪除后,, /var/lib/docker/volumes/b9697411cd69fde3b5fe471229fc02e70409f8e84edd3333765f441cfb5961f8/_data 目錄及其中的內(nèi)容都還會保留下來,,但是,新啟動的容器無法再使用這個目錄,,也就是說,,已有的數(shù)據(jù)不能自動地被重復(fù)使用了。 (2)使用 -v 來掛載一個主機(jī)上的目錄到容器的目錄
主機(jī)上的目錄可以是一個本地目錄,,也可以在一個 NFS share 內(nèi),,或者在一個已經(jīng)格式化好了的塊設(shè)備上。 其實(shí)這種形式和第一種沒有本質(zhì)的區(qū)別,,容器內(nèi)對 /data的操作都會反映到主機(jī)上的 /root/data 目錄內(nèi),。只是,重新啟動容器時,,可以再次使用同樣的方式來將 /root/data 目錄掛載到新的容器內(nèi),,這樣就可以實(shí)現(xiàn)數(shù)據(jù)持久化的目標(biāo)。 使用 docker volume 命令 Docker 新版本中引入了 docker volume 命令來管理 Docker volume,。 (1)使用默認(rèn)的 'local’ driver 創(chuàng)建一個 volume
查看結(jié)果:
(2)使用這個 volume
結(jié)果將 myvulume 對應(yīng)的主機(jī)上的目錄掛載給容器內(nèi)的 /data 目錄,。
刪除 volume 可以使用 docker rm -v 命令在刪除容器時刪除該容器的卷。
批量刪除volume 從上面的介紹可以看出,,使用 docker run -v 啟動的容器被刪除以后,,在主機(jī)上會遺留下來孤單的卷??梢允褂孟旅娴暮唵畏椒▉碜銮謇恚?/p>
|
|