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 ubuntu
然後可以在其他容器使用--volumes-from來掛載dbdata容器中的資料卷。例如建立db1和db2兩個容器,並從dadata容器掛在資料卷。
docker run -it --volumes-from dbdata --name db1 ubuntu
docker 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
容器是廉價的,資料是寶貴的,根據資料卷和本地的掛載以及容器之間容器卷的共享實現資料備份和還原很方便(說的好違心),總之,資料備份和恢復是沒有問題了。
歡迎到微信裡去當吃瓜群眾