容器中的管理數(shù)據(jù)有兩種方式:
- 數(shù)據(jù)卷(Data Volumes):容器內(nèi)數(shù)據(jù)直接映射到本地主機(jī)環(huán)境
- 數(shù)據(jù)卷容器(Data Volume Containers):使用特定容器維護(hù)數(shù)據(jù)卷
本文將首先介紹如何在容器內(nèi)創(chuàng)建數(shù)據(jù)卷,并且把本地目錄或文件掛載到容器內(nèi)的數(shù)據(jù)卷中酒朵。接下來五垮,介紹如何使用數(shù)據(jù)卷容器在容器和主機(jī)、容器和容器之間共享數(shù)據(jù)第煮,并實(shí)現(xiàn)數(shù)據(jù)的備份和恢復(fù)解幼。
1. 數(shù)據(jù)卷
數(shù)據(jù)卷(Data Volumes)是一個(gè)可供容器使用的特殊目錄,它將主機(jī)操作系統(tǒng)目錄直接映射進(jìn)容器包警,類似于 Linux 中的 mount 行為撵摆。
數(shù)據(jù)卷的特性有:
- 數(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.1 創(chuàng)建普通數(shù)據(jù)卷
例子為 docker volume create -d local test
會(huì)在 /var/lib/docker/volumes 路徑下創(chuàng)建新的數(shù)據(jù)卷 test鲫剿。
docker volume 的其他子命令還有 inspect (查看詳細(xì)信息)、ls (列出已有數(shù)據(jù)卷)稻轨、prune (清理無用數(shù)據(jù)卷) 灵莲、rm (刪除數(shù)據(jù)卷) 等,讀者可以自行實(shí)踐澄者。
1.2 綁定數(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
上述命令的舊形式是:
docker run -d -P --name=web -v /webapp:/opt/webapp training/webapp python app.py
如果要設(shè)置容器對(duì)數(shù)據(jù)卷的權(quán)限是只讀逆屡,可以通過 ro 指定為只讀:
docker run -d -P --name=web -v /webapp:/opt/webapp:ro training/webapp python app.py
如果直接掛載一個(gè)文件到容器內(nèi)圾旨,那么修改文件會(huì)導(dǎo)致報(bào)錯(cuò)誤信息。應(yīng)該掛載整個(gè)目錄到容器內(nèi)魏蔗。
2. 數(shù)據(jù)卷容器
如果要在多個(gè)數(shù)據(jù)卷之間共享一些持續(xù)更新的數(shù)據(jù)砍的,最簡(jiǎn)單的方式是使用數(shù)據(jù)卷容器。共享的方式是在 docker [container] run
命令中使用 --volumes-from 參數(shù)指定掛載的數(shù)據(jù)卷莺治。例如:
docker run -it -v /dbdata --name=dbdata ubuntu
root@38169762fbe4:/# docker run -it --volumes-from dbdata --name=db1 ubuntu
bash: docker: command not found
root@38169762fbe4:/# ls
bin boot dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@38169762fbe4:/# cd dbdata/
root@38169762fbe4:/dbdata# ls
root@38169762fbe4:/dbdata# touch db1
root@38169762fbe4:/dbdata# ls
db1
root@38169762fbe4:/dbdata#
PS C:\Users\劉躍群> docker run -it --volumes-from dbdata --name bd2 ubuntu
root@14f22d2668b6:/# ls
bin boot dbdata dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@14f22d2668b6:/# cd dbdata/
root@14f22d2668b6:/dbdata# ls
db1
在這個(gè)例子中廓鞠,創(chuàng)建了數(shù)據(jù)卷 dbdata 容器掛載了綁定數(shù)據(jù)卷 /webapp,其他兩個(gè)容器 db1, db2 共享了這個(gè)數(shù)據(jù)卷谣旁,并在 db1 容器中創(chuàng)建了 db1 文件床佳,在 db2 容器中看到了這個(gè)文件。
3. 利用數(shù)據(jù)卷容器來遷移數(shù)據(jù)
3.1 備份
例子:docker run --volumes-from dbdata -v $(pwd):/backup --name=worker ubuntu tar cvf /backup/backup.tar /dbdata
在這里例子中榄审,
- 利用了 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拷获。
3.2 恢復(fù)
恢復(fù)的思路與備份相反篮撑,還是創(chuàng)建一個(gè)執(zhí)行恢復(fù)操作的容器,同時(shí)掛載要恢復(fù)數(shù)據(jù)的數(shù)據(jù)卷和有數(shù)據(jù)的數(shù)據(jù)卷匆瓜,然后把備份內(nèi)容恢復(fù)到要恢復(fù)數(shù)據(jù)的數(shù)據(jù)卷即可。