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就留在了當前目錄。
Docker Volume