Docker數據管理
生產環境中使用Docker,往往需要對數據進行持久化,或者需要在多個容器之間進行數據共享,這必然涉及容器的數據管理操作。
容器中的管理數據主要有兩種方式:
- 數據卷:容器內數據直接映射到本地主機環境;
- 數據卷容器:使用特定容器維護數據卷;
數據卷
數據卷是一個可供容器使用的特殊目錄,它將主機操作系統目錄直接映射進容器,類似於Linux中的mount行爲。
數據卷可以提供很多有用的特性:
- 數據卷可以在容器之間共事和重用,容器間傳遞數據將變得高效與方便;
- 對數據卷內數據的修改會立馬生效,無論是容器內操作還是本地操作;
- 對數據卷的更新不會影響鏡像,解摘開應用和數據 ;
- 卷會一直存在 ,直到沒有容器使用,可以安全地卸載它;
1、創建數據卷
Docker提供了volume子命令來管理數據卷
例:快速在本地創建一個數據卷
除了create子命令外,docker volume還支持:
- inspect:查看詳細信息;
- ls:列出已有數據卷;
- prune:清理無用數據卷;
- rm:刪除數據卷;
2、綁定數據卷
除了使用volume子命令來管理數據卷外,還可以在創建容器時將主機本地的任意路徑掛載到容器內作爲數據卷,這種形式創建的數據捲成爲綁定數據卷。
在用docker [container] run命令的時候,可以使用-mount選項來使用數據卷。
-mount選項支持三種類型的數據卷,包括:
- volume:普通數據卷,映射到主機/var/lib/docker/volumes路徑下;
- bind:綁定數據卷,映射到主機指定路徑下;
- tmpfs:臨時數據卷,只存在於內存中;
例子可參考如下:
【注】本地目錄的路徑必須是絕對路徑,容器內路徑可以爲相對路徑。如果目錄不存在,Docker會自動創建。Docker掛載數據卷的默認權限是讀寫(rw)。
數據卷容器
如果用戶需要在多個容器之間共享一些持續更新的數據,最簡單的方式是使用數據卷容器。數據卷容器也是一個容器,但是它的目的是專門提供數據卷給其他容器掛載。
例:創建一個數據卷容器dbdata,並在其中創建一個數據卷掛載到/dbdata
然後,可以在其他容器中使用--volume-from來掛載dbdata容器中的數據卷,例如創建db1和db2兩個容器,並從dbdata容器掛載數據卷
這時,通過任意一個容器進入,對dbdata這個目錄的操作,其餘的容器均能夠看到。
【注】
- 使用--volumes-from參數所掛載數據卷的容器自身並不需要保持在運行狀態;
- 如果刪除了掛載的容器(包括dbdata、db1和db2),數據卷並不會被自動刪除。如果要刪除一個數據卷,必須在刪除最後一個還掛載這它的容器時顯示使用docker rm -v命令來指定同時刪除關聯的容器;
利用數據卷容器來遷移數據
可以利用數據卷容器對其中的數據捲進行備份、恢復,以實現數據的遷移。
1、備份
命令: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
然後創建另外一個新容器,掛載dbdata2的容器,並使用untar解壓備份文件到所掛載的容器卷中