Docker數(shù)據(jù)卷掛載及宿主機目錄掛載使用和區(qū)別
?前言
假設(shè)我們有一個容器化的機器學(xué)習(xí)模型訓(xùn)練應(yīng)用程序。該應(yīng)用程序需要大量的訓(xùn)練數(shù)據(jù)來進行模型的訓(xùn)練,而這些訓(xùn)練數(shù)據(jù)可能會占據(jù)大量的存儲空間。如果我們將訓(xùn)練數(shù)據(jù)直接放在容器內(nèi)部,會導(dǎo)致容器的鏡像體積增大,每次創(chuàng)建或啟動容器都需要復(fù)制整個數(shù)據(jù)集,這將消耗大量的時間和存儲資源,而且容器被刪除了不可逆,那么就會導(dǎo)致數(shù)據(jù)丟失非常的不方便。
當(dāng)使用數(shù)據(jù)卷掛載和宿主機目錄掛載時:
- 數(shù)據(jù)庫存儲:在容器化的應(yīng)用程序中,數(shù)據(jù)庫通常需要持久化存儲數(shù)據(jù)。通過將數(shù)據(jù)庫的數(shù)據(jù)卷掛載到容器中,可以確保數(shù)據(jù)在容器重啟或更新時不會丟失。這樣,即使容器被銷毀,數(shù)據(jù)仍然可以在其他容器中使用。數(shù)據(jù)卷掛載還可以用于容器之間共享數(shù)據(jù)庫的備份文件。
- Web服務(wù)器日志:對于運行在容器中的Web服務(wù)器,日志文件是非常重要的記錄和分析工具。通過將宿主機上的日志目錄掛載到容器中,可以實時記錄容器內(nèi)的日志,并將其保存到宿主機上。這樣,在容器重啟或刪除后,日志仍然可以在宿主機上進行查看和分析。
- 文件共享:如果有多個容器需要訪問相同的文件(例如配置文件、證書文件等),可以將這些文件放置在宿主機上的一個目錄中,并將該目錄通過宿主機目錄掛載到各個容器中。這樣,所有容器都可以共享和訪問這些文件,而不需要在每個容器中復(fù)制一份。
- 靜態(tài)資源存儲:對于網(wǎng)站或應(yīng)用程序中的靜態(tài)資源(如圖片、CSS和JavaScript文件),可以將這些資源放置在宿主機上的一個目錄中,并通過宿主機目錄掛載到運行Web服務(wù)器的容器中。這樣,容器就可以直接從宿主機上加載和提供靜態(tài)資源,而不需要將資源復(fù)制到每個容器中。
一、數(shù)據(jù)卷掛載
1.數(shù)據(jù)卷是什么
數(shù)據(jù)卷是一個虛擬目錄,它將宿主機目錄映射到容器內(nèi)目錄,方便我們操作容器內(nèi)文件,或者方便遷移容器產(chǎn)生的數(shù)據(jù)。
為了很好的實現(xiàn)數(shù)據(jù)保存和數(shù)據(jù)共享,Docker提出了Volume這個概念,簡單的說就是繞過默認的聯(lián)合文件系統(tǒng),而以正常的文件或者目錄的形式存在于宿主機上。又被稱作數(shù)據(jù)卷。
數(shù)據(jù)卷 是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS可以提供很多有用的特性:
- 數(shù)據(jù)卷 可以在容器之間共享和重用
- 對數(shù)據(jù)卷的修改會立馬生效
- 對數(shù)據(jù)卷的更新,不會影響鏡像
- 數(shù)據(jù)卷默認會一直存在,即使容器被刪除
2.數(shù)據(jù)卷的基本使用
創(chuàng)建數(shù)據(jù)卷
docker volume create 數(shù)據(jù)卷名稱

查看所有數(shù)據(jù)卷
docker volume ls

查看數(shù)據(jù)卷信息
docker volume inspect my-vol

刪除一個volume
docker volume rm my-vol
數(shù)據(jù)卷 是被設(shè)計用來持久化數(shù)據(jù)的,它的生命周期獨立于容器,Docker不會在容器被刪除后自動 刪除數(shù)據(jù)卷,并且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的數(shù)據(jù)卷,無主的數(shù)據(jù)卷 可能會占據(jù)很多空間,所以要及時刪除.
掛載數(shù)據(jù)卷
在用 docker run 命令的時候,使用 --mount 標記來將 數(shù)據(jù)卷 掛載到容器里。在一次 docker run 中可以掛載多個 數(shù)據(jù)卷 。
docker run -itd \ --name 容器名字 \ --mount source=數(shù)據(jù)卷名稱,target=容器中的對應(yīng)目錄 \ 鏡像名稱

最好是通過run而非create/start創(chuàng)建啟動容器,create/start命令創(chuàng)建啟動容器后,再掛載數(shù)據(jù)卷 相當(dāng)麻煩,要修改很多配置文件,但并非不可以。
加了“\”意為將最后的回車換行給注釋了,系統(tǒng)理解為命令還沒有結(jié)束,因而是繼續(xù)等待用戶進行 輸入,直到讀到結(jié)束符,如回車
- 如果數(shù)據(jù)卷不存在,docker會自動創(chuàng)建
- 如果容器上目錄不存在, docker會自動創(chuàng)建
注意:-it掛載后會直接進入容器,-itd則是在掛載不進入
查看是否掛載成功
首先查看我們數(shù)據(jù)卷的目錄位置
docker inspect name

該目錄就是數(shù)據(jù)卷的目錄,我們現(xiàn)在進入該目錄新建一個文本

然后我們進入容器查看是否有該文件,如果有文件說明掛載成功實現(xiàn)共享

二、宿主機目錄掛載
1.什么是目錄掛載
目錄掛載是將主機上的一個目錄直接掛載到容器中,容器中的文件會直接覆蓋主機上的文件,這種方式不適合多個容器共享數(shù)據(jù)。目錄掛載的好處是可以方便地將主機上的文件或目錄與容器中的文件或目錄進行同步,方便開發(fā)和調(diào)試。
2.目錄掛載的基本使用
首先我們在宿主機上創(chuàng)建一個目錄用于存放資源

將提前準備好的war放入該目錄中

掛載目錄
docker run -itd \ --name 容器名字 \ --mount type=bind,source=宿主機目錄,target=容器中的對應(yīng)目錄 \ 鏡像名稱
或者使用簡化版本
docker run -itd \ --name t1 \ -v /soft:/user/local/tomcat/webapps \ -p 8080:8080 \ tomcat:8.5.40
解釋該命令的各個部分如下:
docker run: 運行一個新的容器。-itd: 這是三個選項的組合:-i:保持標準輸入 (stdin) 打開,即使未附加也可以與容器進行交互。-t:為容器分配一個偽終端 (pseudo-TTY)。-d:將容器設(shè)為后臺運行模式。
--name t1:為容器指定一個名稱為 "t1",以便于管理和引用它。-v /soft:/user/local/tomcat/webapps:將本地宿主機上的目錄/soft掛載到容器內(nèi)的/user/local/tomcat/webapps目錄。這意味著容器中的 Tomcat 應(yīng)用程序?qū)⒛軌蛟L問并使用位于/soft目錄下的文件。-p 8080:8080:將容器內(nèi)的端口 8080 映射到宿主機的端口 8080。這樣,當(dāng)在宿主機上訪問http://localhost:8080時,實際上是訪問容器內(nèi)運行的 Tomcat 服務(wù)器。tomcat:8.5.40:使用 tomcat:8.5.40 鏡像啟動容器。

但是這么使用有一個弊端,它是將整個文件夾進行替換我們想要的效果是單個文件進行替換
docker run -itd \ --name t1 \ -v /soft/oapro.war:/user/local/tomcat/webapps/oapro.war \ -p 8080:8080 \ tomcat:8.5.40

這樣就可以精準替換我們想要的文件并且不應(yīng)該原文件了
三、案例(實現(xiàn)Tomcat在線部署)
實現(xiàn) Tomcat 在線部署是指在 Tomcat 運行的過程中,通過上傳 WAR 文件或目錄來動態(tài)地添加、刪除或更新 Web 應(yīng)用程序。這種方式可以避免每次更改應(yīng)用程序時都要重新啟動 Tomcat 的麻煩,并大大提高了開發(fā)和調(diào)試的效率。

但是直接點擊就會報錯,原因是因為我們沒有用戶信息

所以我們現(xiàn)在結(jié)合上面的內(nèi)容進行目錄掛載,首先我們需要
修改E:\apache-tomcat-8.5.40\webapps\manager\META-INF\context.xml

修改E:\apache-tomcat-8.5.40\conf\tomcat-users.xml

將就該完成的文件復(fù)制到liunx目錄中

將我們docker中的tomcat文件進行替換
docker run -itd \ --name t1 \ -v /soft/tomcat-users.xml:/user/local/tomcat/conf/tomcat-users.xml \ -v /soft/context.xml:/user/local/tomcat/webapps/manager/META-INF/context.xml \ -p 8080:8080 \ tomcat:8.5.40
四、二者區(qū)別
數(shù)據(jù)卷掛載適合多個容器共享數(shù)據(jù),而目錄掛載適合單個容器與主機之間進行數(shù)據(jù)交換。
到此這篇關(guān)于Docker數(shù)據(jù)卷掛載及宿主機目錄掛載使用和區(qū)別的文章就介紹到這了,更多相關(guān)Docker數(shù)據(jù)卷掛載及宿主機目錄掛載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker內(nèi)置網(wǎng)絡(luò)模式分析
這篇文章主要為大家介紹了Docker內(nèi)置網(wǎng)絡(luò)模式分析及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
docker部署elasticsearch和xpack密碼的詳細過程
本文主要介紹在docker環(huán)境下如何快速部署elasticsearch單機版本和集群版本,和增加xpack簡單用戶名密碼配置,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-01-01
使用Docker鏡像構(gòu)建Go應(yīng)用的實現(xiàn)方法
本文主要介紹了使用Docker鏡像構(gòu)建Go應(yīng)用的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
完美解決docker安裝mysql后Navicat連接不上的問題
這篇文章主要介紹了完美解決docker安裝mysql后Navicat連接不上的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Docker下利用jenkins和docker實現(xiàn)持續(xù)交付
這篇文章主要介紹了利用jenkins和docker實現(xiàn)持續(xù)交付功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-05-05
Docker安裝部署Mysql8的過程(以作數(shù)據(jù)持久化)
這篇文章主要介紹了Docker安裝部署Mysql8(以作數(shù)據(jù)持久化),首先創(chuàng)建容器并進行持久化處理,接著配置遠程連接并嘗試,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-09-09
利用Docker搭建Laravel開發(fā)環(huán)境的完整步驟
這篇文章主要給大家介紹了關(guān)于如何利用Docker搭建Laravel開發(fā)環(huán)境的完整步驟,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Laravel具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
使用docker compose安裝harbor私有倉庫的詳細教程
harbor鏡像倉庫是由VMware開源的一款企業(yè)級鏡像倉庫,它包括權(quán)限管理(RBAC)、LDAP、日志審核、管理界面、自我注冊、鏡像復(fù)制等諸多功能,本文給大家介紹docker compose安裝harbor的方法,需要的朋友參考下吧2021-06-06

