數據管理
容器中的管理數據主要有兩種方式:
- 數據卷:容器內數據直接映射到本地主機環境。
- 數據卷容器:使用特定容器維護數據卷。
數據卷
數據卷是一個可供容器使用的特殊目錄,它將主機操作系統目錄直接映射進容器,類似於Linux中的mount行爲。
數據卷提供的特性:
- 數據卷可以在容器之間共享和重用,容器間傳遞數據將變得高效與方便。
- 對數據卷內數據的修改會立馬生效,無論是容器內操作還是本地操作。
- 對數據卷的更新不會影響鏡像,解耦開應用和數據。
- 數據卷會一直存在,直到沒有容器使用,可以安全地卸載它。
操作數據卷常用命令
docker提供volume子命令來管理數據卷。
- 創建一個本地數據卷,名字叫test
docker volume create -d local test
可以在本地/var/lib/docker/volumes查看創建的數據卷
- 查看數據卷詳細信息
docker volume inspect (數據卷名稱/id)
- 列出已有數據卷
docker volume ls
- 清理無用數據卷
docker volume prune
- 刪除數據卷
docker volume rm (數據卷名稱/id)
默認情況下,刪除容器時不會刪除數據卷,如果需要在刪除容器的同時移除數據卷。可以在刪除容器的時候使用 docker rm -v 這個命令。
- 啓動一個掛載數據卷的容器
使用-v指令可以指定掛載一個本地的已有目錄映射到容器中去作爲數據卷
$ docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py
-v指令語法解析:-v [HOST-DIR]:CONTAINER-DIR[:OPTIONS] 表示將本地HOST-DIR目錄掛載到容器內的CONTAINER-DIR目錄,OPTIONS表示數據卷屬性,默認是可讀寫(rw)。
綁定數據卷
在創建容器時,將主機本地的任意路徑掛載到容器內作爲數據卷,這種形式創建的數據卷稱爲綁定數據卷。
在用docker run命令的時候,可以使用-mount選項來使用數據卷。
-mount選項支持三種類型的數據卷,包括:
- volume:普通數據卷,映射到主機/var/lib/docker/volumes路徑下;
- bind:綁定數據卷,映射到主機指定路徑下;
- tmpfs:臨時數據卷,只存在於內存中。
例子:
使用training/webapp鏡像創建一個web容器,並創建一個數據卷掛載到容器的/opt/weball目錄下:
docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp trainging/webapp python app.py
上述命令等價於使用舊的-v標記可以在容器內創建一個數據卷:
docker run -d -P --name web -v /webapp:/opt/webapp trainging/webapp python app.py
–mount和-v指令的區別是:以前使用 -v 參數時如果本地目錄不存在 Docker 會自動爲你創建一個文件夾,現在使用 --mount 參數時如果本地目錄不存在,Docker 會報錯。
Docker掛載數據卷的默認權限是讀寫(rw),用戶可以通過ro指定爲只讀:
docker run -d -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp:ro trainging/webapp python app.py
加了:ro後,容器內對所掛載數據卷內的數據就無法修改了。
注意:本地目錄的路徑必須是絕對路徑,容器內路徑可以爲相對路徑。
推薦直接掛載文件所在的目錄到容器內,而不是直接掛載一個文件到容器。
數據卷容器
如果用戶在多個容器之間共享一些持續更新的數據,最簡單的方式是使用數據卷容器。數據卷容器也是一個容器,但是它的目的是專門提供數據卷給其他容器掛載。
首先,創建一個數據卷容器dbdata,並在其中創建一個數據卷掛載到容器內/dbdata
:
docker run -it -v /dbdata --name test ubuntu
然後可以在其他容器中使用--volumes-from
來掛載test容器中的數據卷.
例如創建db1和db2兩個容器,並從test容器掛載數據卷:
docker run -it --volumes-from test --name db1 ubuntu
docker run -it --volumes-from test --name db2 ubuntu
此時,容器db1和db2都掛載同一個數據捲到相同的/dbdata
目錄,三個容器任何一方在該目錄下的寫入,其他容器都可以看到。
注意:
- 如果刪除了掛載的容器,數據卷並不會被自動刪除。
- 使用–volumes-from參數所掛載數據卷的容器自身並不需要保持在運行狀態。