為什么建議一個容器中只運行一個進程

文章首發(fā)于:https://www.cnblogs.com/JasonCeng/p/14814888.html

在云原生與容器化時代浪潮下,大多數(shù)新手的普遍認識是“容器=虛擬機”,既然容器等同于虛擬機楞陷,那么在容器中想運行多少個進程就運行多少個進程捧颅。

作為從新手村走過來的人,筆者想為這個想法糾偏黄锤,避免大家和我走一樣的彎路搪缨。有兩個概念我們要理清:第一,容器不等同于虛擬機鸵熟;第二副编,容器中不建議運行多個進程。

本文以Docker容器為主要討論展開流强。

為什么說容器不等同于虛擬機呢痹届?

我們來看一個較為學術的定義:A docker container is not a full virtual machine to run a complete stack of application instances and services. Docker container is the application; or more accurately a service that helps to make up the application.即,Docker容器不是一個運行完整的應用程序?qū)嵗头斩褩5耐暾摂M機打月。Docker容器是一種應用程序队腐,或更準確地說是一種有助于構建應用程序的服務。

雖然容器不等同于虛擬機奏篙,但它們也有相似之處柴淘,容器與虛擬機擁有著類似的使命:對應用程序及其關聯(lián)性進行隔離,從而構建起一套能夠隨處運行的自容納單元秘通。此外为严,容器與虛擬機還擺脫了對物理硬件的直接控制,允許我們更為高效地使用計算資源肺稀,從而提升能源效率與成本效益第股。[1]

那么,容器和虛擬機的不同點究竟在哪呢盹靴?筆者在這里做了一個通俗形象的類比炸茧。首先瑞妇,對于物理機、虛擬機和容器在基礎架構上的不同梭冠,可以類比為獨棟別墅辕狰、小區(qū)樓盤和膠囊式公寓的區(qū)別。

物理機

物理機就像獨棟別墅控漠,擁有獨立的基礎設施蔓倍,水管、電線盐捷、地基等都由自己獨享偶翅,也就是說,網(wǎng)卡碉渡、內(nèi)存聚谁、CPU等硬件都由自身操作系統(tǒng)獨占。

物理機上的硬件可以看作是基礎設施(Infrastructure)滞诺,沒有基礎設施一切都無從談起形导,硬件之上則是主操作系統(tǒng)(Host Operating System)。除此之外习霹,還有各類基礎軟件朵耕,如各類硬件配套的驅(qū)動軟件。

這里還要再重點介紹的是Hypervisor淋叶,它(也稱為虛擬機監(jiān)視器或VMM)是創(chuàng)建和運行虛擬機(VM)的軟件阎曹。虛擬機管理程序通過虛擬共享其資源(例如內(nèi)存和CPU),使一臺主機可以支持多個Guest OS煞檩。

虛擬機

虛擬機就像小區(qū)樓盤处嫌,所有房子共享地基,但房子內(nèi)部有自己獨立了電線形娇、水管锰霜,雖然最終也是走的統(tǒng)一水電管網(wǎng)出小區(qū)。也就是說桐早,多個虛擬機之間癣缅,網(wǎng)卡、內(nèi)存哄酝、CPU等硬件雖然最終是共用一套友存,但在虛擬機內(nèi)部是由獨立的一套虛擬硬件進行運轉(zhuǎn)的。

前面我們介紹了hypervisor陶衅,hypervisor是一種虛擬化服務器的軟件屡立,這是在物理機及宿主機操作系統(tǒng)上運行虛擬機VM的基礎,它幫助我們對硬件進行虛擬化搀军。

虛擬機里的操作系統(tǒng)我們稱為Guest OS膨俐,這是一個完整的操作系統(tǒng)勇皇,只要安裝應用程序運行所必需的二進制文件和庫,在其之上便可以運行應用程序焚刺,且能確保各個虛擬機之間敛摘、虛擬機與宿主機之間的環(huán)境完全獨立、資源相互隔離乳愉。

由于虛擬機里運行的是一個完整的操作系統(tǒng)兄淫,且需要虛擬出Guest OS運行時所需的所有硬件的虛擬副本,這意味著虛擬機會占用大量系統(tǒng)資源蔓姚,特別是CPU和內(nèi)存的資源占用率會比較高捕虽,且虛擬機的空間占用可以高達數(shù)GB逼泣。不過在合理范圍內(nèi)揽祥,虛擬機可以利用固有的硬件資源虛擬出多臺完整VM,其存在仍然有價值月而,與單獨運行的物理機相比仍然是經(jīng)濟的挨措。

虛擬機是偉大的挖滤,它通過抽象來增加并行崩溪,服務于多操作系統(tǒng)的使用浅役,并提供業(yè)界最好的安全性。但對于隔離伶唯,它們相當昂貴觉既。[2]

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1. 虛擬機層級圖

容器

容器就像膠囊式公寓,所有隔間不僅共享地基乳幸,連電線瞪讼、水管也都是共享的,且每個隔間的空間有限粹断,彼此之間也相互隔離符欠。當然,他們是共用大房間里的基礎設施瓶埋,如公共空間希柿。

也就是說,容器是共用物理網(wǎng)卡养筒、內(nèi)存曾撤、CPU的。只有當他們之間需要通信時晕粪,才會采用容器層面的網(wǎng)橋docker0挤悉,而對于其他硬件,可以簡單認為每個容器占有了限定范圍內(nèi)的資源(如RAM巫湘、CPU等)装悲。

容器只是運行在宿主機上的一種特殊進程昏鹃,多個容器之間使用的還是同一個宿主機的操作系統(tǒng)內(nèi)核【髡铮可以認為盆顾,容器是一個不依賴于操作系統(tǒng),運行應用程序的環(huán)境畏梆。

容器通過Linux的Namespace和Cgroups技術對應用程序進程進行隔離和資源限制您宪。

Namespace的作用是環(huán)境隔離,它讓應用程序只看到該Namespace內(nèi)的世界奠涌。而Cgroups 的作用是限制分配給進程的宿主機資源宪巨。不過,對于宿主機來說溜畅,這些被“隔離”了的進程跟其他進程并沒有太大區(qū)別捏卓。

對于Namespace技術,這里做一個稍微深入一點的解讀慈格。通過Mount Namespace怠晴,容器可以修改進程對自己的文件系統(tǒng)“掛載點”的認知。在容器進程啟動之前重新掛載它的整個根目錄"/"浴捆,這個掛載在容器根目錄上蒜田、用來為容器進程提供隔離后執(zhí)行環(huán)境的文件系統(tǒng),就是所謂的“容器鏡像”选泻。它還有一個更為專業(yè)的名字冲粤,叫作:rootfs(根文件系統(tǒng))。rootfs只是一個操作系統(tǒng)所包含的文件页眯、配置和目錄梯捕,并不包括操作系統(tǒng)內(nèi)核。同一臺機器上的所有容器窝撵,都共享宿主機操作系統(tǒng)的內(nèi)核傀顾。[3]

Linux CGroup全稱Linux Control Group,是Linux內(nèi)核的一個功能碌奉,用來限制短曾,控制與分離一個進程組群的資源(如CPU、內(nèi)存道批、磁盤輸入輸出等)错英。Cgroup可讓您為系統(tǒng)中所運行任務(進程)的用戶定義組群分配資源—比如CPU時間、系統(tǒng)內(nèi)存隆豹、網(wǎng)絡帶寬或者這些資源的組合椭岩。您可以監(jiān)控您配置的Cgroup,拒絕Cgroup訪問某些資源,甚至在運行的系統(tǒng)中動態(tài)配置您的Cgroup判哥。[4]

回過頭來談談操作系統(tǒng)內(nèi)核献雅,由于同一臺宿主機上的所有容器都共享宿主機的操作系統(tǒng)內(nèi)核,那么如果有一個容器里的應用程序需要配置內(nèi)核參數(shù)塌计,跟內(nèi)核進行直接交互挺身,則這些參數(shù)對所有容器來說就像一個“全局變量”,牽一發(fā)而動全身锌仅。

這也是容器劣勢的主要原因章钾,正是因為容器共享宿主機操作系統(tǒng)內(nèi)核,因此不能像虛擬機一樣模擬出完整的硬件機器充當沙盒热芹,從而實現(xiàn)完全隔離贱傀。也就是說,容器是進程級的隔離伊脓,它可以通過影響宿主機操作系統(tǒng)內(nèi)核來影響其他容器府寒。

但容器還是有很多優(yōu)勢。首先报腔,容器的空間占用比虛擬機小很多株搔,甚至可以小到10MB,和虛擬機動則數(shù)GB相比十分小巧纯蛾;其次纤房,容器能輕松限制內(nèi)存和CPU使用率,相比虛擬機采用hypervisor來實現(xiàn)虛擬化更加輕量茅撞;同時帆卓,正是由于容器體積小、采用的技術(Containerzation Engine)更輕量米丘,使得它啟動十分迅速,這十分有利于快速擴展糊啡。

值得一提的是拄查,在DevOps理念日益流行的時代,容器對于持續(xù)集成和持續(xù)部署(CI/CD)實施也是極好的選擇棚蓄,它使得開發(fā)人員更容易構建堕扶、分發(fā)以及快速部署他們的應用程序。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖2. 容器層級圖

為什么說容器中不建議運行多個進程呢梭依?

聊過虛擬機與容器的區(qū)別之后稍算,讓我們暫時忘記架構和軟件工程哲學。在前面的討論中我們已經(jīng)知道役拴,容器其實是應用程序抽象出來的可相互隔離的線程糊探。盡管單個容器中確實可以運行多個應用程序,但出于實際原因,您可能需要考慮遵循“每個容器一個應用程序”的經(jīng)驗法則科平。

1褥紫、每個容器中只運行一個應用程序,則水平伸縮將變得十分容易瞪慧。例如髓考,當你需要一個Tomcate容器,可以從現(xiàn)有的容器再擴展出一個弃酌,但如果你的這個容器中不僅有Tomcate氨菇,還有MySQL等其他應用程序,事情就會變得復雜起來妓湘。

2门驾、每個容器中只運行一個應用程序,可以輕松地將其重新用于其他項目或目的多柑,極大增加復用度奶是。

3、每個容器中只運行一個應用程序竣灌,出現(xiàn)故障時開發(fā)人員能方便地對該故障容器進行問題排查聂沙,而不必對整個系統(tǒng)的各個部分進行排查,這也使得其更具有可移植性和可預測性初嘹。

4及汉、每個容器中只運行一個應用程序,升級程序時能夠?qū)⒂绊懛秶刂圃诟〉牧6韧头常瑯O大增加應用程序生命周期管理的靈活性坷随,避免在升級某個服務時中斷相同容器中的其他進程。

5驻龟、每個容器中只運行一個應用程序温眉,從安全性和隔離性角度來看,能夠提供更安全的服務和應用程序間的隔離翁狐,以保持強大的安全狀態(tài)或遵守PCI之類的規(guī)定类溢。[5]

話說回來,容器本身的設計露懒,就是希望容器和服務/應用能夠具備相同的生命周期闯冷。即:一個容器對應一個進程。這樣懈词,才能夠最好地應用容器編排來管理好容器和服務蛇耀。

綜上,建議單個容器中只運行一個獨立的進程坎弯。

參考

[1] https://blog.csdn.net/qq_24624539/article/details/103445229

[2] http://dockone.io/article/723

[3] https://zhuanlan.zhihu.com/p/157749762

[4] https://coolshell.cn/articles/17049.html

[5] https://devops.stackexchange.com/questions/447/why-it-is-recommended-to-run-only-one-process-in-a-container

(全文完)

更多關于大數(shù)據(jù)纺涤、分布式译暂、存儲、區(qū)塊鏈洒琢、Linux相關文章請關注微信公眾號:asympTech漸進線實驗室

Github秧秉、知乎、博客園衰抑、CSDN象迎、簡書全網(wǎng)唯一id:JasonCeng

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市呛踊,隨后出現(xiàn)的幾起案子砾淌,更是在濱河造成了極大的恐慌,老刑警劉巖谭网,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汪厨,死亡現(xiàn)場離奇詭異,居然都是意外死亡愉择,警方通過查閱死者的電腦和手機劫乱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锥涕,“玉大人衷戈,你說我怎么就攤上這事〔阕梗” “怎么了殖妇?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長破花。 經(jīng)常有香客問我谦趣,道長,這世上最難降的妖魔是什么座每? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任前鹅,我火速辦了婚禮,結果婚禮上尺栖,老公的妹妹穿的比我還像新娘嫡纠。我一直安慰自己,他們只是感情好延赌,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叉橱,像睡著了一般挫以。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窃祝,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天掐松,我揣著相機與錄音,去河邊找鬼。 笑死大磺,一個胖子當著我的面吹牛抡句,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杠愧,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼待榔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了流济?” 一聲冷哼從身側(cè)響起锐锣,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绳瘟,沒想到半個月后雕憔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡糖声,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年斤彼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蘸泻。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡琉苇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蟋恬,到底是詐尸還是另有隱情翁潘,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布歼争,位于F島的核電站拜马,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沐绒。R本人自食惡果不足惜俩莽,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乔遮。 院中可真熱鬧扮超,春花似錦、人聲如沸蹋肮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坯辩。三九已至馁龟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漆魔,已是汗流浹背坷檩。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工却音, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矢炼。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓系瓢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親句灌。 傳聞我的和親對象是個殘疾皇子夷陋,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容