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

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


咨詢
建站咨詢
