完完整整地看完這個(gè)故事彭沼,你敢說(shuō)還不懂Docker缔逛?

程序員受苦久矣

多年前的一個(gè)夜晚,風(fēng)雨大作溜腐,一個(gè)名叫Docker的年輕人來(lái)到Linux帝國(guó)拜見(jiàn)帝國(guó)的長(zhǎng)老译株。

image.png


“Linux長(zhǎng)老,天下程序員苦于應(yīng)用部署久矣挺益,我要改變這一現(xiàn)狀歉糜,希望長(zhǎng)老你能幫幫我”

長(zhǎng)老回答:“哦,小小年紀(jì)望众,口氣不小匪补,先請(qǐng)入座,你有何所求烂翰,愿聞其詳”

Docker坐下后開(kāi)始侃侃而談:“當(dāng)今天下夯缺,應(yīng)用開(kāi)發(fā)、測(cè)試甘耿、部署踊兜,各種庫(kù)的依賴紛繁復(fù)雜,再加上版本之間的差異佳恬,經(jīng)常出現(xiàn)在開(kāi)發(fā)環(huán)境運(yùn)行正常捏境,而到測(cè)試環(huán)境和線上環(huán)境就出問(wèn)題的現(xiàn)象于游,程序員們飽受此苦,是時(shí)候改變這一狀況了垫言》“”


image.png

Docker回頭看了一眼長(zhǎng)老接著說(shuō)到:“我想做一個(gè)虛擬的容器,讓?xiě)?yīng)用程序們運(yùn)行其中筷频,將它們需要的依賴環(huán)境整體打包蚌成,以便在不同機(jī)器上移植后,仍然能提供一致的運(yùn)行環(huán)境凛捏,徹底將程序員們解放出來(lái)担忧!”

Linux長(zhǎng)老聽(tīng)聞,微微點(diǎn)頭:“年輕人想法不錯(cuò)坯癣,不過(guò)聽(tīng)你的描述涵妥,好像虛擬機(jī)就能解決這個(gè)問(wèn)題。將應(yīng)用和所依賴的環(huán)境部署到虛擬機(jī)中坡锡,然后做個(gè)快照,直接部署虛擬機(jī)不就可以了嗎窒所?”

Docker連連搖頭說(shuō)到:“長(zhǎng)老有所不知鹉勒,虛擬機(jī)這家伙笨重如牛,體積又大吵取,動(dòng)不動(dòng)就是以G為單位的大小禽额,因?yàn)樗锩嬉\(yùn)行一個(gè)完整的操作系統(tǒng),所以跑起來(lái)格外費(fèi)勁皮官,慢就不說(shuō)了脯倒,還非常占資源,一臺(tái)機(jī)器上跑不了幾臺(tái)虛擬機(jī)就把性能拖垮了捺氢!而我想要做一個(gè)輕量級(jí)的虛擬容器藻丢,只提供一個(gè)運(yùn)行環(huán)境,不用運(yùn)行一個(gè)操作系統(tǒng)摄乒,所有容器中的系統(tǒng)內(nèi)核還是和外面的宿主機(jī)共用的悠反,這樣就可以批量復(fù)制很多個(gè)容器,輕便又快捷

image.png

Linux長(zhǎng)老站了起來(lái)馍佑,來(lái)回踱步了幾圈斋否,思考片刻之后,忽然拍桌子大聲說(shuō)到:“真是個(gè)好想法拭荤,這個(gè)項(xiàng)目我投了茵臭!”

Docker眼里見(jiàn)光,喜上眉梢舅世,“這事還真離不開(kāi)長(zhǎng)老的幫助旦委,要實(shí)現(xiàn)我說(shuō)的目標(biāo)奇徒,對(duì)進(jìn)程的管理隔離都至關(guān)重要,還望長(zhǎng)老助我一臂之力社证!”

“你稍等”逼龟,Linux長(zhǎng)老轉(zhuǎn)身回到內(nèi)屋。沒(méi)多久就出來(lái)了追葡,手里拿了些什么東西腺律。

“年輕人,回去之后宜肉,盡管放手大干匀钧,我賜你三個(gè)錦囊,若遇難題谬返,可依次拆開(kāi)之斯,必有大用”

image.png

Docker開(kāi)心地收下了三個(gè)錦囊,拜別Linux長(zhǎng)老后遣铝,冒雨而歸佑刷。

錦囊1:chroot & pivot_root

受到長(zhǎng)老的鼓勵(lì),Docker充滿了干勁酿炸,很快就準(zhǔn)備啟動(dòng)他的項(xiàng)目瘫絮。

作為一個(gè)容器,首要任務(wù)就是限制容器中進(jìn)程的活動(dòng)范圍——能訪問(wèn)的文件系統(tǒng)目錄填硕。決不能讓容器中的進(jìn)程去肆意訪問(wèn)真實(shí)的系統(tǒng)目錄麦萤,得將他們的活動(dòng)范圍劃定到一個(gè)指定的區(qū)域,不得越雷池半步扁眯!

到底該如何限制這些進(jìn)程的活動(dòng)區(qū)域呢壮莹?Docker遇到了第一個(gè)難題。

苦思良久未果姻檀,Docker終于忍不住拆開(kāi)了Linux長(zhǎng)老送給自己的第一個(gè)錦囊命满,只見(jiàn)上面寫(xiě)了兩個(gè)函數(shù)的名字:chroot & pivot_root

Docker從未使用過(guò)這兩個(gè)函數(shù)绣版,于是在Linux帝國(guó)四處打聽(tīng)它們的作用周荐。后來(lái)得知,通過(guò)這兩個(gè)函數(shù)僵娃,可以修改進(jìn)程和系統(tǒng)的根目錄到一個(gè)新的位置概作。Docker大喜,長(zhǎng)老真是誠(chéng)不欺我默怨!

有了這兩個(gè)函數(shù)讯榕,Docker開(kāi)始想辦法怎么來(lái)“偽造”一個(gè)文件系統(tǒng)來(lái)欺騙容器中的進(jìn)程。

image.png

為了不露出破綻,Docker很聰明愚屁,用操作系統(tǒng)鏡像文件掛載到容器進(jìn)程的根目錄下济竹,變成容器的rootfs,和真實(shí)系統(tǒng)目錄一模一樣霎槐,足可以以假亂真:

$ ls /
bin dev etc home lib lib64 mnt opt proc root run sbin sys tmp usr var

錦囊2:namespace

文件系統(tǒng)的問(wèn)題總算解決了送浊,但是Docker不敢懈怠,因?yàn)樵谒睦锴鸬€有一個(gè)大問(wèn)題一直困擾著他袭景,那就是如何把真實(shí)系統(tǒng)所在的世界隱藏起來(lái),別讓容器中的進(jìn)程看到闭树。

比如進(jìn)程列表耸棒、網(wǎng)絡(luò)設(shè)備、用戶列表這些报辱,是決不能讓容器中的進(jìn)程知道的与殃,得讓他們看到的世界是一個(gè)干凈如新的系統(tǒng)。

Docker心里清楚碍现,自己雖然叫容器幅疼,但這只是表面現(xiàn)象,容器內(nèi)的進(jìn)程其實(shí)和自己一樣昼接,都是運(yùn)行在宿主操作系統(tǒng)上面的一個(gè)個(gè)進(jìn)程衣屏,想要遮住這些進(jìn)程的眼睛,瞞天過(guò)海辩棒,實(shí)在不是什么容易的事情。

Docker想過(guò)用HOOK的方式膨疏,欺騙進(jìn)程一睁,但實(shí)施起來(lái)工作太過(guò)復(fù)雜,兼容性差佃却,穩(wěn)定性也得不到保障者吁,思來(lái)想去也沒(méi)想到什么好的主意。

正在一籌莫展之際饲帅,Docker又想起了Linux長(zhǎng)老送給自己的錦囊复凳,他趕緊拿了出來(lái),打開(kāi)了第二個(gè)錦囊灶泵,只見(jiàn)上面寫(xiě)著:namespace育八。

Docker還是不解其中之意,于是又在Linux帝國(guó)到處打聽(tīng)什么是namespace赦邻。

經(jīng)過(guò)一陣琢磨髓棋,Docker總算是明白了,原來(lái)這個(gè)namespace是帝國(guó)提供的一種機(jī)制,通過(guò)它可以劃定一個(gè)個(gè)的命名空間按声,然后把進(jìn)程劃分到這些命名空間中膳犹。

image.png

而每個(gè)命名空間都是獨(dú)立存在的,命名空間里面的進(jìn)程都無(wú)法看到空間之外的進(jìn)程签则、用戶须床、網(wǎng)絡(luò)等等信息。

這不正是Docker想要的嗎渐裂?真是踏破鐵鞋無(wú)覓處豺旬,得來(lái)全不費(fèi)功夫!

Docker趕緊加班加點(diǎn)芯义,用上了這個(gè)namespace哈垢,將進(jìn)程的“視野”鎖定在容器規(guī)定的范圍內(nèi),如此一來(lái)扛拨,容器內(nèi)的進(jìn)程彷佛被施上了障眼法耘分,再也看不到外面的世界。

錦囊3:CGroup

文件系統(tǒng)和進(jìn)程隔離的問(wèn)題都解決了绑警,Docker心里的石頭總算是放下了求泰。心里著急著想測(cè)試自己的容器,可又好奇這最后一個(gè)錦囊寫(xiě)的是什么计盒,于是打開(kāi)了第三個(gè)錦囊渴频,只見(jiàn)上面寫(xiě)著:CGroup

這又是什么東西北启?Docker仍然看不懂卜朗,不過(guò)這一次管不了那么許多了,先運(yùn)行起來(lái)再說(shuō)咕村。

試著運(yùn)行了一段時(shí)間场钉,一切都在Docker的計(jì)劃之中,容器中的進(jìn)程都能正常的運(yùn)行懈涛,都被他構(gòu)建的虛擬文件系統(tǒng)和隔離出來(lái)的系統(tǒng)環(huán)境給欺騙了逛万,Docker高興壞了!

很快批钠,Docker就開(kāi)始在Linux帝國(guó)推廣自己的容器技術(shù)宇植,結(jié)果大受歡迎,收獲了無(wú)數(shù)粉絲埋心,連nginx指郁、redis等一眾大佬都紛紛入駐。

然而拷呆,鮮花與掌聲的背后坡氯,Docker卻不知道自己即將大難臨頭。

這天,Linux帝國(guó)內(nèi)存管理部的人扣下了Docker準(zhǔn)備“處決”掉他箫柳,Docker一臉詫異地問(wèn)到手形,“到底發(fā)生了什么事,為什么要對(duì)我下手悯恍?”

管理人員厲聲說(shuō)到:“帝國(guó)管理的內(nèi)存快被一個(gè)叫Redis的家伙用光了库糠,現(xiàn)在要挑選一些進(jìn)程來(lái)殺掉,不好意思涮毫,你中獎(jiǎng)了”

image.png

Redis瞬欧?這家伙不是我容器里的進(jìn)程嗎?Docker心中一驚罢防!

“兩位大人艘虎,我認(rèn)識(shí)帝國(guó)的長(zhǎng)老,麻煩通融通融咒吐,找別人去吧野建,Redis那家伙,我有辦法收拾他”

沒(méi)想到他還認(rèn)識(shí)帝國(guó)長(zhǎng)老恬叹,管理人員猶豫了一下候生,就放了Docker到別處去了。

驚魂未定的Docker绽昼,思來(lái)想去唯鸭,如果不對(duì)容器中的進(jìn)程加以管束,那簡(jiǎn)直太危險(xiǎn)了硅确!除了內(nèi)存目溉,還有CPU、硬盤(pán)菱农、網(wǎng)絡(luò)等等資源缭付,如果某個(gè)容器進(jìn)程霸占著CPU不放手,又或者某個(gè)容器進(jìn)程瘋狂寫(xiě)硬盤(pán)大莫,那遲早得連累到自己身上」俜荩看來(lái)必須得對(duì)這些進(jìn)程進(jìn)行管控只厘,防止他們干出出格的事來(lái)。

這時(shí)候舅巷,他想起了Linux長(zhǎng)老的第三個(gè)錦囊:CGroup羔味!說(shuō)不定能解這燃眉之急。

經(jīng)過(guò)一番研究钠右,Docker如獲至寶赋元,原來(lái)這CGroup和namespace類似,也是Linux帝國(guó)的一套機(jī)制,通過(guò)它可以劃定一個(gè)個(gè)的分組搁凸,然后限制每個(gè)分組能夠使用的資源媚值,比如內(nèi)存的上限值、CPU的使用率护糖、硬盤(pán)空間總量等等褥芒。系統(tǒng)內(nèi)核會(huì)自動(dòng)檢查和限制這些分組中的進(jìn)程資源使用量。

image.png

Linux長(zhǎng)老這三個(gè)錦囊簡(jiǎn)直太貼心了嫡良,一個(gè)比一個(gè)有用锰扶,Docker內(nèi)心充滿了感激。

隨后寝受,Docker加上了CGroup技術(shù)坷牛,加強(qiáng)了對(duì)容器中的進(jìn)程管控,這才松了一口氣很澄。

在Linux長(zhǎng)老三個(gè)錦囊妙計(jì)的加持下京闰,Docker可謂風(fēng)光一時(shí),成為了Linux帝國(guó)的大名人痴怨。

然而忙干,能力越大,責(zé)任越大浪藻,讓Docker沒(méi)想到的是捐迫,新的挑戰(zhàn)還在后面。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末爱葵,一起剝皮案震驚了整個(gè)濱河市施戴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萌丈,老刑警劉巖赞哗,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異辆雾,居然都是意外死亡肪笋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)度迂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)藤乙,“玉大人,你說(shuō)我怎么就攤上這事惭墓√沉海” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵腊凶,是天一觀的道長(zhǎng)划咐。 經(jīng)常有香客問(wèn)我拴念,道長(zhǎng),這世上最難降的妖魔是什么褐缠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任政鼠,我火速辦了婚禮,結(jié)果婚禮上送丰,老公的妹妹穿的比我還像新娘缔俄。我一直安慰自己,他們只是感情好器躏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布俐载。 她就那樣靜靜地躺著,像睡著了一般登失。 火紅的嫁衣襯著肌膚如雪遏佣。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天揽浙,我揣著相機(jī)與錄音状婶,去河邊找鬼。 笑死馅巷,一個(gè)胖子當(dāng)著我的面吹牛膛虫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钓猬,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼稍刀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了敞曹?” 一聲冷哼從身側(cè)響起账月,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澳迫,沒(méi)想到半個(gè)月后局齿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡橄登,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年抓歼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拢锹。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谣妻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出面褐,到底是詐尸還是另有隱情拌禾,我是刑警寧澤取胎,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布展哭,位于F島的核電站湃窍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏匪傍。R本人自食惡果不足惜您市,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望役衡。 院中可真熱鬧茵休,春花似錦、人聲如沸手蝎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)棵介。三九已至钉鸯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邮辽,已是汗流浹背唠雕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吨述,地道東北人岩睁。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像揣云,于是被迫代替她去往敵國(guó)和親捕儒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 寫(xiě)這篇文章主要是為了今后畢業(yè)論文素材上的整理灵再,同時(shí)對(duì)docker進(jìn)行鞏固溫習(xí)肋层。大綱: docker簡(jiǎn)介docker...
    胡圖仙人閱讀 7,394評(píng)論 2 96
  • Docker容器技術(shù)已經(jīng)發(fā)展了好些年,在很多項(xiàng)目都有應(yīng)用翎迁,線上運(yùn)行也很穩(wěn)定栋猖。整理了部分Docker的學(xué)習(xí)筆記以及新...
    __七把刀__閱讀 11,427評(píng)論 0 59
  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡(jiǎn)介 Docke...
    極客圈閱讀 10,473評(píng)論 0 120
  • Docker是基于容器的應(yīng)用開(kāi)發(fā)汪榔,部署和運(yùn)行平臺(tái) 高性能:相比傳統(tǒng)虛擬機(jī)蒲拉,不需要hepervisor的額外負(fù)載,而...
    wangdy12閱讀 1,602評(píng)論 0 0
  • 原文鏈接 鏈接[https://fightinggg.github.io/QRN6OO.html] 容器與開(kāi)發(fā)語(yǔ)言...
    polin_2717閱讀 787評(píng)論 0 1