Docker 數(shù)據(jù)管理 - 數(shù)據(jù)卷
我們知道,Docker 提供了兩類數(shù)據(jù)管理的方式:
- 掛載宿主機目錄或文件;
- 使用數(shù)據(jù)卷;
上節(jié)課我們學習了掛載宿主機目錄或文件的數(shù)據(jù)管理方式。本節(jié),我們介紹如何使用 Docker 數(shù)據(jù)卷。但是明明可以使用掛載宿主機目錄或文件的方式,為什么還要使用數(shù)據(jù)卷呢?
其實,使用數(shù)據(jù)卷的好處就在于:我們不必自己維護一個外部路徑掛載和存儲的關系,借助Docker管理數(shù)據(jù),并且通過語義化數(shù)據(jù)卷命名,更加方便直觀地使用它來數(shù)據(jù)共享。
1. 使用數(shù)據(jù)卷
在使用數(shù)據(jù)卷進行掛載時,我們只需指定容器中被掛載的目錄即可:
docker run -d -it --name busybox -v mydata:/tmp busybox
Tips:mydata 是 Docker 數(shù)據(jù)卷的名稱, 不是宿主機的目錄或文件,為了避免混淆,指定當前路徑下的目錄或文件掛載方式時,源地址需要使用絕對路徑。
數(shù)據(jù)卷掛載到容器后,我們可以通過 docker inspect busybox
看到容器中數(shù)據(jù)卷掛載的信息。
其中,Type
代表這是掛載類型為volme
卷,Name
標識數(shù)據(jù)卷的名稱是我們之前指定的mydata
,Source
標明在要掛載的數(shù)據(jù)卷在宿主機的真實路徑為/var/lib/docker/volumes/mydata/_data
,其中/var/lib/docker/volumes/
是一個由Docker統(tǒng)一管理的存放路徑,Destination
表示掛載到 busybox 容器內的路徑是/tmp
。
2. 共用數(shù)據(jù)卷
通過掛載相同的數(shù)據(jù)卷,讓多個容器能夠操作數(shù)據(jù)卷中的數(shù)據(jù),實現(xiàn)容器間的目錄共享。
數(shù)據(jù)卷的命名在 Docker 中是唯一的,讓多個容器掛載同一個數(shù)據(jù)卷, 只需要指定同一個數(shù)據(jù)卷名稱即可。
docker run -d -it --name busybox -v mydata:/tmp busybox
docker run -d -it --name busybox2 -v mydata:/tmp busybox
掛載數(shù)據(jù)卷時,如果數(shù)據(jù)卷不存在,Docker 會自動創(chuàng)建,如果同名數(shù)據(jù)卷已經(jīng)存在,則直接引用。
這里我們再補充一些常用的數(shù)據(jù)卷操作:
# 刪除數(shù)據(jù)卷
docker volume rm mydata
# 手動創(chuàng)建數(shù)據(jù)卷
docker volume create mydata
# 刪除那些沒有被容器引用的數(shù)據(jù)卷
docker volume prune
Tips:使用
docker rm -f busybox busybox2
移除不再使用的容器。
3. 對比兩種掛載方式
數(shù)據(jù)卷 是受控存儲,是由 Docker 引擎進行管理維護的。
使用卷,你可以不必處理 uid、SELinux 等各種權限問題,Docker 引擎在建立卷時會自動添加安全規(guī)則,以及根據(jù)掛載點調整權限。并且可以統(tǒng)一列表、添加、刪除。另外,除了本地卷外,還支持網(wǎng)絡卷、分布式卷。
掛載目錄屬于用戶自行維護,你就必須手動處理所有權限問題,好處就在于這種方式與宿主機的文件交換更方便一些。
4. 小結
數(shù)據(jù)卷實際上也是宿主機的一個目錄,這個目錄由 Docker 管理,利用數(shù)據(jù)卷可以方便地將數(shù)據(jù)在多個容器中共享。
按照 Docker 最佳實踐的要求,容器不應該向其存儲層內寫入任何數(shù)據(jù),容器存儲層要保持無狀態(tài)化。所有的文件寫入操作,都應該使用數(shù)據(jù)卷或者綁定掛載宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主發(fā)生讀寫,其性能和穩(wěn)定性更高。