用戶在使用Docker的過程當中,每每須要能查看容器內應用產生的數據,或者須要把容器內的數據進行備份,甚至多個容器之間進行數據共享,這必然涉及到Docker的數據管理。node
容器中管理數據主要有兩種方式:git
數據卷:github
數據卷是一個可供容器使用的特殊目錄,他繞過文件系統,能夠提供不少有用的特性:docker
數據卷的使用,相似於Linux下對目錄或文件進行mount操做(掛載)。ubuntu
建立一個數據卷:bash
在使用docker run命令的時候,使用-v參數能夠在容器內創造一個數據卷,若是屢次使用-v參數能夠創造多個數據卷。spa
好比建立一個私有倉庫的時候:.net
docker run –d –p 5000:5000 —name registry –v /tmp/registry registry
建立一個/tmp/registry數據卷掛載到這個容器裏。seo
掛載一個主機目錄做爲數據卷:ip
使用-v參數也能夠制定掛載一個本地已有的目錄到容器中做爲數據卷,仍是舉建立私有倉庫的例子:
docker run –d –p 5000:5000 —name registry –v /data/registry:/tmp/registry registry
這樣即是把本地的/data/registry掛載到容器中做爲/tmp/registry。不過本地目錄必定要是絕對路徑,若是,目錄不存在Docker會自動建立。
另外,Docker掛在數據卷的默認權限是讀寫(rw),也能夠使用(ro)指定爲只讀權限:
docker run –d –p 5000:5000 —name registry –v /data/registry:/tmp/registry:ro registry
這樣容器就沒有寫入的權限了。
掛載一個主機文件做爲數據卷:
也是能夠把主機的一個文件掛載載到容器中做爲數據卷,使用命令和掛載目錄同樣。
不過直接掛載一個文件到容器中,又在外部編輯文件有可能致使文件inode信息的改變,從Docker1.1.0起,這回致使錯誤信息。
因此建議掛載目錄以達到訪問文件的目的。
數據卷容器:
若是須要在容器之間共享一些持續的更新的數據,最簡單的方式是使用數據卷容器。數據卷容器其實就是一個普通的容器,專門用它提供數據卷提供其餘容器掛載。使用方法以下:
首先,建立一個數據卷容器好比dbdata,並在其中建立一個數據卷並掛載到/dbdata。
docker run –it –v /dbdata —name dbdata ubuntu
而後能夠在其餘容器使用–volumes-from來掛載dbdata容器中的數據卷。例如建立db1和db2兩個容器,並從dadata容器掛載數據卷。
docker run –it —volumes–from dbdata —name db1 ubuntudocker run –it —volumes–from dbdata —name db2 ubuntu
完成後,db1和db2都掛載同一個數據捲到相同的/dbdata目錄。三個容器任何一方在該目錄下的寫入,其餘容器均可以看獲得。
能夠屢次使用–volumes-from從而從多個容器中得到多個數據卷,也能夠從其餘已經掛在容器卷的容器掛載數據卷。
使用–volumes-from參數所掛載的容器自身不須要保存在運行狀態。
刪除數據卷容器:
若是刪除了掛載的容器好比刪除了dbdata,db1,數據卷並不會被自動刪除,由於此時還有一個db2正在使用這個數據卷容器。
若是想刪除一個數據卷必須在刪除最後一個還掛載着它的容器時顯式使用docker rm-v命令來指定同時刪除關聯的容器。
利用數據卷容器遷移數據:
能夠利用數據卷容器對其中的數據捲進行備份、恢復,以實現數據的遷移。
備份:
使用下面的命令來備份dbdata數據卷容器內的數據卷:
docker run —volumes–from dbdata –v $(pwd):/backup —name worker ubuntu tar cvf /backup/backup.tar/dbdata
很長,慢慢分析,首先是要創建一個利用ubuntu鏡像容器,把本地當前路徑掛載到容器的/backup下,容器執行的命令是tar cvf /backup/backup.tar /dbdata,命令達到的效果就是吧/dbdata壓縮並保存到/backup下。
由於/backup是由本地當前路徑掛載的,所以就是保存到當前路徑下,從而實現備份的效果。
恢復:
若是要恢復數據到容器中,能夠按照下面的操做。
首先建立一個帶有數據卷的容器dbdata2:
docker run –v /dbdata —name dbdata2 ubuntu /bin/bash
而後建立另外一個新容器,掛載dbdata2容器,使用tar解壓備份文件到所掛載的容器卷中便可:
docker run —volumes–from dbdata2 –v $(pwd):/backup ubuntu tar xvf /backup/backup.tar
容器是廉價的,數據是寶貴的,根據數據卷和本地的掛載以及容器之間容器卷的共享實現數據備份和還原很方便(說的好違心),總之,數據備份和恢復是沒有問題了。
轉自:夢續代碼