Docker中数据管理
生活随笔
收集整理的這篇文章主要介紹了
Docker中数据管理
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Docker數(shù)據(jù)管理
- 生產(chǎn)環(huán)境中,對(duì)數(shù)據(jù)進(jìn)行持久化,或者需要在多個(gè)容器直接進(jìn)行數(shù)據(jù)共享,這必然涉及到容器的一些數(shù)據(jù)管理的操作。
- 容器中數(shù)據(jù)管理主要有兩種方式:
- 數(shù)據(jù)卷(Data Volumes):容器內(nèi)數(shù)據(jù)直接映射到本地的主機(jī)環(huán)境
- 數(shù)據(jù)卷容器(Data Volume Containers):使用特定的容器維護(hù)數(shù)據(jù)卷
數(shù)據(jù)卷
- 數(shù)據(jù)集是一個(gè)可停過容器使用的特殊的文件目錄,他將主機(jī)操作系統(tǒng)目錄直接映射進(jìn)容器,類似Linux中的mount操作。
- 數(shù)據(jù)卷提供很多有用的特性如下:
- 數(shù)據(jù)集可以在容器之間共享和重用,容器間傳遞數(shù)據(jù)將變得高效方便
- 對(duì)數(shù)據(jù)卷內(nèi)數(shù)據(jù)的修改會(huì)立刻生效,無(wú)論是容器內(nèi)部的操作還是本地文件之間修改
- 對(duì)書籍的更新不會(huì)影響鏡像,解耦了應(yīng)用和數(shù)據(jù)
- 數(shù)據(jù)卷會(huì)一直存在,直到?jīng)]有容器使用,可以安全的卸載它
- 如下使用案例
- 在Docker run命令中使用 -v參數(shù)標(biāo)記可以在容器內(nèi)創(chuàng)建一個(gè)數(shù)據(jù)卷。多次重復(fù)使用-v 標(biāo)記可以創(chuàng)建多個(gè)數(shù)據(jù)卷。
- 現(xiàn)在使用training/webapp 鏡像創(chuàng)建一個(gè)web容器,并創(chuàng)建一個(gè)數(shù)據(jù)卷掛載到容器的/webapp目錄:
- 如上命令,在本地鏡像倉(cāng)庫(kù)中沒有對(duì)應(yīng)鏡像時(shí)候,會(huì)先自動(dòng)下載
- -p 指定將容器服務(wù)暴露的端口,是自動(dòng)映射到本地主叫的臨時(shí)端口80
- -d 指定在后臺(tái)運(yùn)行
- –name 指定容器啟動(dòng)后的別名
- 使用-v標(biāo)記也可以指定掛載一個(gè)本地以已經(jīng)有的目錄到容器中去作為數(shù)據(jù)卷,如下命令(推薦此種方式)
- 以上命令中加載主機(jī)的/src/webapp目錄到容器的/opt/webapp目錄
- 這個(gè)功能在進(jìn)行測(cè)試的時(shí)候比較方便,比如我們可以將一些程序或者數(shù)據(jù)預(yù)先放到本地的目錄中,然后在容器中運(yùn)行和使用。另外,本地目錄的路徑必須是絕對(duì)路徑,如果目錄不存在,Docker會(huì)自動(dòng)創(chuàng)建。
- Docker掛載數(shù)據(jù)卷的默認(rèn)權(quán)限是讀寫(RW),我們可以通過ro指定位只讀:
- 如上命令,添加:ro后,容器內(nèi)部對(duì)所掛載的數(shù)據(jù)卷內(nèi)的數(shù)據(jù)就無(wú)法修改了。
- -v 標(biāo)記也可以從主機(jī)掛載單個(gè)文件到容器中作為數(shù)據(jù)卷(不推薦方式)。
- 如上就可以距離在容器輸入過的命令歷史
- 問題:如果直接掛載一個(gè)文件到容器,使用文件編輯工具,例如vi或者sed–in-place的時(shí)候,可能造成文件inode的改變,從Docker1.1.0開始,這回導(dǎo)致報(bào)錯(cuò)。所以推薦的方式是直接掛載文件所在目錄。
數(shù)據(jù)卷容器
- 現(xiàn)在我們需要在多個(gè)容器之間共享同一個(gè)持續(xù)更新的數(shù)據(jù),最簡(jiǎn)單的方式是使用數(shù)據(jù)卷容器。數(shù)據(jù)卷容器也是一個(gè)容器,他的功能是用來(lái)提供數(shù)據(jù)卷供其他容器掛載。
- 首先創(chuàng)建一個(gè)數(shù)據(jù)卷容器dbdata,并在其中創(chuàng)建一個(gè)數(shù)據(jù)卷掛載到/dbdata:
- 查看/dbdata目錄:
- 如上已經(jīng)有dbdata目錄,我們可以在其他容器中使用–volumes-form來(lái)掛載dbdata容器中的數(shù)據(jù)卷,例如創(chuàng)建db1,db2兩個(gè)容器,并從dbdata容器掛載數(shù)據(jù)卷:
- 此時(shí),容器db1和db2 都掛載同一個(gè)數(shù)據(jù)卷到相同的/dbdata目錄。三個(gè)容器任何一方在該目錄下的寫入,其他容器都可以看到。
- 示例:在dbdata容器中創(chuàng)建test文件
- 在db1 容器中查看其目錄下的dbdata文件中內(nèi)容:
- 我們也可以多次使用–volumes-from參數(shù)來(lái)從多個(gè)容器掛載多個(gè)數(shù)據(jù)卷。還可以從其他已經(jīng)掛載了容器卷的容器來(lái)掛載數(shù)據(jù)卷。
- 問題:
- 使用–volumes-from參數(shù)所掛載數(shù)據(jù)卷的容器自身并不需要保持在運(yùn)行狀態(tài)
- 如果刪除了掛載的容器,包括上面的dbdata, db1, db2,數(shù)據(jù)卷并不會(huì)被自動(dòng)刪除。如果要?jiǎng)h除一個(gè)數(shù)據(jù)卷,必須在刪除最后一個(gè)還掛載著他的容器時(shí)顯示的使用docker rm -v 命令指定同時(shí)刪除關(guān)聯(lián)的容器
- 使用數(shù)據(jù)卷容器可以讓用戶在容器之間自由的升級(jí)和移動(dòng)數(shù)據(jù)卷。
利用數(shù)據(jù)卷來(lái)遷移數(shù)據(jù)
- 可以利用數(shù)據(jù)卷容器對(duì)啟動(dòng)的數(shù)據(jù)卷進(jìn)行備份,恢復(fù),這樣實(shí)現(xiàn)數(shù)據(jù)的遷移
備份
- 使用以下買那個(gè)了備份dbdata數(shù)據(jù)卷容器內(nèi)的數(shù)據(jù)卷
- 如上命令:
- 利用ubuntu鏡像創(chuàng)建一個(gè)容器worker。使用–volumes-from dbdata參數(shù)來(lái)容worker容器掛載dbdata容器的數(shù)據(jù)卷(即dbdata數(shù)據(jù)卷);
- 使用 -v ${pwd}:/backup參數(shù)來(lái)掛載本地的當(dāng)前目錄到worker容器的/backup目錄。
- worker容器啟動(dòng)后,使用tar cvf /backuo.backuo.tar/dbdata命令來(lái)將/dbdata下內(nèi)容備份為容器內(nèi)的/backup/backup.tar,即宿主機(jī)當(dāng)前目錄下的backup.tar
- 執(zhí)行后可以看到宿主機(jī)/backup目錄下出現(xiàn)backup.tar
恢復(fù)
- 如果需要將數(shù)據(jù)恢復(fù)到一個(gè)容器,可以按一下步驟:
- 創(chuàng)建一個(gè)帶有數(shù)據(jù)卷的容器dbdata2
- 然后創(chuàng)建另外一個(gè)新的容器,掛載dbdata2 的容器,并使用untar解壓備份文件到所掛載的容器卷中:
總結(jié)
- Docker在設(shè)計(jì)上就考慮過數(shù)據(jù)問題,為數(shù)據(jù)管理提供了充分操作支持
- 以上通過備份,恢復(fù),共享機(jī)制,即使容器在運(yùn)行中出現(xiàn)故障,用戶也不必?fù)?dān)心數(shù)據(jù)發(fā)生丟失,只要快速重新創(chuàng)建容器即可。
- 生產(chǎn)環(huán)境中,推薦使用數(shù)據(jù)卷匯總數(shù)據(jù)卷容器以外,我們還需要定期將主機(jī)的本地?cái)?shù)據(jù)進(jìn)行備份,或者使用支持容錯(cuò)的存儲(chǔ)系統(tǒng),包括RAID或者分布式文件系統(tǒng)HDFS等。
上一篇:SpringCloud + Docker
下一篇:使用Dockerfile創(chuàng)建鏡像
總結(jié)
以上是生活随笔為你收集整理的Docker中数据管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。