生產環境中使用docker的過程當中,每每須要對數據進行持久化,或者須要在多個容器之間進行數據交換,這必然涉及容器的數據管理操做。容器中管理數據主要有兩種方式:node
①、數據卷(data volumes):容器內數據直接映射到本地主機環境;linux
②、數據卷容器)(data volumes containers):使用特定容器維護數據卷。docker
一、數據卷ubuntu
數據卷是一個可供容器使用的特殊目錄,它將主機操做系統目錄直接映射進容器,相似於linux中的mount(掛載)操做。數據卷能夠提供不少有用的特性,以下所示:安全
①、數據卷能夠在容器之間共享和重用,容器間傳遞數據將變得高效方便;bash
②、對數據卷內數據的修改會立刻生效,不管是容器內操做仍是本地操做;工具
③、對數據卷的更新不會影響鏡像,解耦了應用和數據;spa
④、卷會一直存在,直到沒有容器使用,能夠安全的卸載它。操作系統
(1)、在容器內建立一個數據卷3d
在用docker run命令的時候,使用-v標記能夠在容器內建立一個數據卷。屢次重複使用-v標記能夠建立多個數據卷。
下面使用鏡像ubuntu:14.04鏡像建立一個容器,並建立一個數據卷掛載到容器的/tmp目錄下:docker run -it -v [/宿主機絕對目錄:]/容器內目錄 鏡像名
docker run -it -v /tmp ubuntu:14.04
(2)、掛載一個主機目錄做爲數據卷(推薦)
使用-v標記也能夠指定掛載一個本地的已有目錄到容器中去做爲數據卷。
docker -it -v /home/yzh/data:/tmp ubuntu:14.04
docker掛載的數據卷的默認權限是讀寫(rw)權限,用戶能夠經過ro指定爲只讀:
docker run -it -v /home/yzh/data:/tmp:ro ubuntu:14.04
(3)、掛載一個本地主機文件做爲數據卷(不推薦)
-v標記也能夠從主機掛載單個文件到容器中做爲數據卷。
docker run -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
這樣就能夠記錄在容器內使用過的命令歷史了。
注意:若是直接掛載一個文件到容器,使用文件編輯工具,包括vi或sed --in-place的時候,可能會形成文件inode的改變,從docker1.1.0開始,這回致使保錯誤信息。因此推薦方式是直接掛載文件所在目錄。
二、數據卷容器
若是用戶須要在多個容器之間共享一些持續更新的數據,最簡單的方法是使用數據卷容器。數據卷容器也是一個容器,可是他的目的是專門用來提供數據卷供其餘容器掛載。首先,建立一個數據容器dbdata,並在其中建立一個數據卷掛載到/dbdata:
docker run -it -v /dbdata --name dbdata ubuntu:14.04
而後,能夠在其餘容器中使用--volumes-from來掛載dbdata容器中的數據卷,例如,建立db1和db2兩個容器,並從dbdata容器掛載數據卷:
docker run -it --volumes-from dbdata --name db1 ubuntu:14.04 docker run -it --volumes-from dbdata --name db2 ubuntu:14.04
此時,容器db1和容器db2都掛載同一個數據捲到相同的/dbdata目錄。三個容器任何一方在該目錄下面的寫入,其餘容器都能看到。
例如,在db2容器中建立一個1.txt文件,並寫入數據:
在其餘容器中都能看到。
能夠屢次使用--volumes-from參數來從多個容器掛載多個多個數據卷。還能夠從其餘已經掛載了容器卷的容器來掛載數據卷。
docker run -it --volumes-from db1 --name db3 ubuntu:14.04
提示:使用--volumes-from參數所掛載的數據卷的容器,自身並不須要保持在運行狀態。
若是刪除了掛載的容器(包括dbdata、db一、db2),數據卷並不會自動刪除。若是要刪除一個數據卷,必須在刪除最後一個還掛載這他的容器時顯示使用docker rm -v命令來同時刪除關聯的容器。
三、利用數據卷容器來遷移數據
能夠利用數據卷容器對其中的數據捲進行備份、恢復,以實現數據的遷移。
(1)、備份
docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu:14.04 tar cvf /backup/backup.tar /dbdata
參數解析:
首先利用ubuntu鏡像建立了一個容器worker(也就是說,使用該命令會自動建立一個名稱爲worker的容器),使用--volumes-from dbdata參數來讓worker掛載dbdata容器的數據卷(即dbdata數據卷);使用-v $(pwd):/backup參數來掛載本地的當前目錄到worker容器的backup目錄。worker容器啓動後,使用了tar cvf /backup/backup.tar /dbdata命令來將/dbdata下內容備份爲容器內的/backup/backup.tar,即宿主機當前目錄下的backup.tar。
補充:$(pwd)是docker支持的指定當前目錄的方法,瞭解linux基本命令的會發現,linux查看當前目錄就是pwd命令。
(2)、恢復
若是要將 數據恢復到一個容器中,能夠按照下面的步驟操做。
首先,建立一個帶有空數據卷的容器db3。
docker run -itd -v /dbdata --name db3 ubuntu:14.04 /bin/bash
而後,建立另外一個容器,掛載db3容器卷中的數據卷,並使用untar解壓備份文件到掛載的容器卷中。
docker run --volumes-from db3 -v $(pwd):/backup ubuntu:14.04 tar xvf /backup/backup.tar