一、存儲(chǔ)
docker的鏡像使用一層一層文件組成的,docker的一些存儲(chǔ)引擎可以處理怎么樣存儲(chǔ)這些文件。使用docker inspect這個(gè)命令可以查詢鏡像或者容器的詳細(xì)信息,比如要查看centos這個(gè)鏡像:
docker inspect centos

展示信息下方的Layers,就是centos的文件,這些東西都是只讀的不能去修改,我們基于這個(gè)鏡像去創(chuàng)建的鏡像和容器也會(huì)共享這些文件層,而docker會(huì)在這些層上面去添加一個(gè)可讀寫(xiě)的文件層。如果需要修改一些文件層里面的東西的話,docker會(huì)復(fù)制一份到這個(gè)可讀寫(xiě)的文件層里面,如果刪除容器的話,那么也會(huì)刪除它對(duì)應(yīng)的可讀寫(xiě)的文件層的文件。
演示
先創(chuàng)建一個(gè)帶交互的容器,管它名字叫test1。
docker run -i -t --name test1 centos /bin/bash
然后在里面新建一個(gè)文件,hello.txt。

接著退出容器,使用centos創(chuàng)建第二個(gè)容器叫test2,試著輸出根目錄下的hello.txt文件的內(nèi)容。

發(fā)現(xiàn)沒(méi)有找到此文件,雖然test1,test2都是基于centos鏡像創(chuàng)建的,但他們都擁有各自的可讀寫(xiě)的文件層,新創(chuàng)建的文件或者修改的已有的文件都會(huì)放到這個(gè)文件層,不會(huì)影響到鏡像本身和使用這個(gè)鏡像創(chuàng)建的容器。
刪除容器的時(shí)候,這些容器層上面的文件也會(huì)被刪除掉。
二、數(shù)據(jù)卷:Data Volumes
如果有些數(shù)據(jù)你想一直保存的話,比如:web服務(wù)器上面的日志,數(shù)據(jù)庫(kù)管理系統(tǒng)里面的數(shù)據(jù),那么我們可以把這些數(shù)據(jù)放到data volumes數(shù)據(jù)盤里面。它上面的數(shù)據(jù),即使把容器刪掉,也還是會(huì)永久保留。創(chuàng)建容器的時(shí)候,我們可以去指定數(shù)據(jù)盤。其實(shí)就是去指定一個(gè)特定的目錄,剩下的docker會(huì)幫你做。
指定數(shù)據(jù)盤的命令
docker run --volume /mnt -i -t --name db centos /bin/bash
說(shuō)明:--volume簡(jiǎn)寫(xiě)形式 -v,指定數(shù)據(jù)盤的目錄,注意目錄是要絕對(duì)路徑。
創(chuàng)建容器,并在這容器的數(shù)據(jù)盤里創(chuàng)建一個(gè)文件。

查看容器信息:

Mounts下Source表示數(shù)據(jù)存在宿主機(jī)上的真實(shí)位置,Destination表示數(shù)據(jù)盤在docker中對(duì)應(yīng)的位置。及時(shí)刪除容器,Source下的數(shù)據(jù)也還會(huì)存在。
指定主機(jī)目錄作為數(shù)據(jù)盤
我們還可以手工指定主機(jī)上的目錄作為數(shù)據(jù)盤,比如,新建一個(gè)文件夾叫data,讓它作為數(shù)據(jù)盤,然后使用centos鏡像創(chuàng)建容器,命名為db,指定數(shù)據(jù)盤位置:
docker run -v /Users/beckjiang/Desktop/data:/mnt --name db -i -t centos /bin/bash
進(jìn)入容器后,在/mnt/ 目錄下創(chuàng)建文件data1,然后刪除容器,查看主機(jī)上/Users/beckjiang/Desktop/data 里面,仍然會(huì)保留容器里面創(chuàng)建的數(shù)據(jù)。

三、數(shù)據(jù)容器
我們可以創(chuàng)建一個(gè)數(shù)據(jù)容器,也就是再創(chuàng)建容器是指定這個(gè)容器的數(shù)據(jù)盤,然后讓其他容器可以使用這個(gè)容器作為他們的數(shù)據(jù)盤,有點(diǎn)像繼承了這個(gè)數(shù)據(jù)容器指定的數(shù)據(jù)盤作為數(shù)據(jù)盤。
先來(lái)創(chuàng)建一個(gè)數(shù)據(jù)容器:
docker create -v /mnt -i -t --name dbcenter centos /bin/bash

接著使用這個(gè)數(shù)據(jù)容器,去創(chuàng)建一個(gè)容器 db1:
docker run --volumes-from dbcenter --name db1 -i -t centos bash
在/mnt/目錄下創(chuàng)建data1文件:

完成以后退出容器,基于dbcenter這個(gè)數(shù)據(jù)容器去創(chuàng)建第二個(gè)容器 db2:
docker run --volumes-from dbcenter --name db2 -i -t centos bash

查看/mnt/目錄下的文件,會(huì)看到在db1容器中創(chuàng)建的data1文件。同樣的,你在db2中的/mnt/目錄創(chuàng)建的數(shù)據(jù)文件,也會(huì)被其他使用了dbcenter作為數(shù)據(jù)容器的容器所看到。
四、管理數(shù)據(jù)盤
查看主機(jī)上面創(chuàng)建的數(shù)據(jù)盤
docker volume ls

在刪除容器時(shí),docker默認(rèn)不會(huì)刪除其數(shù)據(jù)盤。這里可以** 查看沒(méi)有容器在使用的數(shù)據(jù)盤 **:
docker volume ls -f dangling=true

出現(xiàn)的就是沒(méi)有容器在使用的數(shù)據(jù)盤,想要** 刪除數(shù)據(jù)盤 **可以使用:
docker volume rm VOLUME NAME

把沒(méi)有容器使用的數(shù)據(jù)盤都刪除掉以后,還剩下1個(gè)正在被使用的數(shù)據(jù)盤,就是上面創(chuàng)建的數(shù)據(jù)容器。
如果想要?jiǎng)h除容器時(shí),同時(shí)刪除掉其數(shù)據(jù)盤,那么可以使用-v參數(shù)。(db1,db2使用dbcenter作為數(shù)據(jù)盤,先將其刪掉)
docker rm -v dbcenter

因?yàn)閯h除容器也把數(shù)據(jù)盤給刪了,所以執(zhí)行docker volume ls,數(shù)據(jù)盤為空。