Docker Volume

Docker Volume

Docker的文件系:Docker鏡像是由多個文件系統(只讀層)疊加而成.當我們啓動一個容器的時候,Docker會加載鏡像層並在其上添加一個讀寫層.如果運行中的容器修改了現有的一個已存在的文件,那該文件將會從讀寫層下的只讀層複製到讀寫層,該文件的只讀版本仍然存在,只是已經被讀寫層中該文件的副本所隱藏.當刪除Docker容器,並通過該鏡像重新啓動時,之前的更改將會丟失.在Docker中,只讀層以及在頂部的讀寫層的組合被稱爲Union FIle System(聯合文件系統).

爲了能夠保存(持久化)數據以及共享容器間的數據,Docker提出了Volume的概念.簡單來說,Volume就是目錄或者文件,它可以繞過默認的聯合文件系統,而以正常的文件或者目錄的形式存在於宿主機上.

爲什麼使用數據卷volume?

Docker的鏡像是由一系列的只讀層組合而來,當啓動一個容器的時候,Docker加載鏡像的所有隻讀層,並在最上層加入一個讀寫層。這個設計使得Docker可以提高鏡像構建、存儲和分發的效率,節省了時間和存儲空間,然而也存在如下問題。

   ```
(1)容器中的文件在宿主機上存在形式複雜,不能在宿主機上很方便的對容器中的文件進行訪問

    (2)多個容器之間的數據無法共享

    (3)當刪除容器時,容器產生的數據將丟失


    爲了解決這些問題,Docker引入了數據卷(volume)機制。volume是存在一個或多個容器中的特定文件或文件夾,這個目錄能夠獨立於聯合文件系統的形式在宿主機中存在,併爲數據的共享與持久提供一下便利。

    (1)volume在容器創建時就初始化,在容器運行時就可以使用其中的文件

    (2)volume能在不同的容器之間共享和重用

    (3)對volume中的數據的操作會馬上生效

   ```
   (4)對volume中數據操作不會影響到鏡像本身

   (5)volume的生存週期獨立於容器的生存週期,即使刪除容器,volume仍然會存在,沒有任何容器使用的volume也不會被Docker刪除

創建數據卷

綁定掛載卷
用戶同時指定容器中目錄與宿主機目錄路徑
 docker run命令使用-v選項即可使用Volume
 Docker-managed volume 
    • ~]# docker run -it -name bbox1 –v /data busybox 
        • ~]# docker inspect -f {{.Mounts}} bbox1 
            • 查看bbox1容器的卷、卷標識符及掛載的主機目錄
        • Bind-mount Volume 
           • ~]# docker run -it -v HOSTDIR:VOLUMEDIR --name bbox2 busybox 
             • ~]# docker inspect -f {{.Mounts}} bbox2

多個容器的卷使用同一個主機目錄

   • ~]# docker run –it --name c1 -v /docker/volumes/v1:/data busybox 
         • ~]# docker run –it --name c2 -v /docker/volumes/v1:/data busybox
         •複製使用其它容器的卷,爲docker run命令使用--volumes-from選項
   • ~]# docker run -it --name bbox1 -v /docker/volumes/v1:/data busybox 
         • ~]# docker run -it --name bbox2 --volumes-from bbox1 busybox
從宿主機掛載volume(-v /host-path:/container-path)
   將主機的文件或文件夾作爲volume掛載時,可以用多個 -v標籤爲容器添加多個volume,還可以使用:ro指定該volume爲只讀。注意:如果容器中指定的掛載目錄存在相同的文件時,會被宿主機覆蓋掉。用-v參數時,鏡像目錄下的任何文件都不會被複制到Volume中

     利用docker commit生成新鏡像,然後docker run -it 運行新鏡像,發現容器掛載目錄下沒有任何文件了。說明生成新鏡像時,是不保存掛載文件的。
 ### 共享volume/數據卷容器(--volumes-from)

      如果你有一些持續更新的數據需要在容器之間共享,最好創建數據卷容器。數據卷容器,其實就是一個正常的容器,專門用來提供數據卷供其它容器掛載的。

 

 # Volume 刪除和孤單 volume 清理
 1)docker rm -v 刪除容器。就是刪除容器時,加上-v
(2)docker run --rm .就是啓動容器的時候加上--rm,那麼當容器運行停止時會自動刪除容器以及容器所掛載的volume

備份、恢復或遷移volume

   上面有測試過,當使用docker commit等手段生成新鏡像,然後再啓動鏡像生成新容器時,原先volume目錄下的文件不見了,可以生成新鏡像時,並沒有把volume下的文件一起打包生成鏡像。

   volume作爲數據的載體,在很多情況下需要對其中的數據進行備份、遷移,或是從已有數據恢復。一個很容易想到的方法就是用docker inspect命令查找到volume對應宿主機上對應的那個目錄位置,然後複製其中內容或使用tar打包。當這些笨拙的做法並不值得推薦,因爲查找主機上文件夾後再操作容易出錯,也不適合腳本的自動化執行。

   備份volume可以使用以下方法

   docker run --rm --volumes-from dbdata -v $(pwd):/backup test/mycentos:v1.0 tar cvf /back/data.tar /data

這行指令啓動了一個臨時的容器,這個容器掛載了兩個volume,第一個volume與要備份的volume共享,第二個volume將宿主機的當前目錄(也可以絕對路徑)掛載到容器的/backup下。容器運行後將要備份的容器(/data)備份到/backup/data.tar,然後刪除容器,備份後的data.tar就留在了當前目錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章