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