微信QQ
97971665
其實(shí) Docker 和 k8s 并非直接的競爭對手兩者相互依存。 Docker 是一個(gè)容器化平臺(tái),而 k8s 是 Docker 等容器平臺(tái)的協(xié)調(diào)器。
1、容器化時(shí)代
(1)虛擬化技術(shù)已經(jīng)走過是三個(gè)時(shí)代,沒有容器化技術(shù)的研究就不會(huì)有Docker技術(shù)的誕生。
1)物理機(jī)時(shí)代: 多個(gè)應(yīng)用程序排在一臺(tái)機(jī)器上。
2)虛擬機(jī)時(shí)代:一臺(tái)物理機(jī)器安裝多個(gè)虛擬機(jī)(VM),一個(gè)虛擬機(jī)跑多個(gè)程序。
3)容器化時(shí)代:一臺(tái)物理機(jī)器安裝多個(gè)容器實(shí)例(Container),一個(gè)容器跑多個(gè)程序。
(2)容器化解決了什么問題?
用一段話描述:
測試人員:你這個(gè)功能有問題。
開發(fā)人員:我本地是好的呀!
開發(fā)人員編寫代碼,在自己本地環(huán)境測試完成后,將代碼部署到測試或生產(chǎn)環(huán)境中經(jīng)常會(huì)遇到各種各樣的問題。明明本地完美運(yùn)行的代碼為什么部署后出現(xiàn)很多 bug,原因有很多:不同的操作系統(tǒng)、不同的依賴庫等??偨Y(jié)一句話:因?yàn)楸镜丨h(huán)境和遠(yuǎn)程環(huán)境不一致。
容器化技術(shù)正好解決了這一關(guān)鍵問題,它將軟件程序和運(yùn)行的基礎(chǔ)環(huán)境分開。開發(fā)人員編碼完成后將程序打包到一個(gè)容器鏡像中,鏡像中詳細(xì)列出了所依賴的環(huán)境,在不同的容器中運(yùn)行標(biāo)準(zhǔn)化的鏡像,從根本上解決了環(huán)境不一致的問題。
注:容器的概念已經(jīng)出現(xiàn)不短的時(shí)間。但直到 2013 年開源項(xiàng)目 Docker 的出現(xiàn)才極大推廣了容器這項(xiàng)技術(shù),并推動(dòng)了軟件開發(fā)中容器化和微服務(wù)的趨勢,這種趨勢后來被稱為云原生開發(fā)。
2、容器化技術(shù)解決的核心問題
可移植性:不依賴具體的操作系統(tǒng)或云平臺(tái),比如在阿里云或騰訊云直接隨意遷移。
占地?。喝萜髦恍枰鋺?yīng)用程序以及它需要運(yùn)行的所有容器和庫的依賴清單,不需要將所有的依賴庫都打包在一起。
共享 bin 和 lib:不同的容器可以共享 bin 和 lib,進(jìn)一步節(jié)省了空間。
3、docker的出現(xiàn)
2010 年一位年輕小伙子在美國舊金山成立了一家名叫【dotCloud】的公司, 開發(fā)了 Docker 的核心技術(shù),從此開啟了容器技術(shù)的時(shí)代。后面 dotCloud 公司將自己的容器技術(shù)進(jìn)行了簡化和標(biāo)準(zhǔn)化,取名為 Docker,就是大家熟悉的鯨魚 logo。
2013 年 dotCloud 公司宣布將 Docker 開源,隨著越來越多的工程師發(fā)現(xiàn)了它的優(yōu)點(diǎn), Docker 的人氣迅速攀升,成為當(dāng)時(shí)最火爆的開源技術(shù)之一。
當(dāng)前有 30% 以上的企業(yè)在其 AWS 環(huán)境中使用 Docker,并且這個(gè)數(shù)字還在繼續(xù)增長。
此時(shí)的 Docker,已經(jīng)成為行業(yè)里人氣最火爆的開源技術(shù),沒有之一。甚至像 Google、微軟、Amazon、VMware 這樣的巨頭,都對它青睞有加,表示將全力支持。
Docker 火了之后,dotCloud 公司干脆把公司名字也改成了 Docker Inc. 。
Docker 和容器技術(shù)為什么會(huì)這么火爆?說白了,就是因?yàn)樗?“輕”。在容器技術(shù)之前,業(yè)界的網(wǎng)紅是虛擬機(jī)。虛擬機(jī)技術(shù)的代表,是 VMWare 和 OpenStack 。
相信很多人都用過虛擬機(jī)。虛擬機(jī),就是在你的操作系統(tǒng)里面,裝一個(gè)軟件,然后通過這個(gè)軟件,再模擬一臺(tái)甚至多臺(tái)“子電腦”出來。
在 “子電腦” 里,你可以和正常電腦一樣運(yùn)行程序,例如登錄 QQ。如果你愿意,你可以變出好幾個(gè) “子電腦”,里面都登錄上 QQ?!白与娔X” 和 “子電腦” 之間,是相互隔離的,互不影響。
虛擬機(jī)屬于虛擬化技術(shù)。而 Docker 這樣的容器技術(shù),也是虛擬化技術(shù),屬于輕量級(jí)的虛擬化。
虛擬機(jī)雖然可以隔離出很多 “子電腦”,但占用空間更大,啟動(dòng)更慢,虛擬機(jī)軟件可能還要花錢(例如:VMWare)。
而容器技術(shù)恰好沒有這些缺點(diǎn)。它不需要虛擬出整個(gè)操作系統(tǒng),只需要虛擬一個(gè)小規(guī)模的環(huán)境(類似 “沙箱”)。Docker 可以輕松創(chuàng)建容器和基于容器的應(yīng)用程序,最初是為 Linux 構(gòu)建的,現(xiàn)在也可以在 Windows 和 MacOS 上運(yùn)行。
它啟動(dòng)時(shí)間很快,幾秒鐘就能完成。而且,它對資源的利用率很高(一臺(tái)主機(jī)可以同時(shí)運(yùn)行幾千個(gè) Docker 容器)。此外,它占的空間很小,虛擬機(jī)一般要幾 GB 到幾十 GB 的空間,而容器只需要 MB 級(jí)甚至 KB 級(jí)。
正因?yàn)槿绱?,容器技術(shù)受到了熱烈的歡迎和追捧,發(fā)展迅速。大家需要注意,Docker 本身并不是容器,它是創(chuàng)建容器的工具,是應(yīng)用容器引擎。想要搞懂 Docker,其實(shí)看它的兩句口號(hào)就行。
第一句,是 “Build, Ship and Run”。
第二句口號(hào)則是:“Build?once,Run?anywhere(搭建一次,到處能用)”。
Build(構(gòu)建鏡像): 鏡像就像是集裝箱,包含文件以及運(yùn)行環(huán)境等等資源;
Ship(運(yùn)輸鏡像):在宿主機(jī)和倉庫間進(jìn)行運(yùn)輸,這里倉庫就像是超級(jí)碼頭;
Run(運(yùn)行鏡像):運(yùn)行的鏡像就是一個(gè)容器,容器就是運(yùn)行程序的地方。
說白了,這個(gè) Docker 鏡像,是一個(gè)特殊的文件系統(tǒng)。它除了提供容器運(yùn)行時(shí)所需的程序、庫、資源、配置等文件外,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(例如:環(huán)境變量)。鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變。
綜上所述,Docker 的運(yùn)行過程,也就是去倉庫把鏡像拉到本地,然后用執(zhí)行命令把鏡像運(yùn)行起來變成容器,這也就是為什么人們常常將 Docker 稱為碼頭工人或碼頭裝卸工。
負(fù)責(zé)對 Docker 鏡像進(jìn)行管理的,是 Docker Registry 服務(wù)(類似倉庫管理員)。當(dāng)然,不是任何人建的任何鏡像都是合法的。萬一有人構(gòu)建的鏡像存在問題呢?所以,Docker Registry 服務(wù)對鏡像的管理是非常嚴(yán)格的。最常使用的 Registry 公開服務(wù),是官方的 Docker Hub,這也是默認(rèn)的 Registry,并擁有大量的高質(zhì)量的官方鏡像。
4、Docker如何使用
其實(shí)大多數(shù)人談?wù)?Docker 時(shí)說的是 Docker Engine,這只是一個(gè)構(gòu)建和運(yùn)行的容器。
在運(yùn)行容器前需要編寫 Docker File,通過 dockerFile 生成鏡像,然后才能運(yùn)行 Docker 容器。
Docker File 定義了運(yùn)行鏡像(image)所需的所有內(nèi)容,包括操作系統(tǒng)和軟件安裝位置。一般情況下都不需要從頭開始編寫 Docker File,在 Docker Hub 中有來自世界各地的工程師編寫好的鏡像,你可以基于此修改。
??此外,Docker 容器提供了一種構(gòu)建企業(yè)應(yīng)用程序和業(yè)務(wù)流程應(yīng)用程序的方法,這些應(yīng)用程序比傳統(tǒng)應(yīng)用程序更容易安裝、維護(hù)和移動(dòng)。
?Docker 容器支持隔離:Docker 容器使應(yīng)用程序不僅彼此隔離,而且與底層系統(tǒng)隔離。這不僅使軟件棧更干凈,而且更容易使容器化應(yīng)用程序使用系統(tǒng)資源,例如 CPU、GPU、內(nèi)存、I/O、網(wǎng)絡(luò)等,它還可以確保數(shù)據(jù)和代碼保持獨(dú)立。
?Docker 容器支持可移植性:Docker 容器在支持容器運(yùn)行環(huán)境的任何機(jī)器上運(yùn)行。應(yīng)用程序不必綁定到主機(jī)操作系統(tǒng),因此可以保持應(yīng)用程序環(huán)境和底層操作環(huán)境的整潔和最小化。
例如,采用容器的 MySQL 將在大多數(shù)支持容器的 Linux 系統(tǒng)上運(yùn)行,應(yīng)用程序的所有依賴項(xiàng)通常都在同一個(gè)容器中提供。基于容器的應(yīng)用程序可以輕易從 on-prem 系統(tǒng)遷移到云環(huán)境中,或從開發(fā)人員的筆記本電腦移到服務(wù)器上,只要目標(biāo)系統(tǒng)支持 Docker 以及可能與之一起使用的任何第三方工具,比如 Kubernetes。
?通常,Docker 容器鏡像必須為特定的平臺(tái)構(gòu)建。例如 Windows 容器不能在 Linux 上運(yùn)行,反之亦然;以前,繞過此限制的一種方法是啟動(dòng)運(yùn)行所需操作系統(tǒng)實(shí)例的虛擬機(jī),并在虛擬機(jī)中運(yùn)行容器。
然而 Docker 團(tuán)隊(duì)后來設(shè)計(jì)了一個(gè)更優(yōu)雅的解決方案,稱為 manifest,它允許多個(gè)操作系統(tǒng)的鏡像并行打包。盡管 manifest 還處于試驗(yàn)階段,但這暗示了容器可能成為跨平臺(tái)應(yīng)用程序解決方案和跨環(huán)境應(yīng)用程序解決方案。
?Docker 容器支持可組合性:大多數(shù)業(yè)務(wù)應(yīng)用程序由幾個(gè)獨(dú)立的組件組成,web 服務(wù)器、數(shù)據(jù)庫和 cache 緩存。Docker 容器可以將這些部件組合成一個(gè)容易更換的功能單元。每個(gè)部分由不同的容器提供,可以獨(dú)立于其他容器進(jìn)行維護(hù)、更新、交換和修改。
?? 這本質(zhì)上是應(yīng)用程序設(shè)計(jì)的微服務(wù)模型。通過將應(yīng)用程序功能劃分為獨(dú)立的、自包含的服務(wù),微服務(wù)模型為過程緩慢的傳統(tǒng)開發(fā)和單一僵化的應(yīng)用程序提供了一種解決方案,輕量級(jí)和便攜式容器使構(gòu)建和維護(hù)基于微服務(wù)的應(yīng)用程序變得更加容易。
5、編排系統(tǒng)的需求催生了k8s
盡管 Docker 為容器化的應(yīng)用程序提供了開放標(biāo)準(zhǔn),但隨著容器越來越多出現(xiàn)了一系列新問題:
如何協(xié)調(diào)、調(diào)度和管理這些容器?
如何在升級(jí)應(yīng)用程序時(shí)不中斷服務(wù)?
如何監(jiān)視應(yīng)用程序的運(yùn)行狀況?
如何批量重新啟動(dòng)容器里的程序?
解決這些問題需要容器編排技術(shù),可以將眾多機(jī)器抽象,對外呈現(xiàn)出一臺(tái)超大機(jī)器?,F(xiàn)在業(yè)界比較流行的有:k8s、Mesos、Docker Swarm。
在業(yè)務(wù)發(fā)展初期只有幾個(gè)微服務(wù),這時(shí)用 Docker 就足夠了,但隨著業(yè)務(wù)規(guī)模逐漸擴(kuò)大,容器越來越多,運(yùn)維人員的工作越來越復(fù)雜,這個(gè)時(shí)候就需要編排系統(tǒng)解救 opers。
一個(gè)成熟的容器編排系統(tǒng)需要具備以下能力:
處理大量的容器和用戶
負(fù)載均衡
鑒權(quán)和安全性
管理服務(wù)通信
多平臺(tái)部署
其中,K8S,就是基于容器的集群管理平臺(tái),它的全稱,是 kubernetes。
和 Docker 不同,K8S 的創(chuàng)造者,是眾人皆知的行業(yè)巨頭——Google。
然而,K8S 并不是一件全新的發(fā)明。它的前身,是 Google 自己搗鼓了十多年的 Borg 系統(tǒng)。K8S 是 Google 研發(fā)的容器協(xié)調(diào)器,已捐贈(zèng)給 CNCF,現(xiàn)已開源。
Google 利用在容器管理多年的經(jīng)驗(yàn)和專業(yè)知識(shí)推出了 k8s,主要用于自動(dòng)化部署應(yīng)用程序容器,可以支持眾多容器化工具包括現(xiàn)在非常流行的 Docker。
目前 k8s 是容器編排市場的領(lǐng)導(dǎo)者,開源并公布了一系列標(biāo)準(zhǔn)化方法,主流的公有云平臺(tái)都宣布支持。
一流的廠商都在搶占標(biāo)準(zhǔn)的制高點(diǎn),一堆小廠商跟著一起玩,這就叫生態(tài)了。
6、k8s架構(gòu)和組件
k8s 由眾多組件組成,組件間通過 API 互相通信,歸納起來主要分為三個(gè)部分:
controller manager
nodes
pods
Controller Manager,即控制器管理器,用于調(diào)度程序以及節(jié)點(diǎn)狀態(tài)檢測(是k8s的大腦)。
Nodes,構(gòu)成了 Kubernetes 集群的集體計(jì)算能力,實(shí)際部署容器運(yùn)行的地方。
Pods,Kubernetes 集群中資源的最小單位。
下圖是 Kubernetes 集成 Jenkins 實(shí)現(xiàn) CICD(一圖勝千言,需要對其有一個(gè)大致的認(rèn)識(shí)):
而下圖則是 GitLab + Jenkins Pipeline + Doker + k8s + Helm 自動(dòng)化部署:
7、k8s與Docker Swarm江湖恩怨
Docker Swarm 與 k8s 同為容器編排技術(shù)。
如果非要拿Docker和k8s進(jìn)行比較,其實(shí)更應(yīng)該拿Docker Swarm和k8s比較。
Docker Swarm是Docker自駕針對集群化部署管理的解決方案。優(yōu)點(diǎn)很明顯,可以更緊密集成到Docker生態(tài)系統(tǒng)中。雖說Swarm和Docker血緣更近,但是由于商業(yè)、生態(tài)等原因依舊沒有k8s流行。
8、Docker與k8s難舍難分
Docker和k8s在業(yè)界非常流行,已經(jīng)是事實(shí)上的標(biāo)準(zhǔn)了。
Docker是用于構(gòu)建、分發(fā)、運(yùn)行()容器的平臺(tái)和工具。
而k8s實(shí)際上是一個(gè)使用Docker容器進(jìn)行編排的系統(tǒng),主要圍繞pods進(jìn)行工作。Pods是k8s生態(tài)中最小的調(diào)度單位,可以包含一個(gè)或多個(gè)容器。
Docker和k8s分別做不通的事情,兩者是協(xié)同關(guān)系。
9、開發(fā)實(shí)踐
(1)不用k8s可以使用docker嗎?
可以。對于一些小型公司、業(yè)務(wù)不太復(fù)雜的情況下都是可以直接使用docker的。盡管k8s有很多好處,但是眾所周知它非常復(fù)雜,簡單業(yè)務(wù)完全可以放棄使用k8s。但是當(dāng)業(yè)務(wù)達(dá)到一定規(guī)模后可能還是要借助k8s才行。
(2)沒有Docker可以使用k8s嗎?
k8s展示一個(gè)容器編排器,沒有容器拿什么編排??
k8s經(jīng)常與Docker進(jìn)行搭配使用,但是也可以使用其他容器,如RunC、Containerted等。
(3)Docker Swarm和k8s怎么選?
選k8s。2019 年底 Docker Enterprise 已經(jīng)出售給 Mirantis,Mirantis 聲明要逐步淘汰 Docker Swarm,后續(xù)會(huì)將 k8s 作為默認(rèn)編排工具。
10、k8s棄用docker?
k8s 1.20版本的changelog原文如下:
Docker support in the kubelet is now deprecated and will be removed in a future release. The kubelet uses a module called "dockershim" which implements CRI support for Docker and it has seen maintenance issues in the Kubernetes community
原文說的是kubelet是通過一個(gè)叫做dockershim的模塊實(shí)現(xiàn)對docker的支持,然后以后版本會(huì)移除這個(gè)dockershim模塊。
典型的k8s runtime架構(gòu)(dockershim)
關(guān)于dockershim是什么還要從k8s發(fā)布之初和docker的關(guān)系說起。k8s在發(fā)布之初,docker在容器實(shí)現(xiàn)方面占據(jù)壟斷地位。為了迎合主流,kubernetes官網(wǎng)也率先使用docker作為底層容器的實(shí)現(xiàn)。
注: shim 顧名思義就是 “墊片”的意思。
2016年12月k8s發(fā)布CRI(Container Runtime Interface),很重要的一個(gè)考量就是為了避免后續(xù)兼容其他運(yùn)行時(shí)帶來的維護(hù)工作,所以發(fā)布了統(tǒng)一的CRI接口。這樣凡是支持CRI的運(yùn)行時(shí),皆可以直接作為k8s的底層運(yùn)行時(shí)。
所以之前的架構(gòu)是:
Kubelet 通過CRI接口調(diào)用dockershim請求創(chuàng)建容器;
dockershim把創(chuàng)建容器的請求轉(zhuǎn)換成docker daemon的請求往docker創(chuàng)建一個(gè)容器;
這時(shí)候把容器創(chuàng)建請求請求到使用CRI實(shí)現(xiàn)的containerd;
containerd通過OCI調(diào)用containerd-shim然后進(jìn)而使用操作系統(tǒng)底層實(shí)現(xiàn)容器的創(chuàng)建 ;
看到這兒,相信大家就知道官網(wǎng)為什么要移除dockershim了?。?!
因?yàn)檫@個(gè)調(diào)用合著需要經(jīng)過兩個(gè)劃水的dockershim和docker daemon。kubelet直接調(diào)用containerd就完事了。于是就有了如下新架構(gòu):
總結(jié)來說,k8s啟用的其實(shí)是dockershim,選擇直接對接CRI接口;并且默認(rèn)支持的是containerd(就是docker自帶的組件),所以完全可以和docker本身做到100%兼容。k8s去除dockershim是自身發(fā)展考慮,為的是支持更通用的CRI標(biāo)準(zhǔn),更高抽象化意味著更好的兼容性。
順便說下,即便啟用docker也不代表docker就要涼了。docker帶給我們的是更新的工作流和開發(fā)方式,一種容器化的思維。在我們的日常開發(fā)中,docker在臨時(shí)搭建一些環(huán)境時(shí)還是可以發(fā)揮巨大作用的。
————————————————
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
原文鏈接:https://blog.csdn.net/mijichui2153/article/details/136327686
湖北襄陽追日路2號(hào)襄陽軟件園A棟
客服微信:97971665
騰訊QQ:97971665
2025 ? 湖北創(chuàng)杰網(wǎng)絡(luò)科技有限公司 版權(quán)所有 鄂ICP備16000833號(hào)-3