新聞中心
使用Docker Volume輕松管理數(shù)據(jù)庫

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了臨淄免費(fèi)建站歡迎大家使用!
隨著云服務(wù)的發(fā)展,使用容器化技術(shù)來管理應(yīng)用程序的方式越來越受到歡迎。容器化技術(shù)提供了更高效、更靈活、更可靠的應(yīng)用程序部署方式,其中最重要的是Docker這個(gè)比較成熟的容器化技術(shù)。
對于應(yīng)用程序開發(fā)者、系統(tǒng)管理員或DevOps工程師而言,Docker技術(shù)可以大大簡化管理任務(wù),減少了可能的配置問題,并提供了可重復(fù)的服務(wù)透明性。本文將介紹如何使用Docker volume來輕松地管理數(shù)據(jù)庫。
Docker Volume介紹
Docker Volume是Docker提供的一種用于數(shù)據(jù)持久化存儲(chǔ)的機(jī)制。與容器持久化存儲(chǔ)不同的是,Docker Volume在容器啟動(dòng)和停止時(shí),可以保留數(shù)據(jù),同時(shí)可以跨容器共享。
在Docker中,使用dockerVolume可以輕松地將數(shù)據(jù)卷掛載到容器中。這個(gè)數(shù)據(jù)卷可以是一個(gè)文件夾、一個(gè)文件或一個(gè)遠(yuǎn)程文件系統(tǒng)掛載點(diǎn)。Docker Volume還可以支持其他的插件,如NFS插件、Amazon EBS插件、Google Cloud插件等。Docker Volume提供了一些簡單易用的命令,例如創(chuàng)建、掛載、列出、刪除數(shù)據(jù)卷等。
使用Docker Volume管理數(shù)據(jù)庫
Docker Volume為數(shù)據(jù)庫管理提供了一個(gè)完美的工具。管理數(shù)據(jù)庫時(shí),使用Docker Volume可以將數(shù)據(jù)庫容器與數(shù)據(jù)庫數(shù)據(jù)持久化存儲(chǔ)分離。這樣做的好處是在容器需要重啟、應(yīng)用程序需要升級或者服務(wù)器需要遷移時(shí),數(shù)據(jù)庫容器和數(shù)據(jù)庫數(shù)據(jù)可以分別處理,這樣就不會(huì)失去寶貴的數(shù)據(jù)。
使用Docker Volume存儲(chǔ)MySQL數(shù)據(jù)庫
下面以MySQL數(shù)據(jù)庫為例,介紹如何使用Docker Volume來管理數(shù)據(jù)庫。如果將容器映像與數(shù)據(jù)層分離,可以使用以下命令創(chuàng)建Docker Volume:
“`
docker volume create mysql_data
“`
該命令將創(chuàng)建一個(gè)名為mysql_data的數(shù)據(jù)卷。接下來,可以將數(shù)據(jù)卷掛載到一個(gè)MySQL容器中。以下是掛載卷的命令:
“`
docker run -d –name mysql -e MYSQL_ROOT_PASSWORD=yourpassword -v mysql_data:/var/lib/mysql mysql:latest
“`
在該命令中,-v參數(shù)指定先前創(chuàng)建的mysql_data數(shù)據(jù)卷,該數(shù)據(jù)卷的目標(biāo)位置是MySQL容器中的/var/lib/mysql。
當(dāng)創(chuàng)建或啟動(dòng)MySQL容器時(shí),數(shù)據(jù)卷將自動(dòng)掛載到容器中/var/lib/mysql目錄,這使得MySQL數(shù)據(jù)存儲(chǔ)與容器分離。如需管理MySQL數(shù)據(jù)庫,可以直接進(jìn)入MySQL容器并執(zhí)行標(biāo)準(zhǔn)MySQL命令。在這種情況下,不會(huì)丟失任何數(shù)據(jù)庫數(shù)據(jù)。
使用Docker Volume存儲(chǔ)MongoDB數(shù)據(jù)庫
對于MongoDB數(shù)據(jù)庫而言,使用Docker Volume同樣非常簡單。以下是使用docker命令創(chuàng)建mongo_data數(shù)據(jù)卷的示例:
“`
docker volume create mongo_data
“`
接下來,將數(shù)據(jù)卷掛載到MongoDB容器中,方法如下所示:
“`
docker run -d –name mongo -v mongo_data:/data/db mongo:latest
“`
在該命令中,-v參數(shù)指定mongo_data數(shù)據(jù)卷,該數(shù)據(jù)卷的目標(biāo)位置是MongoDB容器中的/data/db。
與MySQL數(shù)據(jù)庫類似,MongoDB容器數(shù)據(jù)存儲(chǔ)與容器分離。如需管理MongoDB數(shù)據(jù)庫,同樣可以直接進(jìn)入MongoDB容器并執(zhí)行標(biāo)準(zhǔn)MongoDB命令。
容器化技術(shù)給開發(fā)者和系統(tǒng)管理員帶來高效、靈活和可靠的應(yīng)用程序部署方式。使用Docker Volume來管理數(shù)據(jù)庫,可以將在容器重啟、應(yīng)用程序升級或服務(wù)器遷移時(shí)不會(huì)丟失任何數(shù)據(jù)庫數(shù)據(jù)。以上所述是如何使用Docker Volume來管理MySQL和MongoDB數(shù)據(jù)庫,但它可以使用于任何一種數(shù)據(jù)庫管理。要注意維護(hù)好數(shù)據(jù)卷內(nèi)的數(shù)據(jù),以確保您的數(shù)據(jù)是安全、穩(wěn)定和一致的。
相關(guān)問題拓展閱讀:
- docker掛載volume的用戶權(quán)限問題
- Dockerfile 中的Volume有什么意義,光用docker run
- 如何給啟動(dòng)的docker添加volume
docker掛載volume的用戶權(quán)限問題
在剛開始使用docker volume掛載數(shù)據(jù)卷的時(shí)候,經(jīng)常出現(xiàn)沒有權(quán)限的問題。
這里通過遇到的問題來理解docker容器用戶uid的使用,以及了解容器內(nèi)外uid的映射關(guān)系。
本地有一個(gè)node的項(xiàng)目需要編譯,采用docker來run npm install.
可以看到,install之后,node_modules文件的權(quán)限變成root了。那么,作為使用者的我們就沒有權(quán)限去刪除這個(gè)文件了。
為什么docker輸出的文件權(quán)限會(huì)是root?
Docker容器運(yùn)行的時(shí)候,如果沒有專門指定user, 默認(rèn)以root用戶運(yùn)行。我們的node鏡像的 Dockerfile 里沒有指定user.
容器里的執(zhí)行用戶的id是0,輸出文件的權(quán)限也是0.
以下參考 Understanding how uid and gid work in Docker containers
首先了解uid,gid的實(shí)現(xiàn)
。Linux內(nèi)核負(fù)責(zé)管理uid和gid,并通過內(nèi)核級別的系統(tǒng)調(diào)用來決定是否通過請求的權(quán)限。
比如,當(dāng)一個(gè)進(jìn)程嘗試去寫文件,內(nèi)核會(huì)檢查創(chuàng)建這個(gè)進(jìn)程的的user的uid和gid,來決定這個(gè)進(jìn)程是否有權(quán)限修改這個(gè)文件。
這里沒有使用username,而是uid。
當(dāng)docker容器運(yùn)行在宿主機(jī)上的時(shí)候,仍然只有一個(gè)內(nèi)核。容器共享宿主機(jī)的內(nèi)核,所以所有的uid和gid都受同一個(gè)內(nèi)核來控制。
那為什么我容器里的用戶名不一定和宿主內(nèi)核一樣呢?
比如,superset容器的用戶叫做superset, 而本機(jī)沒有superset這個(gè)用戶。這是因?yàn)閡sername不是Linux kernel的一部分。簡單的來說,username是對uid的一個(gè)映射。
然而,權(quán)限控制的依據(jù)是uid,而不是username。
我們繼續(xù)使用node鏡像, 你可以在 github 查看Dockerfile. 里面創(chuàng)建了一個(gè)
uid為1000的用戶node,但沒指定運(yùn)行user。
我執(zhí)行的用戶為ryan(uid=1000), 讓容器后臺(tái)執(zhí)行sleep程序。
可以看到,容器外執(zhí)行sleep的進(jìn)程的用戶是root。容器內(nèi)部的用戶也是0(root). 雖然執(zhí)行docker run的用戶是ryan
.
也就是說,我一個(gè)普通用戶居然可以以root的身份去執(zhí)行一個(gè)命令。看起來挺恐怖的樣子。
權(quán)限是通過uid來判斷的。接下來測試,相同uid的用戶可以修改歸屬于這個(gè)uid的文件。
宿主機(jī)有一個(gè)用戶ryan:
剛才使用的node鏡像的Dockerfile也定義了1000的用戶node:
我們在本地寫一個(gè)文件a, 歸屬用戶ryan
然后,通過volume掛載的方式,指定運(yùn)行user為1000, 啟動(dòng)容器node:
可以看到, 容器外執(zhí)行sleep的進(jìn)程,user是ryan(另一個(gè)sleep進(jìn)行是前面的root用戶執(zhí)行的實(shí)例,沒刪除)。
即,
docker run -u 可以指定宿主機(jī)運(yùn)行docker命令的用戶, -u指定的uid就是docker實(shí)際運(yùn)行的進(jìn)程擁有者
。
接下來去容器內(nèi)部,看看能不能修改掛載的文件。
可以看到,我們掛載的文件a在容器內(nèi)部顯示owner是node,即uid=1000的用戶。并且有權(quán)限查看和修改。
然后,我們寫一個(gè)文件b,在容器內(nèi)部,這個(gè)b自然屬于uid=1000的node。來看看容器外:
同樣的,容器外顯示b從屬于uid=1000的用戶ryan,并且有權(quán)限查看和修改。
如此,可以證明容器內(nèi)外共享uid和對應(yīng)的權(quán)限。
本文最初的問題就是因?yàn)槿萜鲌?zhí)行者和掛載數(shù)據(jù)卷的權(quán)限不同。容器內(nèi)部運(yùn)行是uid=0的用戶,數(shù)據(jù)卷從屬與uid=1000的ryan。最終導(dǎo)致容器寫入數(shù)據(jù)卷的文件權(quán)限升級為root, 從而普通用戶無法訪問。
如果掛載了root的文件到容器內(nèi)部,而容器內(nèi)部執(zhí)行uid不是0,則報(bào)錯(cuò)沒有權(quán)限。我在掛載npm cache的時(shí)候遇到了這個(gè)問題,于是有了本文。
上面的demo恰好宿主機(jī)器和容器都存在一個(gè)uid=1000的用戶,于是很和諧的實(shí)現(xiàn)了文件權(quán)限共享。接下來測試一個(gè)更加明顯的demo。
宿主機(jī)器和容器都沒有uid=1111, 我們以1111來執(zhí)行容器:
接下來看看容器外的表現(xiàn):
即-u指定容器內(nèi)部執(zhí)行的用戶,以及容器外在宿主機(jī)進(jìn)程的用戶,同樣容器寫到數(shù)據(jù)卷的權(quán)限也由此指定。
如此,這個(gè)demo更容易理解容器內(nèi)外的uid的對應(yīng)關(guān)系。理解了以后我們掛載數(shù)據(jù)卷的時(shí)候就不會(huì)出現(xiàn)權(quán)限問題了。
由于安全問題,通常也是建議不用使用root來運(yùn)行容器的。
Dockerfile 中的Volume有什么意義,光用docker run
你可以把VOLUME理解為,從鏡像中復(fù)制指定卷的文件夾到本地/var/lib/docker/volumes/xxxxxxxxx/文件夾,然后把本地的該文件夾掛載到容器里面去。
本質(zhì)上還是相當(dāng)于一個(gè)本地文件夾掛載而已。
如何給啟動(dòng)的docker添加volume
直接docker run -v 跟本地目錄 這樣就或譽(yù)就直接滲冊把本叢團(tuán)宏地的目錄映射到容器指定目錄dockerfile 里的 volume指定的目錄,里面內(nèi)存變化的時(shí)候docker commit的時(shí)候忽略里面的改變。如何給啟動(dòng)的docker添加volume
關(guān)于docker volume數(shù)據(jù)庫的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
標(biāo)題名稱:使用dockervolume輕松管理數(shù)據(jù)庫(dockervolume數(shù)據(jù)庫)
轉(zhuǎn)載注明:http://www.5511xx.com/article/cccjheo.html


咨詢
建站咨詢
