docker數據卷(volumn)docker
一. 爲何須要數據卷centos
docker鏡像是由多個文件系統(只讀層)疊加而成,當咱們啓動一個容器的時候,docker的服務端會加載鏡像的只讀層,並在最頂層建立一個可讀寫層。當運行的容器修改現有的文件,該文件會從只讀層拷貝到讀寫層,其實並無影響到鏡像自己,依然存在於鏡像中。當咱們刪除掉容器,容器運行時的數據都會丟失,當咱們經過鏡像從新run一個容器,該容器仍是會回到最初的狀態。那麼問題來了,咱們該如何保存咱們運行中的數據了?這個問題有兩種解決方法:a. 咱們能夠按期的將咱們的容器經過commit的方式生成一個鏡像;b.經過數據捲來實現。很明顯咱們不可能不停的commit來生成鏡像,有些朋友可能會說你這麼說的意思是經過數據捲來實現唄,可我都不知道什麼是數據卷,怎麼知道它好用了?那麼接下來咱們就開始來介紹數據卷。bash
二. 什麼是數據卷網絡
數據卷就是容器內部的數據目錄直接映射到宿主機上的目錄上,不管在宿主機仍是容器內對數據的修改在另一方都是可見的。運維
三.數據卷的使用測試
3.1命令的使用ui
咱們仍是經過前面篇章中使用的centos鏡像來說解,其實也就一個命令,咱們的工做也就是圍繞着該命令來說解:docker run -it -v /dataVolumn:/containerDataVolumn centosspa
至於其餘的命令筆者在這裏不做過多的解釋,只解釋一下 -v /dataVolumn:/containerDataVolumn 這個命令的意思,-v是綁定將容器中的目錄掛載到宿主機的目錄上,/dataVolumn:/containerDataVolumn中冒號前的路徑是指自動在宿主機上建立的目錄名(不用咱們手動去建立),冒號後的路徑是指在容器中自動建立的目錄名。日誌
3.2 數據卷的建立與測試code
咱們前面提到過「論在宿主機仍是容器內對數據的修改在另一方都是可見的」,那麼本小節咱們回來測試這個問題。
A.咱們在容器中 /containerDataVolumn 目錄下建立一個container.txt文件,並寫入內容,命令:echo "hello world" > container.txt
在宿主機的 /dataVolumn目錄下會查看到有container.txt文件,並查看內容,以下圖所示:
B.在宿主機的 /dataVolumn目錄下新建 host.txt文件,並寫入內容,命令爲:echo "welcome" > host.txt
在容器的/containerDataVolumn目錄下會看到host.txt文件,並查看內容,以下圖所示:
C.刪除掉容器,查看宿主機 /dataVolumn目錄,文件並無丟失
D.咱們能夠經過 docker inspect 容器ID 命令查看容器的信息,其中hostConfig.binds能夠查看到綁定信息,以下圖所示:
3.3 數據卷的其餘建立方式
經過上面的方式建立數據卷的時候,咱們每次在運行鏡像的時候都須要去指定宿主機目錄和容器目錄,不便於維護與遷移,給你們舉個例子:例如咱們的日誌文件是存放在容器中的 /cloud-project/logs目錄下,並且在項目的配置文件中也是指定到該目錄下,對應到咱們的宿主機是/mycloud-project/logs目錄,若是說因爲項目發佈啓動的時候,運維人員寫錯了目錄名,那將是很大的問題。因此咱們在生成鏡像文件的時候就指定數據卷的目錄豈不是更好。
具體操做是,咱們根據Dockerfile目錄中經過VOLUMN指定數據卷的位置,至於什麼是Dockerfile,在後續的篇章中筆者將會詳細會你們講解,固然讀者也能夠本身去查看其餘的網絡上優秀的文章,由於本篇博文並非講解Dockerfile。
a. 新建一個空的目錄:mkdir my-dockerfile
b.新建Dockerfile文件
c.在Dockerfile中添加以下內容:
FROM centos VOLUMN ["/containerDataVolumn"]
CMD /bin/bash
d.執行命令 docker build -t mycentos:me . 生成名爲mycentos,tag爲me的新的鏡像文件。注意:最後的一個點不能省略,它不是結束的句號(筆者在這裏栽了很大的跟頭)!!!
e. 根據mycentos:me這個鏡像啓動一個容器,觀察根目錄下會生成 containerDataVolumn文件夾,以下圖所示:
f. 那麼如何查看,容器中的數據卷目錄對應的宿主機的目錄呢?上一小節咱們講過,能夠經過 docker inspect 容器ID 命令查看,結果以下圖所示: