先行奉上我自己學(xué)習(xí)Docker的思維導(dǎo)圖
思維導(dǎo)圖百度云地址:提取碼為d5jh伍玖,有需要的可以自取
下面我將按照思維導(dǎo)圖的一步步展開(kāi)Docker的相關(guān)知識(shí)嫩痰;
首先,我們需要知道Docker是什么?
Docker 使用 Google 公司推出的 Go 語(yǔ)言 進(jìn)行開(kāi)發(fā)實(shí)現(xiàn)窍箍,基于 Linux 內(nèi)核的 cgroup串纺,namespace,以及 AUFS 類(lèi)的 Union FS 等技術(shù)椰棘,對(duì)進(jìn)程進(jìn)行封裝隔離纺棺,屬于 操作系統(tǒng)層面的虛擬化技術(shù)。由于隔離的進(jìn)程獨(dú)立于宿主和其它的隔離的進(jìn)程晰搀,因此也稱(chēng)其為容器五辽。最初實(shí)現(xiàn)是基于 LXC办斑,從 0.7 版本以后開(kāi)始去除 LXC外恕,轉(zhuǎn)而使用自行開(kāi)發(fā)的 libcontainer,從 1.11 開(kāi)始乡翅,則進(jìn)一步演進(jìn)為使用 runC 和 containerd鳞疲。
通俗的講,就是一個(gè)新的虛擬化技術(shù)蠕蚜。
它的架構(gòu)如下圖所示
那么Docker和傳統(tǒng)的虛擬機(jī)技術(shù)有什么區(qū)別呢尚洽?
Docker和傳統(tǒng)的虛擬化技術(shù)的區(qū)別在于傳統(tǒng)虛擬機(jī)技術(shù)是虛擬出一套硬件后,在其上運(yùn)行一個(gè)完整操作系統(tǒng)靶累,在該系統(tǒng)上再運(yùn)行所需應(yīng)用進(jìn)程腺毫;而容器內(nèi)的應(yīng)用進(jìn)程直接運(yùn)行于宿主的內(nèi)核癣疟,容器內(nèi)沒(méi)有自己的內(nèi)核,而且也沒(méi)有進(jìn)行硬件虛擬潮酒。因此容器要比傳統(tǒng)虛擬機(jī)更為輕便睛挚。
具體的對(duì)比如下圖所示:
通俗解釋?zhuān)篋ocker的虛擬化更加輕量級(jí),是容器級(jí)別急黎,進(jìn)程級(jí)別的虛擬化扎狱,傳統(tǒng)的虛擬化是操作系統(tǒng)的虛擬化,也就是說(shuō)Docker的虛擬化只虛擬化應(yīng)用勃教,不用復(fù)制一套操作系統(tǒng)淤击。
既然如此,那么Docker的具體作用體現(xiàn)在哪些方面呢?
Docker能夠解決傳統(tǒng)虛擬技術(shù)的如下弊端:
1故源、更高效的利用系統(tǒng)資源
2污抬、更快速的啟動(dòng)時(shí)間
3、一致的運(yùn)行環(huán)境
4心软、持續(xù)交付和部署
5壕吹、更輕松的遷移
6、更輕松的維護(hù)和擴(kuò)展
Docker 使用的分層存儲(chǔ)以及鏡像的技術(shù)删铃,使得應(yīng)用重復(fù)部分的復(fù)用更為容易耳贬,也使得應(yīng)用的維護(hù)更新更加簡(jiǎn)單,基于基礎(chǔ)鏡像進(jìn)一步擴(kuò)展鏡像也變得非常簡(jiǎn)單猎唁。此外咒劲,Docker 團(tuán)隊(duì)同各個(gè)開(kāi)源項(xiàng)目團(tuán)隊(duì)一起維護(hù)了一大批高質(zhì)量的 官方鏡像,既可以直接在生產(chǎn)環(huán)境使用诫隅,又可以作為基礎(chǔ)進(jìn)一步定制腐魂,大大的降低了應(yīng)用服務(wù)的鏡像制作成本
那么Docker是通過(guò)那些方式來(lái)實(shí)現(xiàn)這種虛擬化呢?
這里我們介紹Docker的三大核心概念:
1逐纬、鏡像:鏡像是Docker中最為核心的一個(gè)技術(shù)蛔屹,其核心是采用了聯(lián)合文件系統(tǒng)實(shí)現(xiàn)的分層存儲(chǔ)技術(shù),每一個(gè)鏡像的構(gòu)建都是由多層只讀層組成的;Docker 鏡像是一個(gè)特殊的文件系統(tǒng)豁生,除了提供容器運(yùn)行時(shí)所需的程序兔毒、庫(kù)、資源甸箱、配置等文件外育叁,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量芍殖、用戶(hù)等)豪嗽。鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變。
因?yàn)殓R像包含操作系統(tǒng)完整的 root 文件系統(tǒng)龟梦,其體積往往是龐大的隐锭,因此在 Docker 設(shè)計(jì)時(shí),就充分利用 Union FS 的技術(shù)计贰,將其設(shè)計(jì)為分層存儲(chǔ)的架構(gòu)成榜。所以嚴(yán)格來(lái)說(shuō),鏡像并非是像一個(gè) ISO 那樣的打包文件蹦玫,鏡像只是一個(gè)虛擬的概念赎婚,其實(shí)際體現(xiàn)并非由一個(gè)文件組成,而是由一組文件系統(tǒng)組成樱溉,或者說(shuō)挣输,由多層文件系統(tǒng)聯(lián)合組成。
鏡像構(gòu)建時(shí)福贞,會(huì)一層層構(gòu)建撩嚼,前一層是后一層的基礎(chǔ)。每一層構(gòu)建完就不會(huì)再發(fā)生改變挖帘,后一層上的任何改變只發(fā)生在自己這一層完丽。比如,刪除前一層文件的操作拇舀,實(shí)際不是真的刪除前一層的文件逻族,而是僅在當(dāng)前層標(biāo)記為該文件已刪除。在最終容器運(yùn)行的時(shí)候骄崩,雖然不會(huì)看到這個(gè)文件聘鳞,但是實(shí)際上該文件會(huì)一直跟隨鏡像。因此要拂,在構(gòu)建鏡像的時(shí)候抠璃,需要額外小心,每一層盡量只包含該層需要添加的東西脱惰,任何額外的東西應(yīng)該在該層構(gòu)建結(jié)束前清理掉搏嗡。
分層存儲(chǔ)的特征還使得鏡像的復(fù)用、定制變的更為容易拉一。甚至可以用之前構(gòu)建好的鏡像作為基礎(chǔ)層采盒,然后進(jìn)一步添加新的層,以定制自己所需的內(nèi)容舅踪,構(gòu)建新的鏡像纽甘。
2良蛮、容器:鏡像(Image)和容器(Container)的關(guān)系抽碌,就像是面向?qū)ο蟪绦蛟O(shè)計(jì)中的 類(lèi) 和 實(shí)例 一樣,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時(shí)的實(shí)體货徙。容器可以被創(chuàng)建左权、啟動(dòng)、停止痴颊、刪除赏迟、暫停等。
容器的實(shí)質(zhì)是進(jìn)程蠢棱,但與直接在宿主執(zhí)行的進(jìn)程不同锌杀,容器進(jìn)程運(yùn)行于屬于自己的獨(dú)立的 命名空間。因此容器可以擁有自己的 root 文件系統(tǒng)泻仙、自己的網(wǎng)絡(luò)配置糕再、自己的進(jìn)程空間,甚至自己的用戶(hù) ID 空間玉转。容器內(nèi)的進(jìn)程是運(yùn)行在一個(gè)隔離的環(huán)境里突想,使用起來(lái),就好像是在一個(gè)獨(dú)立于宿主的系統(tǒng)下操作一樣究抓。這種特性使得容器封裝的應(yīng)用比直接在宿主運(yùn)行更加安全猾担。也因?yàn)檫@種隔離的特性,很多人初學(xué) Docker 時(shí)常常會(huì)混淆容器和虛擬機(jī)刺下。
前面講過(guò)鏡像使用的是分層存儲(chǔ)绑嘹,容器也是如此。每一個(gè)容器運(yùn)行時(shí)橘茉,是以鏡像為基礎(chǔ)層圾叼,在其上創(chuàng)建一個(gè)當(dāng)前容器的存儲(chǔ)層,我們可以稱(chēng)這個(gè)為容器運(yùn)行時(shí)讀寫(xiě)而準(zhǔn)備的存儲(chǔ)層為 容器存儲(chǔ)層捺癞。
容器存儲(chǔ)層的生存周期和容器一樣夷蚊,容器消亡時(shí),容器存儲(chǔ)層也隨之消亡髓介。因此惕鼓,任何保存于容器存儲(chǔ)層的信息都會(huì)隨容器刪除而丟失。
按照 Docker 最佳實(shí)踐的要求唐础,容器不應(yīng)該向其存儲(chǔ)層內(nèi)寫(xiě)入任何數(shù)據(jù)箱歧,容器存儲(chǔ)層要保持無(wú)狀態(tài)化。所有的文件寫(xiě)入操作一膨,都應(yīng)該使用 數(shù)據(jù)卷(Volume)呀邢、或者綁定宿主目錄,在這些位置的讀寫(xiě)會(huì)跳過(guò)容器存儲(chǔ)層豹绪,直接對(duì)宿主(或網(wǎng)絡(luò)存儲(chǔ))發(fā)生讀寫(xiě)价淌,其性能和穩(wěn)定性更高。
數(shù)據(jù)卷的生存周期獨(dú)立于容器,容器消亡蝉衣,數(shù)據(jù)卷不會(huì)消亡括尸。因此,使用數(shù)據(jù)卷后病毡,容器刪除或者重新運(yùn)行之后濒翻,數(shù)據(jù)卻不會(huì)丟失。
3啦膜、倉(cāng)庫(kù):鏡像構(gòu)建完成后有送,可以很容易的在當(dāng)前宿主機(jī)上運(yùn)行,但是僧家,如果需要在其它服務(wù)器上使用這個(gè)鏡像娶眷,我們就需要一個(gè)集中的存儲(chǔ)、分發(fā)鏡像的服務(wù)啸臀,Docker Registry 就是這樣的服務(wù)届宠。簡(jiǎn)單理解為git倉(cāng)庫(kù)或者maven私服即可。
參考文章:Docker底層實(shí)現(xiàn)乘粒、這可能是最為詳細(xì)的Docker入門(mén)吐血總結(jié)
未完待續(xù)豌注。。灯萍。轧铁。