Docker之快速搞定容器數(shù)據(jù)卷
前面我們介紹了鏡像和容器,通過(guò)鏡像我們可以啟動(dòng)多個(gè)容器,但是我們發(fā)現(xiàn)當(dāng)我們的容器停止獲取刪除后,我們?cè)谌萜髦械膽?yīng)用的一些數(shù)據(jù)也丟失了,這時(shí)為了解決容器的數(shù)據(jù)持久化,我們需要通過(guò)容器數(shù)據(jù)卷來(lái)解決這個(gè)問(wèn)題,本文我們就來(lái)介紹下容器數(shù)據(jù)卷。
1.是什么
docker容器產(chǎn)生的數(shù)據(jù),如果不通過(guò)docker commit生成新的鏡像,使得數(shù)據(jù)做為鏡像的一部分保存下來(lái),那么當(dāng)容器刪除后,數(shù)據(jù)自然也就沒(méi)有了。為了能保存數(shù)據(jù)在docker中我們使用卷。簡(jiǎn)單來(lái)說(shuō),容器卷就相當(dāng)于Redis中持久化方式的RDB和AOF。
2.解決了什么問(wèn)題
卷就是目錄或文件,存在于一個(gè)或多個(gè)容器中,由docker掛載到容器,但不屬于聯(lián)合文件系統(tǒng),因此能夠繞過(guò)Union File System提供一些用于持續(xù)存儲(chǔ)或共享數(shù)據(jù)的特性:
卷的設(shè)計(jì)目的就是數(shù)據(jù)的持久化,完全獨(dú)立于容器的生存周期,因此Docker不會(huì)在容器刪除時(shí)刪除其掛載的數(shù)據(jù)卷
特點(diǎn):
數(shù)據(jù)卷可在容器之間共享或重用數(shù)據(jù)
卷中的更改可以直接生效
數(shù)據(jù)卷中的更改不會(huì)包含在鏡像的更新中
數(shù)據(jù)卷的生命周期一直持續(xù)到?jīng)]有容器使用它為止
持久化,容器間繼承和共享數(shù)據(jù)
3.數(shù)據(jù)卷
首先我們來(lái)看看數(shù)據(jù)卷的使用方式
3.1 直接命令添加
3.1.1 掛載數(shù)據(jù)卷
添加的命令
docker run -it -v /宿主機(jī)絕對(duì)路徑:/容器內(nèi)目錄 鏡像名
1
我們發(fā)現(xiàn)執(zhí)行了該命令后,在宿主機(jī)中會(huì)添加mydatavolume文件夾,同時(shí)在容器中的根目錄中也有了datavolumecontainer文件夾。
這表示數(shù)據(jù)卷掛載成功了。同時(shí)我們也可以通過(guò)前面介紹的 docker inspect 容器名稱(chēng)ID來(lái)查看容器的 json數(shù)據(jù)
3.1.2 數(shù)據(jù)共享操作
數(shù)據(jù)卷掛載成功后,我們來(lái)看看容器和宿主機(jī)之間的數(shù)據(jù)共享,我們先在宿主機(jī)的mydatavolume目錄中創(chuàng)建一個(gè)文件。然后到容器的datavolumecontainer目錄中查看是否有相同的文件,然后我們?cè)俜催^(guò)來(lái)測(cè)試。
然后我們發(fā)現(xiàn)在容器中也有了相同的文件,而且內(nèi)容也一致。反過(guò)來(lái)
這就說(shuō)明容器和宿主機(jī)中的數(shù)據(jù)實(shí)現(xiàn)了數(shù)據(jù)共享
3.3.3 容器停止數(shù)據(jù)共享
接下來(lái)我們把容器停止掉,然后在宿主機(jī)中更新數(shù)據(jù),然后啟動(dòng)容器我們看看數(shù)據(jù)是否還能同步。
更新宿主機(jī)中的數(shù)據(jù)
啟動(dòng)原來(lái)的容器查看。
3.3.4 權(quán)限管理
前面我們介紹的共享的權(quán)限是在容器中具有讀寫(xiě)的權(quán)限。通過(guò)docker inspect 容器ID 我們也可以看到
我們可以修改該權(quán)限
docker run -it -v /宿主機(jī)絕對(duì)路徑:/容器內(nèi)目錄:ro 鏡像名
1
查看狀態(tài)
宿主機(jī)添加文件
容器中查看
創(chuàng)建文件或者修改文件會(huì)失敗
3.2 DockerFile添加
DockerFile下篇文章我們會(huì)專(zhuān)門(mén)來(lái)介紹,此處我們先來(lái)使用看看效果。
3.2.1 mydocker文件夾
在根目錄下創(chuàng)建mydocker文件夾
3.2.2 VOLUM指令
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
1
說(shuō)明:
出于可移植和分享的考慮,用-v 主機(jī)目錄:容器目錄這種方法不能夠直接在Dockerfile中實(shí)現(xiàn)。
由于宿主機(jī)目錄是依賴(lài)于特定宿主機(jī)的,并不能夠保證在所有的宿主機(jī)上都存在這樣的特定目錄。
3.2.3 File構(gòu)建
構(gòu)建File文件
# volume test FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,--------success1" CMD /bin/bash
1
2
3
4
5
6
7
8
9
3.2.4 build新鏡像
docker build -f /mydocker/dockerfile1 -t bobokaoya/centos .
1
3.2.5 run一個(gè)新容器
根據(jù)上面新創(chuàng)建的鏡像我們來(lái)run一個(gè)新容器
那么如此一來(lái),對(duì)應(yīng)的宿主機(jī)的映射地址在哪呢?docker inspect 容器ID來(lái)查看
容器的 共享目錄中創(chuàng)建 文件。
去宿主中的映射目錄中查看
搞定~
注意
Docker掛載主機(jī)目錄Docker訪(fǎng)問(wèn)出現(xiàn)cannot open directory .: Permission denied
解決辦法:在掛載目錄后多加一個(gè)–privileged=true參數(shù)即可
4.數(shù)據(jù)卷容器
命名的容器掛載數(shù)據(jù)卷,其它容器通過(guò)掛載這個(gè)(父容器)實(shí)現(xiàn)數(shù)據(jù)共享,掛載數(shù)據(jù)卷的容器,稱(chēng)之為數(shù)據(jù)卷容器,我們?cè)谇懊娴陌咐A(chǔ)上來(lái)介紹
4.1 啟動(dòng)一個(gè)父容器
docker run -it --name dc01 bobokaoya/centos
1
然后在共享目錄中創(chuàng)建文件
4.2 創(chuàng)建兩個(gè)子容器
創(chuàng)建dc02
docker run -it --name dc02 --volumes-from dc01 bobokaoya/centos
1
同時(shí)在dc02中修改了文件
我們?cè)趧?chuàng)建dc03容器,同時(shí)繼承dc01
docker run -it --name dc03 --volumes-from dc01 bobokaoya/centos
1
我們發(fā)現(xiàn)dc03中也看到dc02修改的數(shù)據(jù),說(shuō)明共享是成功的。
4.3 刪除dc01,查看dc02和dc03是否共享
我們停掉dc01并刪除,dc02和dc03之間的數(shù)據(jù)還是共享的
dc02修改,然后查看dc03
結(jié)論:容器之間配置信息的傳遞,數(shù)據(jù)卷的生命周期一直持續(xù)到?jīng)]有容器使用它為止.
Docker 容器
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。