容器中的管理數(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ù)悬蔽,并實現(xiàn)數(shù)據(jù)的備份和恢復(fù)。
數(shù)據(jù)卷存在于宿主機(jī)中捉兴,獨(dú)立于容器蝎困,和容器的生命周期是分離的,數(shù)據(jù)卷存在于宿主機(jī)的文件系統(tǒng)中倍啥,數(shù)據(jù)卷可以目錄也可以是文件禾乘,容器可以利用數(shù)據(jù)卷與宿主機(jī)進(jìn)行數(shù)據(jù)共享,實現(xiàn)了容器間的數(shù)據(jù)共享和交換虽缕。
數(shù)據(jù)卷可以提供很多有用的特性始藕,類似于Linux 中的mount 行:
數(shù)據(jù)卷可以在容器之間共事和重用,容器間傳遞數(shù)據(jù)將變得高效與方便氮趋;
對數(shù)據(jù)卷內(nèi)數(shù)據(jù)的修改會立馬生效伍派,無論是容器內(nèi)操作還是本地操作;
對數(shù)據(jù)卷的更新不會影響鏡像剩胁,解摘開應(yīng)用和數(shù)據(jù)诉植;
卷會一直存在,直到?jīng)]有容器使用昵观,可以安全地卸載它晾腔。
1. 創(chuàng)建數(shù)據(jù)卷
$ docker volume create -d local test
test
此時,查看/var/lib/docker/volumes 路徑下(宿主機(jī)路徑)啊犬,會發(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ù)卷)等,讀者可以自行實踐。
2 綁定數(shù)據(jù)卷
除了使用volume子命令來管理數(shù)據(jù)卷外峻贮,還可以在創(chuàng)建容器時將主機(jī)本地的任意路徑
掛載到容器內(nèi)作為數(shù)據(jù)卷席怪,這種形式創(chuàng)建的數(shù)據(jù)卷稱為綁定數(shù)據(jù)卷。
在用docker [container] run命令的時候月洛,可以使用 -mount 選項來使用數(shù)據(jù)卷何恶。
-mount 選項支持三種類型的數(shù)據(jù)卷孽锥,包括:
volume : 普通數(shù)據(jù)卷嚼黔,映射到主機(jī)/var/lib/docker/volumes 路徑下;
bind :綁定數(shù)據(jù)卷惜辑,映射到主機(jī)指定路徑下唬涧;
tmpfs :臨時數(shù)據(jù)卷,只存在于內(nèi)存中盛撑。
下面使用training/webapp 鏡像創(chuàng)建一個Web 容器碎节,并創(chuàng)建一個數(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)建一個數(shù)據(jù)卷:
$ docker run - d - P --name web -v /webapp:/opt/webapp training/webapp python app.py
這個功能在進(jìn)行應(yīng)用測試的時候十分方便,比如用戶可以放置一些程序或數(shù)據(jù)到本地目錄中實時進(jìn)行更新抵卫,然后在容器內(nèi)運(yùn)行和使用狮荔。另外,本地目錄的路徑必須是絕對路徑介粘,容器內(nèi)路徑可以為相對路徑殖氏。如果目錄不存
在,Docker 會自動創(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)的目錄會被覆蓋,如果之前不是空目錄慨亲,將會丟失容器內(nèi)數(shù)據(jù)婚瓜。
3.數(shù)據(jù)卷容器
首先,創(chuàng)建一個數(shù)據(jù)卷容器dbdata 刑棵, 并在其中創(chuàng)建一個數(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 兩個容器蛉签,并從dbdata 容器掛載數(shù)據(jù)卷:
$ docker run -it --volumes-from dbdata --name dbl ubuntu
$ docker run -it --volumes-from dbdata --name db2 ubuntu
此時冈涧, 容器dbl 和db2 都掛載同一個數(shù)據(jù)卷到相同的 /dbdata 目錄,三個容器任何一方在該目錄下的寫人正蛙,其他容器都可以看到督弓。
如果刪除了掛載的容器(包括dbdata 、db 工和db2 )乒验,數(shù)據(jù)卷并不會被自動刪除愚隧。如果要刪除一個數(shù)據(jù)卷,必須在刪除最后一個還掛載著它的容器時顯式使用docker rm -v 命令來指定同時刪除關(guān)聯(lián)的容器。
4.利用數(shù)據(jù)卷容器來遷移數(shù)據(jù)
可以利用數(shù)據(jù)卷容器對其中的數(shù)據(jù)卷進(jìn)行備份狂塘、恢復(fù)录煤,以實現(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
這個命令稍微有點(diǎn)復(fù)雜荞胡,具體分析下妈踊。
首先利用ubuntu 鏡像創(chuàng)建了一個容器worker 。使用--volumes-from dbdata 參數(shù)來讓worker 容器掛載dbdata 容器的數(shù)據(jù)卷( 即dbdata 數(shù)據(jù)卷)泪漂;使用 -v $ (pwd):/backup參數(shù)來掛載本地的當(dāng)前目錄到worker 容器的/backup 目錄廊营。worker 容器啟動后,使用tar cvf /backup/backup.tar /dbdata 命令將/dbdata下內(nèi)容備份為容器內(nèi)的/backup/backup.tar 萝勤,即宿主主機(jī)當(dāng)前目錄下的backup.tar 露筒。
要備份的數(shù)據(jù)容器的數(shù)據(jù),是備份在一個容器上敌卓,這個容器是掛載了要備份數(shù)據(jù)的容器慎式。
恢復(fù)
如果要恢復(fù)數(shù)據(jù)到一個容器,可以按照下面的操作趟径。
首先創(chuàng)建一個帶有數(shù)據(jù)卷的容器dbdata2:
$ docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后創(chuàng)建另一個新的容器瘪吏,掛載dbda ta2 的容器,并使用untar 解壓備份文件到所掛
載的容器卷中:
$docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backu.tar
可以確認(rèn)蜗巧,容器 Volume 里的信息掌眠,并不會被 docker commit 提交掉;但這個掛載點(diǎn)目錄 /test 本身惧蛹,則會出現(xiàn)在新的鏡像當(dāng)中扇救。