docker數(shù)據(jù)管理

容器中的管理數(shù)據(jù)主要有兩種方式:

數(shù)據(jù)卷(Data Volumes):容器內(nèi)數(shù)據(jù)直接映射到本地主機(jī)環(huán)境;如何在容器內(nèi)創(chuàng)建數(shù)據(jù)卷,并且把本地的目錄或文件掛載到容器內(nèi)的數(shù)據(jù)卷中。

數(shù)據(jù)卷容器(Data Volume Containers):使用特定容器維護(hù)數(shù)據(jù)卷。如何使用數(shù)據(jù)卷容器在容器和主機(jī)、容器和容器之間共享數(shù)據(jù),并實(shí)現(xiàn)數(shù)據(jù)的備份和恢復(fù)。


數(shù)據(jù)卷存在于宿主機(jī)中,獨(dú)立于容器,和容器的生命周期是分離的,數(shù)據(jù)卷存在于宿主機(jī)的文件系統(tǒng)中,數(shù)據(jù)卷可以目錄也可以是文件,容器可以利用數(shù)據(jù)卷與宿主機(jī)進(jìn)行數(shù)據(jù)共享,實(shí)現(xiàn)了容器間的數(shù)據(jù)共享和交換。



數(shù)據(jù)卷可以提供很多有用的特性,類似于Linux 中的mount 行:

數(shù)據(jù)卷可以在容器之間共事和重用,容器間傳遞數(shù)據(jù)將變得高效與方便;

對(duì)數(shù)據(jù)卷內(nèi)數(shù)據(jù)的修改會(huì)立馬生效,無論是容器內(nèi)操作還是本地操作;

對(duì)數(shù)據(jù)卷的更新不會(huì)影響鏡像,解摘開應(yīng)用和數(shù)據(jù);

卷會(huì)一直存在,直到?jīng)]有容器使用,可以安全地卸載它。


1. 創(chuàng)建數(shù)據(jù)卷

$ docker volume create -d local test

test

此時(shí),查看/var/lib/docker/volumes 路徑下(宿主機(jī)路徑),會(huì)發(fā)現(xiàn)所創(chuàng)建的數(shù)據(jù)卷位置:

$ ls -1 /var/lib/docker/volumes

drwxr- xr-x 3 root root 4096 May 22 06:02 test

除了create 子命令外, docker volume 還支持inspect (查看詳細(xì)信息)、ls (列

出已有數(shù)據(jù)卷)、prune (清理無用數(shù)據(jù)卷)、rm (刪除數(shù)據(jù)卷)等,讀者可以自行實(shí)踐。


2 綁定數(shù)據(jù)卷

除了使用volume子命令來管理數(shù)據(jù)卷外,還可以在創(chuàng)建容器時(shí)將主機(jī)本地的任意路徑

掛載到容器內(nèi)作為數(shù)據(jù)卷,這種形式創(chuàng)建的數(shù)據(jù)卷稱為綁定數(shù)據(jù)卷。

在用docker [container] run命令的時(shí)候,可以使用 -mount 選項(xiàng)來使用數(shù)據(jù)卷。

-mount 選項(xiàng)支持三種類型的數(shù)據(jù)卷,包括:

volume : 普通數(shù)據(jù)卷,映射到主機(jī)/var/lib/docker/volumes 路徑下;

bind :綁定數(shù)據(jù)卷,映射到主機(jī)指定路徑下;

tmpfs :臨時(shí)數(shù)據(jù)卷,只存在于內(nèi)存中。

下面使用training/webapp 鏡像創(chuàng)建一個(gè)Web 容器,并創(chuàng)建一個(gè)數(shù)據(jù)卷掛載到容器的/opt/webapp 目錄:

$ docker run d P -name web --mount type=bind,source=/webapp,destination=/opt/

webapp training/webapp python app.py

上述命令等同于使用舊的 -v 標(biāo)記可以在容器內(nèi)創(chuàng)建一個(gè)數(shù)據(jù)卷:

$ docker run - d - P --name web -v /webapp:/opt/webapp training/webapp python app.py

這個(gè)功能在進(jìn)行應(yīng)用測(cè)試的時(shí)候十分方便,比如用戶可以放置一些程序或數(shù)據(jù)到本地目錄中實(shí)時(shí)進(jìn)行更新,然后在容器內(nèi)運(yùn)行和使用。另外,本地目錄的路徑必須是絕對(duì)路徑,容器內(nèi)路徑可以為相對(duì)路徑。如果目錄不存

在,Docker 會(huì)自動(dòng)創(chuàng)建。

Docker 掛載數(shù)據(jù)卷的默認(rèn)權(quán)限是讀寫( rw ) ,用戶也可以通過ro 指定為只讀:

$ docker run ?-d -P --name web -v /webapp: /opt/webapp:rotraining/webapp python app.py

容器內(nèi)的目錄會(huì)被覆蓋,如果之前不是空目錄,將會(huì)丟失容器內(nèi)數(shù)據(jù)。



3.數(shù)據(jù)卷容器

首先,創(chuàng)建一個(gè)數(shù)據(jù)卷容器dbdata , 并在其中創(chuàng)建一個(gè)數(shù)據(jù)卷掛載到/dbdata :

$ docker run it -v /dbdata --name dbdata ubuntu

root@3ed94f279b6f:/#

查看/dbdata 目錄:

root@3 ed94f279b6f:/# ls

b工n bootdbdatadev etc home lib lib64 media mnt opt proc root run

sbin srv sys tmp usr var

然后,可以在其他容器中使用-- volumes-from 來掛載dbdata 容器中的數(shù)據(jù)卷,例

如創(chuàng)建dbl 和db2 兩個(gè)容器,并從dbdata 容器掛載數(shù)據(jù)卷:

$ docker run -it --volumes-from dbdata --name dbl ubuntu

$ docker run -it --volumes-from dbdata --name db2 ubuntu

此時(shí), 容器dbl 和db2 都掛載同一個(gè)數(shù)據(jù)卷到相同的 /dbdata 目錄,三個(gè)容器任何一方在該目錄下的寫人,其他容器都可以看到。

如果刪除了掛載的容器(包括dbdata 、db 工和db2 ),數(shù)據(jù)卷并不會(huì)被自動(dòng)刪除。如果要?jiǎng)h除一個(gè)數(shù)據(jù)卷,必須在刪除最后一個(gè)還掛載著它的容器時(shí)顯式使用docker rm -v 命令來指定同時(shí)刪除關(guān)聯(lián)的容器。


4.利用數(shù)據(jù)卷容器來遷移數(shù)據(jù)

可以利用數(shù)據(jù)卷容器對(duì)其中的數(shù)據(jù)卷進(jìn)行備份、恢復(fù),以實(shí)現(xiàn)數(shù)據(jù)的遷移。

備份

使用下面的命令來備份dbdata 數(shù)據(jù)卷容器內(nèi)的數(shù)據(jù)卷:

$ docker run --volumes-from dbdata -v $ (pwd):/backup --name worker ubuntu tar

cvf /backup/backup.tar /dbdata

這個(gè)命令稍微有點(diǎn)復(fù)雜,具體分析下。

首先利用ubuntu 鏡像創(chuàng)建了一個(gè)容器worker 。使用--volumes-from dbdata 參數(shù)來讓worker 容器掛載dbdata 容器的數(shù)據(jù)卷( 即dbdata 數(shù)據(jù)卷);使用 -v $ (pwd):/backup參數(shù)來掛載本地的當(dāng)前目錄到worker 容器的/backup 目錄。worker 容器啟動(dòng)后,使用tar cvf /backup/backup.tar /dbdata 命令將/dbdata下內(nèi)容備份為容器內(nèi)的/backup/backup.tar ,即宿主主機(jī)當(dāng)前目錄下的backup.tar 。

要備份的數(shù)據(jù)容器的數(shù)據(jù),是備份在一個(gè)容器上,這個(gè)容器是掛載了要備份數(shù)據(jù)的容器。

恢復(fù)

如果要恢復(fù)數(shù)據(jù)到一個(gè)容器,可以按照下面的操作。

首先創(chuàng)建一個(gè)帶有數(shù)據(jù)卷的容器dbdata2:

$ docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

然后創(chuàng)建另一個(gè)新的容器,掛載dbda ta2 的容器,并使用untar 解壓備份文件到所掛

載的容器卷中:

$docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backu.tar


可以確認(rèn),容器 Volume 里的信息,并不會(huì)被 docker commit 提交掉;但這個(gè)掛載點(diǎn)目錄 /test 本身,則會(huì)出現(xiàn)在新的鏡像當(dāng)中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容