跟我一起學docker(六)--數據管理
數據卷是一個可供容器使用的特殊目錄,有如下特性:
數據卷可以在容器之間共享和重用
數據卷修改會立即生效
數據卷的更新不會影響鏡像
如果有容器使用數據卷,該卷會一直存在
準備工作:
創建一個目錄,並在目錄裏面創建文件,文件內寫入內容。
在容器內創建數據卷
在使用docker run的命令時,使用 -v 標記可以在容器內創建一個數據卷,並且可以指定掛在一個本地已有的目錄到容器中作為數據卷:
docker run -d --name app1-it -v ${PWD}/webapp:/root/webapp ubuntu bash
通過目錄跟容器內建立了一層關系,數據卷發生變化後,容器內和容器外都會隨之發生改變。例如容器掛載一個文件,當容器掛了後,文件不會丟失。
註意:默認掛載的數據卷的權限是rw(可讀寫),如果要求ro(只讀),則需要加上對應的ro參數,命令可改為:
docker run -d --name app1-it -v ${PWD}/webapp:/root/webapp:ro ubuntu bash
下面我們一起來操作一下:
創建webapp目錄,在目錄下新建文件file,並在文件file中寫入“this is a file”。
echo ${PWD} 命令標識當前目錄。
創建啟動app1容器並掛載數據卷
進入容器找到root目錄可查看到已掛載的數據卷。
數據卷目錄與容器內目錄有映射關系,所以不管是在容器內部修改數據卷還是在外部修改數據卷,相對應的數據卷都會發生改變。
只讀的演示
2.數據卷容器
數據卷容器用於用戶需要在容器間共享一些持續更新的數據,數據卷容器專門提供數據卷供其它容器掛載使用。
Example:
創建數據卷容器db1
docker run -d --name db1 -v/dbdata -ti ubuntu bash
創建容器db2與db1共享dbdata的數據
docker run -d --name db2 --volumes-from db1 -ti ubuntu bash
在容器db1和容器db2任意一個容器修改dbdata的內容,在兩個容器內均生效
數據卷容器的刪除:
如果刪除了掛載的容器,數據卷並不會被自動刪除,如果要刪除一個數據卷,必須在刪除最後一個還掛載它的容器時顯示使用docker rm -v 命令指定同時刪除關聯的容器。在下圖可看到即使刪除aatest,bbtest中仍然有fileA文件。
在aatest中創建了文件fileA,bbtest可以看到fileA,刪除aatest容器後,fileA在bbtest中還可以看到。
可以利用數據卷容器對其中的數據卷進行備份、恢復,以實現數據的遷移。
備份:
使用下面的命令來備份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的數據卷;使用${pwd}:/backup參數來掛載本地目錄到worker容器的/backup目錄。
worker啟動後,使用tar命令將/dbdata下的內容備份為容器內的/backup/backup.tar。
創建dbdata數據卷容器並寫入文件:fileA、fileB、fileC
執行備份命令創建備份tar包:
恢復:
如果恢復數據到一個容器,可以參照下面的操作。首先創建一個帶有數據卷的容器dbdata2:
docker run -d -v /dbdata--name dbdata2 ubuntu /bin/bash
然後創建另一個新的容器,掛載dbdata2的容器,並使用tar命令解壓備份文件到掛載的容器卷中即可:
docker run --volumes-from dbdata2 -v ${pwd}:/backup ubuntu tar xvf /backup/backup.tar
跟我一起學docker(六)--數據管理