真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

Docker 支持持久化和非持久化兩種方式的存儲。

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),德陽企業(yè)網(wǎng)站建設(shè),德陽品牌網(wǎng)站建設(shè),網(wǎng)站定制,德陽網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,德陽網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

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

非持久化存儲

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

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

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

總的來說,Overlay2 驅(qū)動正在逐漸流行,可能在未來會成為大多數(shù)平臺上的推薦存儲驅(qū)動。

持久化

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

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

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

創(chuàng)建和查看卷

dockervolumncreatemyvol#創(chuàng)建名為myvol的卷

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

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

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

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

[{CreatedAt:2020-09-28T16:07:25+08:00,Driver:local,Labels:{},Mountpoint:/var/lib/docker/volumes/myvol/_data,Name:myvol,Options:{},Scope:local}]

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

卷使用

dockercontainerrun-it--namevoltainer--mountsource=bizvol,target=/volalpine

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

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

深入深入

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

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

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

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

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

之后跑到卷所在的位置查看是否有相應(yīng)的 test.txt 文件創(chuàng)建,結(jié)果顯示有 test.txt 文件創(chuàng)建。之后,我們再去可讀寫層對應(yīng)的目錄查看是否有 test.txt 文件,結(jié)果顯示是有 test 目錄,但是沒有 test.txt 文件。因此,docker commit 的時候只會提交一個 test 空目錄。

常用命令匯總

#創(chuàng)建名為myvol的卷。默認(rèn)情況下,新卷創(chuàng)建使用local啟動,但是也可以使用-d指定不同的驅(qū)動dockervolumncreatemyvol#列出本地Docker主機上的全部卷dockervolumnls#查看卷的詳細(xì)信息,可以通過這條命令查看卷在Docker主機文件系統(tǒng)中的具體位置dockervolumninspect[VOLUMN_NAME]#刪除未裝入到某個容器或者服務(wù)的所有卷,不能刪除正在被容器或者服務(wù)使用的卷dockervolumnprune#刪除指定卷,不能刪除正在被容器或者服務(wù)使用的卷dockervolumnrm[VOLUMN_NAME]#創(chuàng)建了一個新的容器,并將容器內(nèi)的/vol目錄掛載到了名為bizvol的卷。假如容器的文件系統(tǒng)中沒有/vol這個目錄,那么會創(chuàng)建;假如已有這個目錄,那么則會使用這個目錄(該目錄的內(nèi)容到時候會變成卷里面的內(nèi)容)。同理,系統(tǒng)中沒有叫bizvol的卷,那么該命令也會創(chuàng)建一個這樣的卷;如果已經(jīng)存在這個卷了,那么則使用這個卷。dockercontainerrun-it--namevoltainer--mountsource=bizvol,target=/volalpine#沒有顯示聲明宿主機目錄,那么會在宿主機上創(chuàng)建一個臨時目錄/var/lib/docker/volumn/[volume_name]/_data,然后把它掛載到容器/test目錄上。dockerrun-v/test...#把宿主機的/home目錄掛載到容器的/test目錄上dockerrun-v/home:/test...


標(biāo)題名稱:Docker卷到底是個啥玩意?從使用到深入!
鏈接地址:http://weahome.cn/article/cjjioj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部