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