內容提要
利用數據卷對數據進行持久化,備份,恢復,及多個容器數據共享,實現數據的遷移等。
數據管理的兩種方式:
- 數據卷(Data Volumes):容器內數據直接映射到本地主機環境;
- 數據卷容器(Data Volume Containers):使用特定容器維護數據卷。
數據卷
數據卷是一個可供容器使用的特殊目錄,它將主機操作系統目錄直接映射進容器,類似於 Linux中的mount操作。(就是將一個設備(U盤/SD卡等)掛接到一個已存在的目錄上。訪問這個目錄就是訪問該存儲設備)。
- 可以在容器之間共享和重用;
- 對數據卷內數據的修改會馬上生效,無論是容器內操作的還是容器操作的;
- 數據卷的操作不會影響鏡像,解耦應用和數據;
- 卷會一直存在直到沒有容器使用纔可卸載。
1.容器內創建數據卷
啓動容器時使用-v標記在容器內創建數據卷,多次使用可以創建多個數據卷。
使用training/webapp 鏡像創建一個 web容器,並創建一個數據卷掛載到容器的/webapp 目錄:
docker run -d -P --name web -v /webapp training/webapp python app.py
2.掛載主機目錄作爲數據卷(推薦)
使用-v參數也可以掛載本地已有的目錄到容器中作爲數據卷。
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
加載主機的/ src/webapp 目錄到容器的/ opt/webapp 目錄,本地目錄的路徑必須是絕對路徑,如果目錄不存在Docker會自動創建。
Docker 掛載數據卷的默認權限是讀寫(rw),用戶也可以通過 ro 指定爲
只讀:
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
3.掛載一個本地主機文件作爲數據卷(不推薦)
-v標記也可以從主機掛載單個文件到容器作爲數據卷
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
數據卷容器
數據卷容器也是一個容器,它的目的是用來提供數據卷供其他容器掛載。
1.創建數據卷容器dbdata,並創建一個數據卷掛載到/dbadata
docker run -it -v /dbdata --name dbdata ubuntu
2.在其他容器中使用–volumes-from 來掛載 dbdata容器中的數據卷,例如創建db1和db2兩個容器,並從dbdata 容器掛載數據卷
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 參數所掛載數據卷的容器自身並不需要保持在運行狀
態。
如果刪除了掛載的容器,數據卷不會自動刪除。必須刪除最後一個掛載它的容器時顯式使用docker rm-v 來指定同時刪除關聯的容器。
利用數據卷容器來遷移數據
1.備份
使用下面命令備份dbdata數據卷容器內的數據卷
docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
首先利用 ubuntu 鏡像創建了一個容器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。
2.數據恢復
如果要將數據恢復到一個容器,可以按照下面的步驟操作。首先創建一個帶有數據卷的容器dbdata2
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然後創建另一個新的容器,掛載dbdata2的容器,並解壓備份文件到所掛載的容器卷中
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar