Docker 資料管理 - 資料卷
我們知道,Docker 提供了兩類資料管理的方式:
- 掛載宿主機目錄或檔案;
- 使用資料卷;
上節課我們學習了掛載宿主機目錄或檔案的資料管理方式。本節,我們介紹如何使用 Docker 資料卷。但是明明可以使用掛載宿主機目錄或檔案的方式,為什麼還要使用資料卷呢?
其實,使用資料卷的好處就在於:我們不必自己維護一個外部路徑掛載和儲存的關係,藉助Docker管理資料,並且通過語義化資料卷命名,更加方便直觀地使用它來資料共享。
1. 使用資料卷
在使用資料捲進行掛載時,我們只需指定容器中被掛載的目錄即可:
docker run -d -it --name busybox -v mydata:/tmp busybox
Tips:mydata 是 Docker 資料卷的名稱, 不是宿主機的目錄或檔案,為了避免混淆,指定當前路徑下的目錄或檔案掛載方式時,源地址需要使用絕對路徑。
資料卷掛載到容器後,我們可以通過 docker inspect busybox
看到容器中資料卷掛載的資訊。
其中,Type
代表這是掛載型別為volme
卷,Name
標識資料卷的名稱是我們之前指定的mydata
,Source
標明在要掛載的資料卷在宿主機的真實路徑為/var/lib/docker/volumes/mydata/_data
,其中/var/lib/docker/volumes/
是一個由Docker統一管理的存放路徑,Destination
/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 最佳實踐的要求,容器不應該向其儲存層內寫入任何資料,容器儲存層要保持無狀態化。所有的檔案寫入操作,都應該使用資料卷或者繫結掛載宿主目錄,在這些位置的讀寫會跳過容器儲存層,直接對宿主發生讀寫,其效能和穩定性更高。