偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Docker 卷到底是個(gè)啥玩意?從使用到深入!

云計(jì)算
每個(gè)容器都會(huì)被自動(dòng)分配本地存儲(chǔ)。默認(rèn)情況下,容器全部文件和目錄都是用該存儲(chǔ)的。非持久存儲(chǔ)屬于容器的一部分,并且與容器的生命周期一樣---容器創(chuàng)建時(shí)會(huì)創(chuàng)建非持久化存儲(chǔ),同時(shí)該存儲(chǔ)也會(huì)隨著容器的刪除而刪除。

[[349110]]

Docker 支持持久化和非持久化兩種方式的存儲(chǔ)。

  • 非持久化化存儲(chǔ)自動(dòng)創(chuàng)建,從屬于容器,生命周期與容器相同,即刪除容器也會(huì)刪除全部非持久化數(shù)據(jù)。
  • 如果想把容器中的數(shù)據(jù)保留下來(lái),也就是持久化,那么需要將數(shù)據(jù)存儲(chǔ)到卷上。卷與容器是解耦的,從而可以獨(dú)立地創(chuàng)建并管理卷,并且卷也不與任意容器聲明周期綁定,即用戶刪除一個(gè)關(guān)聯(lián)了卷的容器,但是卷并不會(huì)被刪除。

非持久化存儲(chǔ)

每個(gè)容器都會(huì)被自動(dòng)分配本地存儲(chǔ)。默認(rèn)情況下,容器全部文件和目錄都是用該存儲(chǔ)的。非持久存儲(chǔ)屬于容器的一部分,并且與容器的生命周期一樣---容器創(chuàng)建時(shí)會(huì)創(chuàng)建非持久化存儲(chǔ),同時(shí)該存儲(chǔ)也會(huì)隨著容器的刪除而刪除。

在 Linux 系統(tǒng)中,該存儲(chǔ)目錄在 /var/lib/docker/ 下,是容器的一部分。這個(gè) storage-driver 是指要使用的存儲(chǔ)驅(qū)動(dòng)。假如要想在生產(chǎn)環(huán)境中使用 Linux 運(yùn)行 Docker,需要確認(rèn)當(dāng)前的存儲(chǔ)驅(qū)動(dòng)是否符合當(dāng)前 Linux 版本:

  • RedHat Enterprise Linux:Docker 17.06 或者更高的版本中使用 Overlay2 驅(qū)動(dòng)。
  • Ubuntu:使用 Overlay2 或者 AUFS 驅(qū)動(dòng)。如果正在使用 Linux 4.x 或者更高版本的內(nèi)核,建議使用 Overlay2。

總的來(lái)說(shuō),Overlay2 驅(qū)動(dòng)正在逐漸流行,可能在未來(lái)會(huì)成為大多數(shù)平臺(tái)上的推薦存儲(chǔ)驅(qū)動(dòng)。

持久化

容器中持久化數(shù)據(jù)的方式推薦使用卷,也就是先創(chuàng)建卷,接著將卷掛載到容器上。這個(gè)時(shí)候,卷會(huì)掛載到容器文件系統(tǒng)的某個(gè)目錄中,任何寫(xiě)到該目錄下的內(nèi)容都會(huì)寫(xiě)到卷中。即使容器被刪除了,卷及其上面的數(shù)據(jù)也仍然存在。

如下圖所示,Docker 卷就被掛載到了容器的 /code 目錄,那么任何寫(xiě)入 /code 目錄中的數(shù)據(jù)其實(shí)都是寫(xiě)入到 Docker 卷中,并且這個(gè) Docker 卷在容器刪除之后依然存在。而其他目錄使用的都是臨時(shí)的本地存儲(chǔ)。

 

卷本質(zhì)就是 Docker 主機(jī)上的一個(gè)目錄。將 Docker 主機(jī)中的一個(gè)目錄掛載到了容器文件系統(tǒng)中的一個(gè)目錄后,此時(shí)操作容器文件系統(tǒng)中的目錄,其實(shí)就是操作相應(yīng)的 Dokcer 主機(jī)上的目錄。也就是相當(dāng)于容器不再僅僅只能訪問(wèn)容器的文件系統(tǒng)了,還可以訪問(wèn)所在 Docker 主機(jī)所在的文件系統(tǒng)了。”見(jiàn)識(shí)一下

創(chuàng)建和查看卷

  1. docker volumn create myvol  # 創(chuàng)建名為 myvol 的卷 

默認(rèn)情況下,Docker 創(chuàng)建新卷時(shí)采用內(nèi)置的 local 驅(qū)動(dòng),采用這個(gè)驅(qū)動(dòng)也就說(shuō)明創(chuàng)建的卷只能被容器所在的 Docker 主機(jī)所使用(上述所使用的就是 local 驅(qū)動(dòng))。

除了 local 驅(qū)動(dòng)之外,你還可以使用 -d 參數(shù)指定不同的驅(qū)動(dòng)。第三方驅(qū)動(dòng)也可以通過(guò)插件方式接入,這些驅(qū)動(dòng)提供了高級(jí)存儲(chǔ)特性,并為 Docker 集成了外部存儲(chǔ)系統(tǒng)。卷插件涵蓋了塊存儲(chǔ)、文件存儲(chǔ)、對(duì)象存儲(chǔ)等。

  • 塊存儲(chǔ):相對(duì)性能更高,適用于對(duì)小塊數(shù)據(jù)的隨機(jī)訪問(wèn)負(fù)載。比如 Amazon EBS 或者 OpenStack 塊存儲(chǔ)服務(wù)。
  • 文件存儲(chǔ):包括 NFS 和 SMB 協(xié)議的系統(tǒng),在高性能場(chǎng)景下表現(xiàn)優(yōu)異。比如 NetApp FAS、Azure 文件存儲(chǔ)。
  • 對(duì)象存儲(chǔ):適用于較大且長(zhǎng)期存儲(chǔ)的、很少變更的二進(jìn)制數(shù)據(jù)存儲(chǔ)。通常對(duì)象存儲(chǔ)是根據(jù)內(nèi)容尋址,并且性能較低。比如 Amazon S3。
  1. docker volumn ls 
  2.  
  3. docker volumn inspect [VOLUMN_NAME] 

inspect 命令會(huì)輸出相應(yīng)卷的詳細(xì)信息,Driver 和 Scope 都是 local,那么表示這個(gè)卷使用默認(rèn) local 驅(qū)動(dòng)創(chuàng)建,只能用于當(dāng)前 Docker 主機(jī)上的容器。Mountpoint 表示卷位于 Docker 主機(jī)上的位置,使用 local 驅(qū)動(dòng)創(chuàng)建的卷在 Docker 主機(jī)上均有專屬目錄。在 Linux 中則位于 /var/lib/docker/volumes 目錄下。

  1.     { 
  2.         "CreatedAt""2020-09-28T16:07:25+08:00"
  3.         "Driver""local"
  4.         "Labels": {}, 
  5.         "Mountpoint""/var/lib/docker/volumes/myvol/_data"
  6.         "Name""myvol"
  7.         "Options": {}, 
  8.         "Scope""local" 
  9.     } 

Dockerfile 中可以使用 VOLUMN 指令的方式部署卷。需要注意的是 Dockerfile 中無(wú)法指定主機(jī)目錄,因?yàn)橹鳈C(jī)目錄通常情況是相對(duì)主機(jī)的一個(gè)目錄(就是跟主機(jī)有關(guān)的目錄),那么這個(gè)目錄在不同主機(jī)間會(huì)不同,可能會(huì)導(dǎo)致構(gòu)建失敗。如果通過(guò) Dockerfile 指定,那么每次部署時(shí)都需要指定主機(jī)目錄。”

卷使用

  1. docker container run -it --name voltainer --mount source=bizvol,target=/vol alpine 

上述的命令創(chuàng)建了一個(gè)新的獨(dú)立容器,并將容器內(nèi)的 /vol 目錄掛載到了名為 bizvol 的卷。假如容器的文件系統(tǒng)中沒(méi)有 /vol 這個(gè)目錄,那么會(huì)創(chuàng)建;假如已有這個(gè)目錄,那么則會(huì)使用這個(gè)目錄(該目錄的內(nèi)容到時(shí)候會(huì)變成卷里面的內(nèi)容)。同理,系統(tǒng)中沒(méi)有叫 bizvol 的卷,那么該命令也會(huì)創(chuàng)建一個(gè)這樣的卷;如果已經(jīng)存在這個(gè)卷了,那么則使用這個(gè)卷。

 

假設(shè),我們把這個(gè)容器給刪除了,那么 bizvol 這個(gè)卷還是在的。而且,你在容器運(yùn)行過(guò)程中往 /vol 這個(gè)目錄中寫(xiě)入的數(shù)據(jù)也在這個(gè)卷中。如下所示,在容器運(yùn)行過(guò)程中先往 /vol/file 中寫(xiě)入一段數(shù)據(jù),然后退出并刪除容器。之后,查看卷所在的目錄,發(fā)現(xiàn)創(chuàng)建的文件和寫(xiě)入的數(shù)據(jù)還是在的。

 

深入深入

上面對(duì)卷的闡述更多是更多是從持久化的角度出發(fā),而卷的另一大作用就是“打通”容器文件系統(tǒng)和主機(jī)文件系統(tǒng),使得容器里在指定目錄下創(chuàng)建的文件可以被宿主機(jī)訪問(wèn)到,也可以使得宿主機(jī)上指定目錄下的文件可以被容器里的進(jìn)程訪問(wèn)到。那么,這個(gè)是如何做到的呢?

這里主要用到了 Linux 的綁定掛載(bind mount)機(jī)制。它的主要作用就是將一個(gè)目錄或者文件掛載到一個(gè)指定的目錄上。并且,之后你在掛載點(diǎn)上進(jìn)行的任何操作,都只發(fā)生在被掛載的目錄或者文件上,而原掛載點(diǎn)的內(nèi)容則會(huì)被隱藏起來(lái)且不受影響。綁定掛載實(shí)際上是一個(gè) inode 替換的過(guò)程。比如,執(zhí)行 mount --bind /home /test 會(huì)將 /home 以 bind 的方式掛載到 /test 上。而這一操作其實(shí)就相當(dāng)于將 /test 重定向到了 /home 的 inode 上。因此,當(dāng)我們修改 /test 目錄的時(shí)候,實(shí)際上修改的是 /home 目錄的 inode。

 

因此,我們只需要在“容器進(jìn)程“創(chuàng)建出來(lái)并且容器的 rootfs 準(zhǔn)備好之后,但是在 chroot 之前,把 volume 指定的宿主機(jī)目錄掛載到指定的容器目錄在宿主機(jī)上對(duì)應(yīng)的目錄即可(因?yàn)檫@時(shí)候容器進(jìn)程可以一直看到宿主機(jī)上的整個(gè)文件系統(tǒng),同時(shí)由于執(zhí)行這個(gè)掛載操作的時(shí)候,容器已經(jīng)創(chuàng)建出來(lái)了,那么此時(shí) mount namespace 相當(dāng)于已經(jīng)開(kāi)啟了,所以掛載事件只在容器里可見(jiàn))。

這邊的容器進(jìn)程是 Docker 創(chuàng)建的一個(gè)容器初始化進(jìn)程(dockerinit),而不是應(yīng)用進(jìn)程(ENTRYPOINT+CMD)。dockerinit 負(fù)責(zé)完成根目錄的準(zhǔn)備、掛載設(shè)備和目錄、配置 hostname 等一系列需要在容器內(nèi)進(jìn)行的初始化操作。最后通過(guò) execv() 系統(tǒng)調(diào)用,讓進(jìn)程取代自己,成為容器里 PID=1 的進(jìn)程。”由于 volume 掛載到指定的容器目錄在宿主機(jī)上對(duì)應(yīng)的目錄位于可讀寫(xiě)層,那么在 docker commit 的時(shí)候會(huì)被提交嘛?不會(huì)。這個(gè)主要是因?yàn)?docker commit 發(fā)生在宿主機(jī)空間,而這個(gè) mount 發(fā)生在容器里面,并且這個(gè) mount 由于 mount namespace 的隔離,不會(huì)影響到宿主機(jī),也就是說(shuō)宿主機(jī)上并沒(méi)有這個(gè)掛載。因此,在提交的時(shí)候只會(huì)提交一個(gè)空的目錄,因?yàn)?/test 是實(shí)實(shí)在在被新建在可讀寫(xiě)層了的(這個(gè)新建可不受 mount namespace 的影響,因?yàn)?mount namespace 只影響 mount 相關(guān)的)。

下面我們來(lái)實(shí)驗(yàn)一下,首先啟動(dòng)一個(gè)容器并且讓這個(gè)容器使用一個(gè) volume,掛載在容器里的 /test 目錄上。之后在容器的 /test 目錄中創(chuàng)建一個(gè)新的文件為 test.txt。

 

之后跑到卷所在的位置查看是否有相應(yīng)的 test.txt 文件創(chuàng)建,結(jié)果顯示有 test.txt 文件創(chuàng)建。之后,我們?cè)偃タ勺x寫(xiě)層對(duì)應(yīng)的目錄查看是否有 test.txt 文件,結(jié)果顯示是有 test 目錄,但是沒(méi)有 test.txt 文件。因此,docker commit 的時(shí)候只會(huì)提交一個(gè) test 空目錄。

 

 

常用命令匯總

  1. # 創(chuàng)建名為 myvol 的卷。默認(rèn)情況下,新卷創(chuàng)建使用 local 啟動(dòng),但是也可以使用 -d 指定不同的驅(qū)動(dòng) 
  2. docker volumn create myvol 
  3.  
  4. # 列出本地 Docker 主機(jī)上的全部卷 
  5. docker volumn ls 
  6.  
  7. # 查看卷的詳細(xì)信息,可以通過(guò)這條命令查看卷在 Docker 主機(jī)文件系統(tǒng)中的具體位置 
  8. docker volumn inspect [VOLUMN_NAME] 
  9.  
  10. # 刪除未裝入到某個(gè)容器或者服務(wù)的所有卷,不能刪除正在被容器或者服務(wù)使用的卷 
  11. docker volumn prune 
  12.  
  13. # 刪除指定卷,不能刪除正在被容器或者服務(wù)使用的卷 
  14. docker volumn rm [VOLUMN_NAME] 
  15.  
  16. # 創(chuàng)建了一個(gè)新的容器,并將容器內(nèi)的 /vol 目錄掛載到了名為 bizvol 的卷。假如容器的文件系統(tǒng)中沒(méi)有 /vol 這個(gè)目錄,那么會(huì)創(chuàng)建;假如已有這個(gè)目錄,那么則會(huì)使用這個(gè)目錄(該目錄的內(nèi)容到時(shí)候會(huì)變成卷里面的內(nèi)容)。同理,系統(tǒng)中沒(méi)有叫 bizvol 的卷,那么該命令也會(huì)創(chuàng)建一個(gè)這樣的卷;如果已經(jīng)存在這個(gè)卷了,那么則使用這個(gè)卷。 
  17. docker container run -it --name voltainer --mount source=bizvol,target=/vol alpine 
  18.  
  19. # 沒(méi)有顯示聲明宿主機(jī)目錄,那么會(huì)在宿主機(jī)上創(chuàng)建一個(gè)臨時(shí)目錄 /var/lib/docker/volumn/[volume_name]/_data,然后把它掛載到容器 /test 目錄上。 
  20. docker run -v /test ... 
  21.  
  22. # 把宿主機(jī)的 /home 目錄掛載到容器的 /test 目錄上 
  23. docker run -v /home:/test ... 

本文轉(zhuǎn)載自微信公眾號(hào)「多選參數(shù)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系多選參數(shù)公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 多選參數(shù)
相關(guān)推薦

2012-02-13 15:50:59

2010-07-02 10:10:09

Eclipse

2010-07-05 15:56:01

EclipseRCPECF

2021-03-22 07:45:05

Sentinel微服務(wù)開(kāi)源的項(xiàng)目

2010-06-28 15:58:45

EclipseJavaIDE

2010-06-29 13:39:26

Eclipse什么玩意兒

2025-10-29 07:33:13

2024-02-07 12:35:00

React并發(fā)模式concurrent

2011-11-21 10:25:29

iCloud

2021-05-11 07:30:58

JNIJavaAPI

2022-05-04 08:38:32

Netty網(wǎng)絡(luò)框架

2021-01-28 17:41:32

Github網(wǎng)站Pull Reques

2022-04-10 19:26:07

TypeScript類型語(yǔ)法

2024-07-12 15:08:23

Python@wraps函數(shù)

2024-08-01 17:34:56

Promiseaxios請(qǐng)求

2021-12-16 15:11:59

Facebook天秤幣加密貨幣

2024-08-26 14:23:56

2022-09-06 21:38:45

數(shù)字人數(shù)字孿生

2021-12-26 00:01:51

Log4Shell漏洞服務(wù)器

2021-12-13 19:57:05

JNDIJava開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)