docker數(shù)據(jù)持久化及配置Volume和mount實(shí)踐
容器自身存儲的問題
Docker鏡像是由多個文件系統(tǒng)(只讀層)疊加而成,容器啟動的時候是在原鏡像層上面加了一層可讀寫層,容器層,如果運(yùn)行中的容器修改了現(xiàn)有的一個已經(jīng)存在的文件,那該文件將會從讀寫層下面的只讀層復(fù)制到讀寫層,該文件的只讀版本仍然存在,只是已經(jīng)被讀寫層中該文件的副本所隱藏。當(dāng)刪除Docker容器,并通過該鏡像重新啟動時,之前的更改將會丟失。
1、由于docker自身存儲的方式,導(dǎo)致讀寫效率會降低,因?yàn)樾枰獙⒅蛔x層先復(fù)制到讀寫層這樣的過程
2、當(dāng)刪除Docker容器,容器層數(shù)據(jù)也會刪除
3、數(shù)據(jù)遷移共享和管理不便
提醒:網(wǎng)上好多版本說容器重啟就會丟失數(shù)據(jù),不知道為什么有這樣的結(jié)論,容器層存在的話應(yīng)該不存在數(shù)據(jù)丟失問題
docker提供三種解決方案

bind mount:將宿主機(jī)中的文件、目錄mount掛載到容器上,依賴宿主機(jī)。volume:volume由docker管理,比如創(chuàng)建、刪除什么的。默認(rèn)volume的存儲空間/var/lib/docker/volumes/創(chuàng)建的卷名稱,volume是官方推薦的持久化方案。tmpfs mount:如果您的容器生成非持久狀態(tài)數(shù)據(jù),可以使用 tmpfs掛載以避免將數(shù)據(jù)永久存儲在任何地方,并通過避免寫入容器的可寫層來提高容器的性能
bind mount和volume基本都差不多,只是針對特殊場景和需求而選擇
看下官網(wǎng)說的volume的優(yōu)點(diǎn)
1、volume可命令或Docker API管理 (mount沒有任何命令管理)
2、volume在Linux和Windows容器上均可工作(mount依賴宿主機(jī)格式)
3、volume更易于備份或遷移
4、可以在多個容器之間更安全地共享volume
5、持久化數(shù)據(jù)到遠(yuǎn)程主機(jī)或者云存儲而非本地 (具體的存儲可以不在宿主機(jī)上,mount依賴宿主機(jī))
6、volume的內(nèi)容可以由容器預(yù)先填充 (volume 會保留原目錄數(shù)據(jù),mount會屏蔽原目錄數(shù)據(jù))
- 如果將空volume掛載到container上的某個目錄,此目錄下原來的文件與子目錄會復(fù)制到空volume中。
- 如果mount一個非空目錄或者文件,或者非空volume,則container目錄中的原始內(nèi)容將被遮蔽,當(dāng)解決掛載時則自動恢復(fù)。
也參考這一篇:點(diǎn)擊進(jìn)入
官網(wǎng)命令解析:
運(yùn)行后容器,官方是沒有提供任何可以執(zhí)行的操作添加存儲方式
1、鏡像run的使用 加上參數(shù)配置
2、 commit提交副本鏡像,重新啟動新鏡像加上參數(shù)配置(針對容器已經(jīng)有數(shù)據(jù)的情況下)
–mount
由多個名值對組成,逗號分隔,每個鍵值由 = 元組組成。–mount 語法比 -v 或 --volume更冗長,但鍵的順序并不重要,并且標(biāo)志的值更易于理解
docker run -itd --mount type=bind,source=/root,target=/tmp ubuntu /bin/bash
- 要掛載的類型 type,可以是 bind、volume 或 tmpfs。
- 要掛載的源 source,對于有名字的卷,這里是卷的名字。對于匿名卷忽略這個字段??梢灾付?src 或 source。
- 要掛載的目的地 destination,將文件或目錄掛載在容器中的路徑作為其值。 可能被指定為 destination、dst 或target。
- 只讀選項(xiàng) readonly,這個選項(xiàng)會使得掛載到容器中的綁定掛載只讀。
- volume-opt可以多次指定的選項(xiàng)采用鍵值對,該鍵值對由選項(xiàng)名稱及其值組成。
- 最后的/bin/bash,表示一旦容器啟動,需要運(yùn)行的命令,此時使用“/bin/bash”,表示什么也不做,只需進(jìn)入命令行即可
-v或–volume
由三個字段組成,以冒號(:)分隔。這些字段必須以正確的順序排列,并且每個字段的含義不是立即顯而易見的。
docker volume create centos7 創(chuàng)建一個卷名稱centos7 docker volume ls 查看卷 docker run -itd -v cetnos7:/root ubuntu /bin/bash
- 第一個字段是卷的名稱,在給定的主機(jī)上是唯一的。對于匿名卷,將省略第一個字段。
- 第二個字段是文件或目錄在容器中的安裝路徑。
- 第三個字段是可選的,看官方手冊
docker volume create my-vol #創(chuàng)建數(shù)據(jù)卷 docker volume ls #查看有哪些卷 docker volume inspect my-vol #查看卷詳情 docker rm -f web #強(qiáng)制刪除運(yùn)行中的容器 docker volume rm my-vol #刪除卷 docker volume prune #清理無用的卷 docker ps -s #可以查看容器的大小是沒有增加的
我們怎么看容器是否掛載存儲呢?
docker inspect eb5e31fef691 查看容器詳細(xì)信息
容器本身存儲

mount掛載

volume掛載

總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
將Docker容器打包并在其他服務(wù)器上運(yùn)行的全過程
Docker容器使得應(yīng)用程序的部署和管理變得更加簡單和高效,有時,我們可能需要將一個運(yùn)行中的Docker容器打包,并在其他服務(wù)器上運(yùn)行,本文將詳細(xì)介紹如何實(shí)現(xiàn)這一過程,需要的朋友可以參考下2024-05-05
dockerfile構(gòu)建haproxy的詳細(xì)過程(構(gòu)建HAProxy的鏡像)
Dockerfile是一個用于構(gòu)建Docker鏡像的文本文件,包含了構(gòu)建鏡像所需的所有指令和說明,通過定義一系列命令和參數(shù),本文詳細(xì)介紹了如何使用Dockerfile一步步構(gòu)建HAProxy的鏡像,并指導(dǎo)如何創(chuàng)建和運(yùn)行容器,實(shí)現(xiàn)負(fù)載均衡服務(wù),感興趣的朋友一起看看吧2025-03-03
Docker如何根據(jù)名稱查詢?nèi)萜鱅D鏡像ID并停止刪除
這篇文章主要介紹了Docker如何根據(jù)名稱查詢?nèi)萜鱅D鏡像ID并停止刪除問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
Portainer部署和添加其他docker服務(wù)器的方法
文章介紹了如何部署Portainer并添加其他Docker服務(wù)器,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-03-03
手把手帶大家通過Docker部署前后端分離項(xiàng)目(親測可用)
近年來前后端分離已經(jīng)成為中大型軟件項(xiàng)目開發(fā)的最佳實(shí)踐,下面這篇文章主要給大家介紹了關(guān)于通過Docker部署前后端分離項(xiàng)目的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
使用docker?compose快速配置一組容器服務(wù)詳解
這篇文章主要為大家介紹了使用docker-?compose快速配置一組容器服務(wù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11

