Docker數據管理
用戶在使用Docker的過程中,往往需要能查看容器內應用產生的數據,或者需要把容器內的數據進行備份,甚至多個容器之間進行數據共享,這必然涉及到Docker的數據管理。
容器中管理數據主要有兩種方式:
- 數據卷(Data Volumes)
- 數據卷容器(Data Volumes Dontainers)
數據卷:
數據卷是一個可供容器使用的特殊目錄,他繞過文件系統,可以提供很多有用的特性:
- 數據卷可以在容器之間共享和重用
- 對數據卷的修改會立馬生效
- 對數據卷的更新,不會影響到鏡像
- 卷會一直存在,直到沒有容器使用
數據卷的使用,類似於Linux下對目錄或文件進行mount操作(掛載)。
創建一個數據卷:
在使用docker run命令的時候,使用-v參數可以在容器內創造一個數據卷,如果多次使用-v參數可以創造多個數據卷。
比如創建一個私有倉庫的時候:
docker run –d –p 5000:5000 —name registry –v /tmp/registry registry
創建一個/tmp/registry數據卷掛載到這個容器裏。
掛載一個主機目錄作爲數據卷:
使用-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 centos
然後可以在其他容器使用–volumes-from來掛載dbdata容器中的數據卷。例如創建db1和db2兩個容器,並從dadata容器掛載數據卷。
docker run –it —volumes–from dbdata —name db1 centosdocker run –it —volumes–from dbdata —name db2 centos
完成後,db1和db2都掛載同一個數據捲到相同的/dbdata目錄。三個容器任何一方在該目錄下的寫入,其他容器都可以看得到。
可以多次使用–volumes-from從而從多個容器中獲得多個數據卷,也可以從其他已經掛在容器卷的容器掛載數據卷。
使用–volumes-from參數所掛載的容器自身不需要保存在運行狀態。
刪除數據卷容器:
如果刪除了掛載的容器比如刪除了dbdata,db1,數據卷並不會被自動刪除,因爲此時還有一個db2正在使用這個數據卷容器。
如果想刪除一個數據卷必須在刪除最後一個還掛載着它的容器時顯式使用docker rm-v命令來指定同時刪除關聯的容器。
利用數據卷容器遷移數據:
可以利用數據卷容器對其中的數據捲進行備份、恢復,以實現數據的遷移。
備份:
使用下面的命令來備份dbdata數據卷容器內的數據卷:
docker run —volumes–from dbdata –v $(pwd):/backup —name worker centos tar cvf /backup/backup.tar/dbdata
很長,慢慢分析,首先是要建立一個利用centos鏡像容器,把本地當前路徑掛載到容器的/backup下,容器執行的命令是tar cvf /backup/backup.tar /dbdata,命令達到的效果就是吧/dbdata壓縮並保存到/backup下。
因爲/backup是由本地當前路徑掛載的,因此就是保存到當前路徑下,從而實現備份的效果。
恢復:
如果要恢復數據到容器中,可以按照下面的操作。
首先創建一個帶有數據卷的容器dbdata2:
docker run –v /dbdata —name dbdata2 centos /bin/bash
然後創建另一個新容器,掛載dbdata2容器,使用tar解壓備份文件到所掛載的容器卷中即可:
docker run —volumes–from dbdata2 –v $(pwd):/backup centos tar xvf /backup/backup.tar