docker 挂载目录_Docker容器数据管理
在Docker容器內(nèi)部創(chuàng)建的文件默認(rèn)存儲(chǔ)在可寫的容器層,容易產(chǎn)生幾個(gè)問題:
- 當(dāng)容器不存在時(shí),數(shù)據(jù)文件不能持久化,同時(shí)這些數(shù)據(jù)文件不方便在容器之外被其他進(jìn)程使用。
- 當(dāng)容器運(yùn)行的時(shí)候容器可寫層嚴(yán)重依賴宿主機(jī),不能輕易移動(dòng)這些數(shù)據(jù)文件到其他地方。
- 在容器層寫數(shù)據(jù)文件需要存儲(chǔ)驅(qū)動(dòng)(storage driver)來管理文件系統(tǒng),存儲(chǔ)驅(qū)動(dòng)使用Linux內(nèi)核提供的聯(lián)合文件系統(tǒng), 與data volumes直接將文件寫到宿主機(jī)文件系統(tǒng)相比,性能降低。
Docker為容器提供了兩種方式將數(shù)據(jù)文件存儲(chǔ)到宿主機(jī)上,即使容器停止運(yùn)行或者被刪除數(shù)據(jù)文件都可以持久化,這兩種方式分別為 volumes與bind mounts,當(dāng)然如果Docker容器在Linux運(yùn)行,也可以使用tmpfs mounts。不管使用哪種mount方式,數(shù)據(jù)文件在Docker容器內(nèi)部文件系統(tǒng)中是相同的, 要么是一個(gè)文件夾,或者一個(gè)獨(dú)立的文件。
- volumes 存儲(chǔ)在Docker安裝目錄下,在Linux上默認(rèn)指的是/var/lib/docker/volumes,Docker會(huì)自動(dòng)管理,非Docker進(jìn)程不應(yīng)該修改這些文件系統(tǒng),volumes是在Docker中是最好的數(shù)據(jù)持久化方式。
- bind mount 存儲(chǔ)在宿主機(jī)文件系統(tǒng)的任何地方,宿主機(jī)上的非Docker進(jìn)程或者Docker容器都可以在任何時(shí)候修改它。
- tmpfs mount 始終存儲(chǔ)在宿主機(jī)系統(tǒng)內(nèi)存中,不會(huì)被寫到宿主機(jī)的文件系統(tǒng)中。
詳細(xì)介紹
- volumes
Docker會(huì)自動(dòng)創(chuàng)建并管理volumes,當(dāng)然可以通過命令docker volumes create明確的創(chuàng)建一個(gè)volume,當(dāng)成功創(chuàng)建了一個(gè)volume時(shí),它存儲(chǔ)在宿主機(jī)的某個(gè)目錄下, 當(dāng)把這個(gè)volume掛載到一個(gè)Docker容器時(shí),這個(gè)目錄自然會(huì)掛載到容器內(nèi)部,volumes與bind mount工作方式類似,除了volumes是被Docker自動(dòng)管理以及隔離性, 兩者沒什么區(qū)別。
[root@ins ~]# docker volume create mmmm[root@ins ~]# docker volume createcc0613fe5a32273134a76e5670f166f6e248634e909d64cf00061130086f5ae5[root@ins ~]# docker volume lsDRIVER VOLUME NAMElocal cc0613fe5a32273134a76e5670f166f6e248634e909d64cf00061130086f5ae5local mm[root@ins ~]#一個(gè)volume可以同時(shí)掛載到多個(gè)Docker容器,當(dāng)沒有任何Running狀態(tài)的容器使用這個(gè)volume,這個(gè)volume仍然有效并且不會(huì)被自動(dòng)刪除,除非通過執(zhí)行命令 docker volume prune進(jìn)行刪除。當(dāng)掛載一個(gè)volume時(shí),這個(gè)volume可能匿名或者有一個(gè)名字,當(dāng)它首次掛載到容器中的時(shí)候如果Docker發(fā)現(xiàn)該volume沒有一個(gè)明確的名字, 則會(huì)給它分配一個(gè)隨機(jī)的名字,這個(gè)名字在Docker宿主機(jī)上是唯一的。
volumes支持volume driver,允許通過driver將數(shù)據(jù)存儲(chǔ)到遠(yuǎn)程機(jī)器或者云廠商等。
- bind mounts
這種方式與volumes相比,有一些功能限制。當(dāng)使用bind mounts時(shí),宿主機(jī)上的一個(gè)文件或者目錄被掛載到Docker容器中,這個(gè)文件或者目錄通過它在 宿主機(jī)上的完整路徑名被引用,他們?cè)谒拗鳈C(jī)上不是必須存在的,在需要的時(shí)候Docker會(huì)自動(dòng)創(chuàng)建它。bind mounts非常高效,但是他們依賴于宿主機(jī)文件系統(tǒng)明確的目錄結(jié)構(gòu), 同時(shí)通過Docker CLI命令無法直接管理這些bind mounts。
注意:正在運(yùn)行的容器中進(jìn)程可以直接改變宿主機(jī)上的文件系統(tǒng),包括創(chuàng)建、修改以及刪除重要的文件或者目錄,會(huì)引發(fā)安全風(fēng)險(xiǎn)問題,影響宿主機(jī)上運(yùn)行的其它非Docker進(jìn)程,請(qǐng)注意控制權(quán)限。
- tmpfs mounts
這種方式不能將數(shù)據(jù)持久化到磁盤,一個(gè)tmpfs可以被一個(gè)容器在整個(gè)生命周期內(nèi)使用,用于存儲(chǔ)一些非持久狀態(tài)或者敏感數(shù)據(jù),比如swarm services使用tmpfs將secrets 掛載到service的容器中。
volumes與bind mounts都能通過-v 或者 --volume flag參數(shù)掛載到容器中,對(duì)于 tmpfs mount,可以使用--tmpfs flag參數(shù),在Docker17.06以及更高版本中, 推薦使用--mount,對(duì)于這三種方式--mount語法更明確。
三種方式優(yōu)點(diǎn)
volumes可以在多個(gè)運(yùn)行的容器之間共享,解耦Docker容器與宿主機(jī)文件系統(tǒng),支持存儲(chǔ)遠(yuǎn)程以及云廠商,方便在不同的Docker機(jī)器上遷移數(shù)據(jù)。
bind mounts可以讓多個(gè)容器共享宿主機(jī)文件,比如Docker就是通過將/etc/resolv.conf掛載到每個(gè)容器方式實(shí)現(xiàn)DNS解決方案,開發(fā)的時(shí)候可以共享項(xiàng)目源代碼,在容器內(nèi)編譯運(yùn)行。
tmpfs保存敏感數(shù)據(jù),非持久化數(shù)據(jù),由于保存在內(nèi)存中,相比文件系統(tǒng)性能更高。
默認(rèn)規(guī)則:
- 如果將一個(gè)空的volumes掛載到容器內(nèi)的某個(gè)目錄,如果該目錄中已經(jīng)有一些文件或者目錄,那么這些文件或者目錄會(huì)直接復(fù)制到volumes中。
- 如果將一個(gè)bind mount或者非空volume掛載到容器的某個(gè)目錄,這個(gè)目錄中已經(jīng)存在文件或者目錄,那么這個(gè)目錄中的文件或者目錄會(huì)被mount覆蓋,被覆蓋的文件或者目錄只是暫時(shí)被隱藏,當(dāng)移除掛載時(shí)即可恢復(fù)。
使用介紹
早期,Docker都是通過flag -v或者--volume給單機(jī)容器實(shí)現(xiàn)掛載,而swarm service則是通過 flag --mount實(shí)現(xiàn),在Docker 17.06版本開始,--mount也適用于單機(jī)容器掛載,該命令的 語法更靈活明確,在使用-v或者--volume時(shí)盡量使用--mount代替。
-v or –volume
-v db:/var/lib/mysql,通過英文冒號(hào)分隔,如果volume有名字,冒號(hào)之前的是volume,如果volume匿名,則直接 -v /var/lib/mysql,如果需要控制容器讀寫volume權(quán)限,可以 -v db:/var/lib/mysql:ro
–mount
--mount包含許多以英文逗號(hào)分隔的key-value鍵值對(duì),它的語法比-v以及--volume更詳細(xì),key的順序無關(guān)緊要,主要包含以下key(只列舉部分)
- type 它的值可以為 volume、bind或者tmpfs
- source 對(duì)于已命名的volume,source即為volume名字,volume匿名,則該值為空,source也可定義為src
- destination 指定掛載到容器中的path路徑,可以定義為dst、destination或者target
- readonly 如果存在,則被掛載的volume在容器中只能讀
- volume-opt 可選參數(shù),可以定義多次,key-value形式
基礎(chǔ)使用
創(chuàng)建一個(gè)volume
docker volume create sunjinfu查看volume
docker inspect sunjinfu[ { "CreatedAt": "2019-04-20T15:00:12+08:00總結(jié)
以上是生活随笔為你收集整理的docker 挂载目录_Docker容器数据管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: amd核芯显卡控制面板自定义分辨率_AM
- 下一篇: 中北大学计算机二级负责老师,导师信息#中