docker管理數(shù)據(jù)有兩種方式: storage driver 和 Data Volume。
storage driver 顧名思義是存儲驅(qū)動管理的,不同的系統(tǒng)有不同的driver ,我們除了使用系統(tǒng)自身默認(rèn)的storage driver,也可以使用第三方廠商的storage driver。不過一般而言,我們習(xí)慣使用系統(tǒng)自身默認(rèn)的storage driver,例如本文所使用的是centos7自身默認(rèn)的storage driver:devicemapper。
容器最上面的是一個可寫的容器元數(shù)據(jù)層,下面由若干只讀的鏡像層組成,容器的數(shù)據(jù)就存放在容器元數(shù)據(jù)層和鏡像層中。為什么會這樣進行分層結(jié)構(gòu)呢?
大家有沒有學(xué)習(xí)過PS,分層結(jié)構(gòu)相當(dāng)于PS的圖層,devicemapper將多層數(shù)據(jù)堆疊呈現(xiàn)給用戶一個虛擬的操作系統(tǒng),正如同PS將圖層合并在一起給用戶呈現(xiàn)一張絢麗的海報。這樣以后容器的創(chuàng)建、共享以及分發(fā)變得非常高效。
[root@cgls ~]# docker info
devicemapper 模擬出來的操作系統(tǒng)可以滿足我們的日常操作,探究其原理發(fā)現(xiàn)devicemapper 是直接操作容器元數(shù)據(jù)層,新錄入數(shù)據(jù)在容器元數(shù)據(jù)層,修改現(xiàn)有數(shù)據(jù)也是先將鏡像層將數(shù)據(jù)復(fù)制到容器層,然后在容器層中修改,鏡像層保持不變。設(shè)想一下,經(jīng)過長時間運行,這個容器會越來越大,之后再去遷移容器變得非常困難。
解決方案
docker 數(shù)據(jù)持久化:Data Volume
Data Volume簡單點說,就是將宿主機上的目錄掛載給容器使用,將容器內(nèi)一些可能會動態(tài)增加的目錄,放到宿主機目錄上,這樣容器不會變的越來越大。簡而言之:無狀態(tài)的數(shù)據(jù)devicemapper管理,持續(xù)化數(shù)據(jù)Data Volume管理。
模擬一個真實的容器:web服務(wù)容器。
web服務(wù)配置文件
web服務(wù)日志文件
web服務(wù)數(shù)據(jù)包(html頁面和images)文件
web服務(wù)數(shù)據(jù)庫文件
web服務(wù)容器的4類文件中,配置文件是無狀態(tài)的數(shù)據(jù),我們使用devicemapper管理;其他3類文件,都是未來可能需要修改的文件,我們使用Data Volume管理。
好的接下來,我們學(xué)習(xí)一下Data Volume的使用。
bind mount:直接將宿主機的/cgls掛載到容器的/cgls
docker run -itd -v /cgls -h cgls --name cgls centos
docker managed volum:直接將容器的/cgls掛載到/var/lib/docker/volumes/<id>/_data/
以上掛載的都是目錄,如果是文件,只能選擇bind mount。
注意,如果要掛載文件,文件必須在宿主機上是存在的,不然默認(rèn)為目錄。
docker run -itd -v /cgls.txt:/cgls.txt -h cgls --name cgls centos
bind mount與docker managed volum區(qū)別:
bind mount必須指明mount源,docker managed volum不需要指明mount源;
bind mount指明mount源,宿主機的目錄會覆蓋容器的目錄,原有數(shù)據(jù)將被隱藏起來,
docker managed volum指向的是容器內(nèi)已有目錄,原有數(shù)據(jù)會被復(fù)制到 volume 中。
