1. 程式人生 > Docker入門教學 >Docker 資料管理 - 資料卷

Docker 資料管理 - 資料卷

我們知道,Docker 提供了兩類資料管理的方式:

  1. 掛載宿主機目錄或檔案;
  2. 使用資料卷;

上節課我們學習了掛載宿主機目錄或檔案的資料管理方式。本節,我們介紹如何使用 Docker 資料卷。但是明明可以使用掛載宿主機目錄或檔案的方式,為什麼還要使用資料卷呢?

其實,使用資料卷的好處就在於:我們不必自己維護一個外部路徑掛載和儲存的關係,藉助Docker管理資料,並且通過語義化資料卷命名,更加方便直觀地使用它來資料共享

1. 使用資料卷

在使用資料捲進行掛載時,我們只需指定容器中被掛載的目錄即可:

docker run -d -it --name busybox -v mydata:/tmp busybox

Tips:mydata 是 Docker 資料卷的名稱, 不是宿主機的目錄或檔案,為了避免混淆,指定當前路徑下的目錄或檔案掛載方式時,源地址需要使用絕對路徑。

資料卷掛載到容器後,我們可以通過 docker inspect busybox 看到容器中資料卷掛載的資訊。
圖片描述

資料卷示例

其中,Type代表這是掛載型別為volme卷,Name標識資料卷的名稱是我們之前指定的mydataSource標明在要掛載的資料卷在宿主機的真實路徑為/var/lib/docker/volumes/mydata/_data,其中/var/lib/docker/volumes/是一個由Docker統一管理的存放路徑,Destination

表示掛載到 busybox 容器內的路徑是/tmp

2. 共用資料卷

通過掛載相同的資料卷,讓多個容器能夠操作資料卷中的資料,實現容器間的目錄共享。

資料卷的命名在 Docker 中是唯一的,讓多個容器掛載同一個資料卷, 只需要指定同一個資料卷名稱即可。

docker run -d -it --name busybox -v mydata:/tmp busybox
docker run -d -it --name busybox2 -v mydata:/tmp busybox

掛載資料卷時,如果資料卷不存在,Docker 會自動建立,如果同名數據卷已經存在,則直接引用。

這裡我們再補充一些常用的資料卷操作:

# 刪除資料卷
docker volume rm mydata
# 手動建立資料卷
docker volume create mydata
# 刪除那些沒有被容器引用的資料卷
docker volume prune

Tips:使用 docker rm -f busybox busybox2 移除不再使用的容器。

3. 對比兩種掛載方式

資料卷 是受控儲存,是由 Docker 引擎進行管理維護的。

使用卷,你可以不必處理 uid、SELinux 等各種許可權問題,Docker 引擎在建立卷時會自動新增安全規則,以及根據掛載點調整許可權。並且可以統一列表、新增、刪除。另外,除了本地卷外,還支援網路卷、分散式卷。

掛載目錄屬於使用者自行維護,你就必須手動處理所有許可權問題,好處就在於這種方式與宿主機的檔案交換更方便一些。

4. 小結

資料卷實際上也是宿主機的一個目錄,這個目錄由 Docker 管理,利用資料卷可以方便地將資料在多個容器中共享。

按照 Docker 最佳實踐的要求,容器不應該向其儲存層內寫入任何資料,容器儲存層要保持無狀態化。所有的檔案寫入操作,都應該使用資料卷或者繫結掛載宿主目錄,在這些位置的讀寫會跳過容器儲存層,直接對宿主發生讀寫,其效能和穩定性更高。