容器的生命周期
容器運(yùn)行時(shí)的生命周期
容器是一組具有隔離特性的進(jìn)程集合,在使用 docker run 的時(shí)候會(huì)選擇一個(gè)鏡像來提供獨(dú)立的文件系統(tǒng)并指定相應(yīng)的運(yùn)行程序。這里指定的運(yùn)行程序稱之為 initial 進(jìn)程,這個(gè) initial 進(jìn)程啟動(dòng)的時(shí)候,容器也會(huì)隨之啟動(dòng),當(dāng) initial 進(jìn)程退出的時(shí)候,容器也會(huì)隨之退出。
因此,可以認(rèn)為容器的生命周期和 initial 進(jìn)程的生命周期是一致的。當(dāng)然,因?yàn)槿萜鲀?nèi)不只有這樣的一個(gè) initial 進(jìn)程,initial 進(jìn)程本身也可以產(chǎn)生其他的子進(jìn)程或者通過 docker exec 產(chǎn)生出來的運(yùn)維操作,也屬于 initial 進(jìn)程管理的范圍內(nèi)。當(dāng) initial 進(jìn)程退出的時(shí)候,所有的子進(jìn)程也會(huì)隨之退出,這樣也是為了防止資源的泄漏。
但是這樣的做法也會(huì)存在一些問題,首先應(yīng)用里面的程序往往是有狀態(tài)的,其可能會(huì)產(chǎn)生一些重要的數(shù)據(jù),當(dāng)一個(gè)容器退出被刪除之后,數(shù)據(jù)也就會(huì)丟失了,這對(duì)于應(yīng)用方而言是不能接受的,所以需要將容器所產(chǎn)生出來的重要數(shù)據(jù)持久化下來。容器能夠直接將數(shù)據(jù)持久化到指定的目錄上,這個(gè)目錄就稱之為數(shù)據(jù)卷。
數(shù)據(jù)卷有一些特點(diǎn),其中非常明顯的就是數(shù)據(jù)卷的生命周期是獨(dú)立于容器的生命周期的,也就是說容器的創(chuàng)建、運(yùn)行、停止、刪除等操作都和數(shù)據(jù)卷沒有任何關(guān)系,因?yàn)樗且粋€(gè)特殊的目錄,是用于幫助容器進(jìn)行持久化的。簡(jiǎn)單而言,我們會(huì)將數(shù)據(jù)卷掛載到容器內(nèi),這樣一來容器就能夠?qū)?shù)據(jù)寫入到相應(yīng)的目錄里面了,而且容器的退出并不會(huì)導(dǎo)致數(shù)據(jù)的丟失。
通常情況下,數(shù)據(jù)卷管理主要有兩種方式:
![](/d/20211016/b5867d1a0c3d863afef49ade639a5656.gif)
第一種是通過 bind 的方式,直接將宿主機(jī)的目錄直接掛載到容器內(nèi);這種方式比較簡(jiǎn)單,但是會(huì)帶來運(yùn)維成本,因?yàn)槠湟蕾囉谒拗鳈C(jī)的目錄,需要對(duì)于所有的宿主機(jī)進(jìn)行統(tǒng)一管理。
第二種是將目錄管理交給運(yùn)行引擎。
容器項(xiàng)目架構(gòu)
moby 容器引擎架構(gòu)
moby 是目前最流行的容器管理引擎,moby daemon 會(huì)對(duì)上提供有關(guān)于容器、鏡像、網(wǎng)絡(luò)以及 Volume的管理。moby daemon 所依賴的最重要的組件就是 containerd,containerd 是一個(gè)容器運(yùn)行時(shí)管理引擎,其獨(dú)立于 moby daemon ,可以對(duì)上提供容器、鏡像的相關(guān)管理。
containerd 底層有 containerd shim 模塊,其類似于一個(gè)守護(hù)進(jìn)程,這樣設(shè)計(jì)的原因有幾點(diǎn):
首先,containerd 需要管理容器生命周期,而容器可能是由不同的容器運(yùn)行時(shí)所創(chuàng)建出來的,因此需要提供一個(gè)靈活的插件化管理。而 shim 就是針對(duì)于不同的容器運(yùn)行時(shí)所開發(fā)的,這樣就能夠從 containerd 中脫離出來,通過插件的形式進(jìn)行管理。
其次,因?yàn)?shim 插件化的實(shí)現(xiàn),使其能夠被 containerd 動(dòng)態(tài)接管。如果不具備這樣的能力,當(dāng) moby daemon 或者 containerd daemon 意外退出的時(shí)候,容器就沒人管理了,那么它也會(huì)隨之消失、退出,這樣就會(huì)影響到應(yīng)用的運(yùn)行。
最后,因?yàn)殡S時(shí)可能會(huì)對(duì) moby 或者 containerd 進(jìn)行升級(jí),如果不提供 shim 機(jī)制,那么就無法做到原地升級(jí),也無法做到不影響業(yè)務(wù)的升級(jí),因此 containerd shim 非常重要,它實(shí)現(xiàn)了動(dòng)態(tài)接管的能力。
![](/d/20211016/374927b1ae9e7dfff758dc9de8504342.gif)
上面是只是針對(duì)于 moby 進(jìn)行一個(gè)大致的介紹。
容器 VS VM
容器和 VM 之間的差異
![](/d/20211016/d6ffaa0f7e179d83e512bb201fa3ff92.gif)
VM 利用 Hypervisor 虛擬化技術(shù)來模擬 CPU、內(nèi)存等硬件資源,這樣就可以在宿主機(jī)上建立一個(gè) Guest OS,這是常說的安裝一個(gè)虛擬機(jī)。
每一個(gè) Guest OS 都有一個(gè)獨(dú)立的內(nèi)核,比如 Ubuntu、CentOS 甚至是 Windows 等,在這樣的 Guest OS 之下,每個(gè)應(yīng)用都是相互獨(dú)立的,VM 可以提供一個(gè)更好的隔離效果。但這樣的隔離效果需要付出一定的代價(jià),因?yàn)樾枰岩徊糠值挠?jì)算資源交給虛擬化,這樣就很難充分利用現(xiàn)有的計(jì)算資源,并且每個(gè) Guest OS 都需要占用大量的磁盤空間,比如 Windows 操作系統(tǒng)的安裝需要 10~30G 的磁盤空間,Ubuntu 也需要 5~6G,同時(shí)這樣的方式啟動(dòng)很慢。正是因?yàn)樘摂M機(jī)技術(shù)的缺點(diǎn),催生出了容器技術(shù)。
容器是針對(duì)于進(jìn)程而言的,因此無需 Guest OS,只需要一個(gè)獨(dú)立的文件系統(tǒng)提供其所需要文件集合即可。所有的文件隔離都是進(jìn)程級(jí)別的,因此啟動(dòng)時(shí)間快于 VM,并且所需的磁盤空間也小于 VM。當(dāng)然了,進(jìn)程級(jí)別的隔離并沒有想象中的那么好,隔離效果相比 VM 要差很多。
總體而言:
容器和 VM 相比,各有優(yōu)劣,因此容器技術(shù)也在向著強(qiáng)隔離方向發(fā)展。
以上這篇Docker 容器生命周期 架構(gòu) 以及和VM之間的差異詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。