容器技術(shù)中K8s或Docker應(yīng)該選哪個(gè)?

談到容器技術(shù),有兩個(gè)名字出現(xiàn)在開(kāi)源領(lǐng)導(dǎo)者的行列中:Kubernetes和Docker。雖然它們是從根本上不同的技術(shù),可以幫助用戶進(jìn)行容器管理,但它們是互補(bǔ)的,并且在組合時(shí)可以非常強(qiáng)大。在這方面,選擇使用Kubernetes或Docker并不是決定哪個(gè)選項(xiàng)更好的問(wèn)題;事實(shí)上,它們之間沒(méi)有競(jìng)爭(zhēng),實(shí)際上可以串聯(lián)使用。因此,對(duì)于Kubernetes或Docker哪個(gè)是更好的選擇的問(wèn)題,答案是二者是互補(bǔ)的。
同時(shí),Kubernetes和Docker是互補(bǔ)的容器技術(shù)這一事實(shí)澄清了另一個(gè)常見(jiàn)的問(wèn)題“Kubernete是否正在取代Docker?”的答案。Kubernetes不是一種競(jìng)爭(zhēng)技術(shù)。這個(gè)問(wèn)題可能源于2021年的新聞,即Kubernete將不再支持Docker作為容器運(yùn)行時(shí)選項(xiàng)(即,在整個(gè)容器化過(guò)程中與操作系統(tǒng)(OS)內(nèi)核通信的容器組件)。然而,Kubernetes和Docker仍然兼容,并在一起使用時(shí)提供明顯的好處,我們將在本文后面更詳細(xì)地探討。首先,重要的是從將Kubernetes和Docker連接在一起的基礎(chǔ)技術(shù)開(kāi)始——容器。
什么是容器?
容器是軟件的可執(zhí)行單元,它將應(yīng)用程序代碼與其依賴項(xiàng)打包,使其能夠在任何it基礎(chǔ)架構(gòu)上運(yùn)行。容器獨(dú)立;它是從主機(jī)操作系統(tǒng)(通常是Linux)中抽象出來(lái)的,這使得它可以跨it環(huán)境移植。
理解容器概念的一種方法是將其與虛擬機(jī)(VM)進(jìn)行比較。兩者都基于虛擬化技術(shù),但當(dāng)容器虛擬化操作系統(tǒng)時(shí),虛擬機(jī)利用虛擬機(jī)管理程序(VM和計(jì)算機(jī)硬件之間的輕量級(jí)軟件層)來(lái)虛擬化物理硬件。
在傳統(tǒng)虛擬化中,每個(gè)虛擬機(jī)都包含來(lái)賓操作系統(tǒng)(OS)的完整副本、運(yùn)行OS和應(yīng)用程序(及其關(guān)聯(lián)的庫(kù)和依賴項(xiàng))所需的硬件的虛擬副本。另一方面,容器僅包括應(yīng)用程序及其庫(kù)和依賴項(xiàng)。沒(méi)有客戶主機(jī)顯著減小了容器的大小,使其變得輕量級(jí)、快速和可移植。此外,容器會(huì)自動(dòng)使用主機(jī)的DNS設(shè)置。

有關(guān)容器和虛擬機(jī)之間差異的完整講解,請(qǐng)參考中培IT學(xué)院虛擬化容器技術(shù)Docker+K8s培訓(xùn)課程中的講解。
工程師可以使用容器快速開(kāi)發(fā)在大量分布式系統(tǒng)和跨平臺(tái)環(huán)境中一致運(yùn)行的應(yīng)用程序。容器的可移植性消除了許多由功能團(tuán)隊(duì)之間的工具和軟件差異引起的沖突。
這使得它們特別適合于DevOps工作流,為開(kāi)發(fā)人員和IT運(yùn)營(yíng)人員跨環(huán)境協(xié)作提供了便利。小型和輕量級(jí)的容器也是微服務(wù)架構(gòu)的理想選擇,在微服務(wù)架構(gòu)中,應(yīng)用程序由松散耦合的較小服務(wù)組成。而容器化通常是實(shí)現(xiàn)內(nèi)部部署應(yīng)用程序現(xiàn)代化并將其與云服務(wù)集成的第一步。
Docker是什么?
Docker是一個(gè)開(kāi)源的容器化平臺(tái)?;旧?,它是一個(gè)工具包,使開(kāi)發(fā)人員更容易、更安全和更快地構(gòu)建、部署和管理容器。該工具包也稱為容器。
盡管它最初是一個(gè)開(kāi)源項(xiàng)目,但Docker今天也指Docker有限公司,一家生產(chǎn)商用Docker產(chǎn)品的公司。目前,無(wú)論開(kāi)發(fā)人員使用Windows、Linux還是MacOS,它都是創(chuàng)建容器的最流行工具。
事實(shí)上,在Docker于2013年發(fā)布之前,容器技術(shù)已經(jīng)存在了幾十年。在早期,Linux容器(或LXC)是其中最流行的。Docker是建立在LXC上的,但Docker的定制技術(shù)很快超過(guò)了LXC,成為最受歡迎的集裝箱化平臺(tái)。
Docker的關(guān)鍵屬性之一是其可移植性。Docker容器可以在任何桌面、數(shù)據(jù)中心或云環(huán)境中運(yùn)行。每個(gè)容器中只能運(yùn)行一個(gè)進(jìn)程,因此應(yīng)用程序能夠在其一部分進(jìn)行更新或修復(fù)時(shí)連續(xù)運(yùn)行。
Docker常用的一些工具和術(shù)語(yǔ)包括:
Docker Engine:允許開(kāi)發(fā)人員構(gòu)建和運(yùn)行容器的運(yùn)行時(shí)環(huán)境。
Dockerfile:一個(gè)簡(jiǎn)單的文本文件,定義構(gòu)建Docker容器映像所需的一切,如操作系統(tǒng)網(wǎng)絡(luò)規(guī)范和文件位置。它本質(zhì)上是Docker Engine將運(yùn)行以組裝映像的命令列表。
Docker Compose:用于定義和運(yùn)行多容器應(yīng)用程序的工具。它創(chuàng)建一個(gè)YAML文件來(lái)指定應(yīng)用程序中包括哪些服務(wù),并可以通過(guò)Docker CLI使用單個(gè)命令部署和運(yùn)行容器。
現(xiàn)在,讓我們回顧一下為什么Kubernetes停止支持Docker作為容器運(yùn)行。如本節(jié)頂部所述,Docker是容器化的,而不是容器運(yùn)行時(shí)。這意味著Docker位于底層容器運(yùn)行時(shí)之上,通過(guò)用戶界面為用戶提供功能和工具。為了支持Docker作為運(yùn)行時(shí),Kubernetes必須支持和實(shí)現(xiàn)一個(gè)單獨(dú)的運(yùn)行時(shí),稱為Docker Shim,它本質(zhì)上介于兩種技術(shù)之間,并幫助它們通信。
這是在沒(méi)有大量容器運(yùn)行時(shí)可用的時(shí)候完成的。然而,現(xiàn)在有了一個(gè)這樣的容器運(yùn)行時(shí)的例子——有了CRI-O——Kubernetes可以為用戶提供大量容器運(yùn)行時(shí)選項(xiàng),其中許多使用標(biāo)準(zhǔn)容器運(yùn)行時(shí)接口(CRI),這是Kubernete和容器運(yùn)行時(shí)可靠通信的一種方式,而沒(méi)有中間層作為中間層。
然而,即使Kubernetes不再作為運(yùn)行時(shí)為Docker提供特殊支持,它仍然可以運(yùn)行和管理使用Open Container Initiative(OCI)構(gòu)建的容器,這是Docker自己的圖像格式,允許您使用Dockerfiles和構(gòu)建Docker圖像。換句話說(shuō),Dockers在Kubernetes生態(tài)系統(tǒng)中仍有許多可提供的功能。
Docker的優(yōu)勢(shì)是什么?
Docker容器化平臺(tái)提供了前面提到的容器的所有好處,包括:
輕量級(jí)可移植性:容器化應(yīng)用程序可以從任何環(huán)境移動(dòng)到另一個(gè)環(huán)境(無(wú)論Docker在哪里運(yùn)行),并且它們將在不考慮操作系統(tǒng)的情況下運(yùn)行。
敏捷應(yīng)用程序開(kāi)發(fā):容器化使采用CI/CD過(guò)程和利用敏捷方法(如DevOps)變得更容易。例如,可以在一個(gè)環(huán)境中測(cè)試容器化應(yīng)用程序,并將其部署到另一個(gè)環(huán)境,以響應(yīng)快速變化的業(yè)務(wù)需求。
可擴(kuò)展性:可以快速創(chuàng)建Docker容器,并且可以同時(shí)高效地管理多個(gè)容器。
其他Docker API功能包括自動(dòng)跟蹤和回滾容器映像的功能,使用現(xiàn)有容器作為基本映像來(lái)構(gòu)建新容器,以及基于應(yīng)用程序源代碼構(gòu)建容器。Docker得到了一個(gè)充滿活力的開(kāi)發(fā)人員社區(qū)的支持,該社區(qū)通過(guò)Docker Hub在互聯(lián)網(wǎng)上共享數(shù)千個(gè)容器。
但是,盡管Docker在較小的應(yīng)用程序上做得很好,但大型企業(yè)應(yīng)用程序可能涉及大量容器——有時(shí)是數(shù)百個(gè)甚至數(shù)千個(gè)——這對(duì)于負(fù)責(zé)管理它們的IT團(tuán)隊(duì)來(lái)說(shuō)是壓倒性的。這就是容器編排的用武之地。Docker有自己的編排工具Docker Swarm,但到目前為止,最流行和最強(qiáng)大的選項(xiàng)是Kubernetes。
請(qǐng)參閱中培IT學(xué)院虛擬化容器技術(shù)Docker+K8s培訓(xùn)課程。
Docker有幾個(gè)用于創(chuàng)建和運(yùn)行容器的命令:
docker build:該命令從源代碼(即,從Dockerfile和必要的文件)構(gòu)建新的docker映像。
docker create:該命令從圖像創(chuàng)建新的docker圖像,而不啟動(dòng)它,這涉及在圖像上創(chuàng)建可寫容器層并準(zhǔn)備它。
docker run:該命令的工作方式與docker create命令完全相同,只是它需要在創(chuàng)建后運(yùn)行它的附加步驟。
docker exec:該命令用于在已經(jīng)運(yùn)行的容器內(nèi)執(zhí)行新命令。
什么是Kubernetes?

Kubernetes是一個(gè)開(kāi)源容器編排平臺(tái),用于調(diào)度和自動(dòng)化容器化應(yīng)用程序的部署、管理和擴(kuò)展。容器在稱為“集群”的多容器體系結(jié)構(gòu)中運(yùn)行。Kubernetes集群包括一個(gè)指定為控制平面的容器,該控制平面為集群中的其余容器(或工作節(jié)點(diǎn))調(diào)度工作負(fù)載。
主節(jié)點(diǎn)確定應(yīng)用程序(或Docker容器)的宿主位置,決定如何將它們放在一起,并管理它們的編排。通過(guò)將組成應(yīng)用程序的容器分組到集群中,Kubernetes促進(jìn)了服務(wù)發(fā)現(xiàn),并支持在容器的整個(gè)生命周期中管理大量容器。
2014年,谷歌將Kubernetes作為開(kāi)源項(xiàng)目推出?,F(xiàn)在,它由一個(gè)名為云本地計(jì)算基金會(huì)(CNCF)的開(kāi)源軟件基金會(huì)管理。Kubernetes專為生產(chǎn)環(huán)境中的容器編排而設(shè)計(jì),之所以受歡迎,部分原因是它強(qiáng)大的功能、一個(gè)活躍的開(kāi)源社區(qū),有數(shù)千名貢獻(xiàn)者,以及在領(lǐng)先的公共云提供商(例如,IBM cloud、Google、Azure和AWS)之間的支持和可移植性。
Kubernetes的優(yōu)勢(shì)是什么?
自動(dòng)化部署:Kubernetes跨多個(gè)計(jì)算節(jié)點(diǎn)(可以是VM或裸機(jī)服務(wù)器)調(diào)度和自動(dòng)化容器部署。
服務(wù)發(fā)現(xiàn)和負(fù)載平衡:它在互聯(lián)網(wǎng)上公開(kāi)容器,并在流量峰值發(fā)生時(shí)采用負(fù)載平衡來(lái)保持穩(wěn)定性。
自動(dòng)擴(kuò)展功能:自動(dòng)啟動(dòng)新容器來(lái)處理重負(fù)載,無(wú)論是基于CPU使用率、內(nèi)存閾值還是自定義度量。
自愈能力:Kubernetes在容器發(fā)生故障或節(jié)點(diǎn)死亡時(shí)重新啟動(dòng)、替換或重新調(diào)度容器,并殺死不響應(yīng)用戶定義的健康檢查的容器。
自動(dòng)推出和回滾:它推出應(yīng)用程序更改,并監(jiān)控應(yīng)用程序健康狀況以了解任何問(wèn)題,如果出現(xiàn)問(wèn)題,則回滾更改。
存儲(chǔ)編排:根據(jù)需要自動(dòng)裝載所選的持久本地或云存儲(chǔ)系統(tǒng),以減少延遲并改善用戶體驗(yàn)。
動(dòng)態(tài)卷配置:允許群集管理員創(chuàng)建存儲(chǔ)卷,而不必手動(dòng)調(diào)用其存儲(chǔ)提供程序或創(chuàng)建對(duì)象。
有關(guān)更多信息,請(qǐng)參閱我們的視頻“Kubernetes Explained”:
集成以更好地自動(dòng)化和管理應(yīng)用程序
后來(lái)的Docker版本內(nèi)置了與Kubernetes的集成。該功能使開(kāi)發(fā)團(tuán)隊(duì)能夠更有效地自動(dòng)化和管理Docker幫助他們構(gòu)建的所有容器化應(yīng)用程序。
最后,問(wèn)題是您的團(tuán)隊(duì)需要如何掌握K8S和Docker組合來(lái)實(shí)現(xiàn)其業(yè)務(wù)目標(biāo)。通過(guò)中培IT學(xué)院的虛擬化容器技術(shù)Docker+K8s培訓(xùn)課程你的團(tuán)隊(duì)可以學(xué)習(xí)Kubernetes(K8s)的架構(gòu)與應(yīng)用;掌握基于Docker和Kubernetes的企業(yè)應(yīng)用架構(gòu);掌握基于虛擬化容器Docker與Kubernetes的體系架構(gòu)、管理、部署,以及相應(yīng)組件的原理和應(yīng)用場(chǎng)景;讓學(xué)員具備部署基于企業(yè)虛擬化云平臺(tái)環(huán)境的能力。
