一文了解docker與k8s

隨著 k8s 作為容器編排解決方案變得越來越流行,有些人開始拿 Docker 和 k8s 進行對比,不禁問道:Docker 不香嗎?

k8s 是 kubernetes 的縮寫,'8' 代表中間的八個字符。

其實 Docker 和 k8s 并非直接的競爭對手兩者相互依存。 Docker 是一個容器化平臺,而 k8s 是 Docker 等容器平臺的協調器。

1、容器化時代

(1)虛擬化技術已經走過是三個時代,沒有容器化技術的研究就不會有Docker技術的誕生。

1)物理機時代: 多個應用程序排在一臺機器上。

2)虛擬機時代:一臺物理機器安裝多個虛擬機(VM),一個虛擬機跑多個程序。

3)容器化時代:一臺物理機器安裝多個容器實例(Container),一個容器跑多個程序。

(2)容器化解決了什么問題?

用一段話描述:

測試人員:你這個功能有問題。

開發人員:我本地是好的呀!

開發人員編寫代碼,在自己本地環境測試完成后,將代碼部署到測試或生產環境中經常會遇到各種各樣的問題。明明本地完美運行的代碼為什么部署后出現很多 bug,原因有很多:不同的操作系統、不同的依賴庫等。總結一句話:因為本地環境和遠程環境不一致

容器化技術正好解決了這一關鍵問題,它將軟件程序和運行的基礎環境分開。開發人員編碼完成后將程序打包到一個容器鏡像中,鏡像中詳細列出了所依賴的環境,在不同的容器中運行標準化的鏡像,從根本上解決了環境不一致的問題。

注:容器的概念已經出現不短的時間。但直到 2013 年開源項目 Docker 的出現才極大推廣了容器這項技術,并推動了軟件開發中容器化微服務的趨勢,這種趨勢后來被稱為云原生開發

2、容器化技術解決的核心問題

可移植性:不依賴具體的操作系統或云平臺,比如在阿里云或騰訊云直接隨意遷移。
占地小:容器只需要其應用程序以及它需要運行的所有容器和庫的依賴清單,不需要將所有的依賴庫都打包在一起。
共享 bin 和 lib:不同的容器可以共享 bin 和 lib,進一步節省了空間。
?

3、docker的出現

2010 年一位年輕小伙子在美國舊金山成立了一家名叫【dotCloud】的公司, 開發了 Docker 的核心技術,從此開啟了容器技術的時代。后面 dotCloud 公司將自己的容器技術進行了簡化和標準化,取名為 Docker,就是大家熟悉的鯨魚 logo。

2013 年 dotCloud 公司宣布將 Docker 開源,隨著越來越多的工程師發現了它的優點, Docker 的人氣迅速攀升,成為當時最火爆的開源技術之一。

當前有 30% 以上的企業在其 AWS 環境中使用 Docker,并且這個數字還在繼續增長。

此時的 Docker,已經成為行業里人氣最火爆的開源技術,沒有之一。甚至像 Google、微軟、Amazon、VMware 這樣的巨頭,都對它青睞有加,表示將全力支持。

Docker 火了之后,dotCloud 公司干脆把公司名字也改成了 Docker Inc. 。

Docker 和容器技術為什么會這么火爆?說白了,就是因為它 “”。在容器技術之前,業界的網紅是虛擬機。虛擬機技術的代表,是 VMWareOpenStack

相信很多人都用過虛擬機。虛擬機,就是在你的操作系統里面,裝一個軟件,然后通過這個軟件,再模擬一臺甚至多臺“子電腦”出來。

在 “子電腦” 里,你可以和正常電腦一樣運行程序,例如登錄 QQ。如果你愿意,你可以變出好幾個 “子電腦”,里面都登錄上 QQ。“子電腦” 和 “子電腦” 之間,是相互隔離的,互不影響。

虛擬機屬于虛擬化技術。而 Docker 這樣的容器技術,也是虛擬化技術,屬于輕量級的虛擬化

虛擬機雖然可以隔離出很多 “子電腦”,但占用空間更大,啟動更慢,虛擬機軟件可能還要花錢(例如:VMWare)。

而容器技術恰好沒有這些缺點。它不需要虛擬出整個操作系統,只需要虛擬一個小規模的環境(類似 “沙箱”)。Docker 可以輕松創建容器和基于容器的應用程序,最初是為 Linux 構建的,現在也可以在 Windows 和 MacOS 上運行。

它啟動時間很快,幾秒鐘就能完成。而且,它對資源的利用率很高(一臺主機可以同時運行幾千個 Docker 容器)。此外,它占的空間很小,虛擬機一般要幾 GB 到幾十 GB 的空間,而容器只需要 MB 級甚至 KB 級。

正因為如此,容器技術受到了熱烈的歡迎和追捧,發展迅速。大家需要注意,Docker 本身并不是容器,它是創建容器的工具,是應用容器引擎。想要搞懂 Docker,其實看它的兩句口號就行。

第一句,是 Build, Ship and Run

第二句口號則是:Build?once,Run?anywhere(搭建一次,到處能用)”。

  • Build(構建鏡像): 鏡像就像是集裝箱,包含文件以及運行環境等等資源;
  • Ship(運輸鏡像):在宿主機和倉庫間進行運輸,這里倉庫就像是超級碼頭;
  • Run(運行鏡像):運行的鏡像就是一個容器,容器就是運行程序的地方。

說白了,這個 Docker 鏡像,是一個特殊的文件系統。它除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(例如:環境變量)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變

綜上所述,Docker 的運行過程,也就是去倉庫把鏡像拉到本地,然后用執行命令把鏡像運行起來變成容器,這也就是為什么人們常常將 Docker 稱為碼頭工人或碼頭裝卸工。

負責對 Docker 鏡像進行管理的,是 Docker Registry 服務(類似倉庫管理員)。當然,不是任何人建的任何鏡像都是合法的。萬一有人構建的鏡像存在問題呢?所以,Docker Registry 服務對鏡像的管理是非常嚴格的。最常使用的 Registry 公開服務,是官方的 Docker Hub,這也是默認的 Registry,并擁有大量的高質量的官方鏡像。

4、Docker如何使用

其實大多數人談論 Docker 時說的是 Docker Engine,這只是一個構建和運行的容器。

在運行容器前需要編寫 Docker File,通過 dockerFile 生成鏡像,然后才能運行 Docker 容器。

Docker File 定義了運行鏡像(image)所需的所有內容,包括操作系統和軟件安裝位置。一般情況下都不需要從頭開始編寫 Docker File,在 Docker Hub 中有來自世界各地的工程師編寫好的鏡像,你可以基于此修改。

📚此外,Docker 容器提供了一種構建企業應用程序和業務流程應用程序的方法,這些應用程序比傳統應用程序更容易安裝、維護和移動。

?Docker 容器支持隔離:Docker 容器使應用程序不僅彼此隔離,而且與底層系統隔離。這不僅使軟件棧更干凈,而且更容易使容器化應用程序使用系統資源,例如 CPU、GPU、內存、I/O、網絡等,它還可以確保數據和代碼保持獨立

?Docker 容器支持可移植性:Docker 容器在支持容器運行環境的任何機器上運行。應用程序不必綁定到主機操作系統,因此可以保持應用程序環境和底層操作環境的整潔和最小化。
例如,采用容器的 MySQL 將在大多數支持容器的 Linux 系統上運行,應用程序的所有依賴項通常都在同一個容器中提供。基于容器的應用程序可以輕易從 on-prem 系統遷移到云環境中,或從開發人員的筆記本電腦移到服務器上,只要目標系統支持 Docker 以及可能與之一起使用的任何第三方工具,比如 Kubernetes。

?通常,Docker 容器鏡像必須為特定的平臺構建。例如 Windows 容器不能在 Linux 上運行,反之亦然;以前,繞過此限制的一種方法是啟動運行所需操作系統實例的虛擬機,并在虛擬機中運行容器。
然而 Docker 團隊后來設計了一個更優雅的解決方案,稱為 manifest,它允許多個操作系統的鏡像并行打包。盡管 manifest 還處于試驗階段,但這暗示了容器可能成為跨平臺應用程序解決方案和跨環境應用程序解決方案。

?Docker 容器支持可組合性:大多數業務應用程序由幾個獨立的組件組成,web 服務器、數據庫和 cache 緩存。Docker 容器可以將這些部件組合成一個容易更換的功能單元。每個部分由不同的容器提供,可以獨立于其他容器進行維護、更新、交換和修改。

🔥 這本質上是應用程序設計的微服務模型。通過將應用程序功能劃分為獨立的、自包含的服務,微服務模型為過程緩慢的傳統開發和單一僵化的應用程序提供了一種解決方案,輕量級和便攜式容器使構建和維護基于微服務的應用程序變得更加容易。

5、編排系統的需求催生了k8s

盡管 Docker 為容器化的應用程序提供了開放標準,但隨著容器越來越多出現了一系列新問題:

  • 如何協調、調度和管理這些容器?
  • 如何在升級應用程序時不中斷服務
  • 如何監視應用程序的運行狀況?
  • 如何批量重新啟動容器里的程序?

解決這些問題需要容器編排技術,可以將眾多機器抽象,對外呈現出一臺超大機器。現在業界比較流行的有:k8s、Mesos、Docker Swarm

在業務發展初期只有幾個微服務,這時用 Docker 就足夠了,但隨著業務規模逐漸擴大,容器越來越多,運維人員的工作越來越復雜,這個時候就需要編排系統解救 opers。

一個成熟的容器編排系統需要具備以下能力:

  • 處理大量的容器和用戶
  • 負載均衡
  • 鑒權和安全性
  • 管理服務通信
  • 多平臺部署

其中,K8S,就是基于容器的集群管理平臺,它的全稱,是 kubernetes。

和 Docker 不同,K8S 的創造者,是眾人皆知的行業巨頭——Google

然而,K8S 并不是一件全新的發明。它的前身,是 Google 自己搗鼓了十多年的 Borg 系統。K8S 是 Google 研發的容器協調器,已捐贈給 CNCF,現已開源。

Google 利用在容器管理多年的經驗和專業知識推出了 k8s,主要用于自動化部署應用程序容器,可以支持眾多容器化工具包括現在非常流行的 Docker。

目前 k8s 是容器編排市場的領導者,開源并公布了一系列標準化方法,主流的公有云平臺都宣布支持。

一流的廠商都在搶占標準的制高點,一堆小廠商跟著一起玩,這就叫生態了。

6、k8s架構和組件

k8s 由眾多組件組成,組件間通過 API 互相通信,歸納起來主要分為三個部分:

  • controller manager
  • nodes
  • pods

  • Controller Manager,即控制器管理器,用于調度程序以及節點狀態檢測(是k8s的大腦)
  • Nodes,構成了 Kubernetes 集群的集體計算能力,實際部署容器運行的地方
  • Pods,Kubernetes 集群中資源的最小單位

下圖是?Kubernetes 集成 Jenkins 實現 CICD(一圖勝千言,需要對其有一個大致的認識):

而下圖則是?GitLab + Jenkins Pipeline + Doker + k8s + Helm 自動化部署

7、k8s與Docker Swarm江湖恩怨

Docker Swarm?與?k8s?同為容器編排技術。

如果非要拿Docker和k8s進行比較,其實更應該拿Docker Swarm和k8s比較。

Docker Swarm是Docker自駕針對集群化部署管理的解決方案。優點很明顯,可以更緊密集成到Docker生態系統中。雖說Swarm和Docker血緣更近,但是由于商業、生態等原因依舊沒有k8s流行。

8、Docker與k8s難舍難分

Docker和k8s在業界非常流行,已經是事實上的標準了。

Docker是用于構建、分發、運行()容器的平臺和工具。

而k8s實際上是一個使用Docker容器進行編排的系統,主要圍繞pods進行工作。Pods是k8s生態中最小的調度單位,可以包含一個或多個容器。

Docker和k8s分別做不通的事情,兩者是協同關系。

9、開發實踐

(1)不用k8s可以使用docker嗎?

可以。對于一些小型公司、業務不太復雜的情況下都是可以直接使用docker的。盡管k8s有很多好處,但是眾所周知它非常復雜,簡單業務完全可以放棄使用k8s。但是當業務達到一定規模后可能還是要借助k8s才行。

(2)沒有Docker可以使用k8s嗎?

k8s展示一個容器編排器,沒有容器拿什么編排??

k8s經常與Docker進行搭配使用,但是也可以使用其他容器,如RunC、Containerted等。

(3)Docker Swarm和k8s怎么選?

選k8s。2019 年底 Docker Enterprise 已經出售給 Mirantis,Mirantis 聲明要逐步淘汰 Docker Swarm,后續會將 k8s 作為默認編排工具。

轉載自??一文帶你認識「Docker」與「k8s」 - 掘金

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是通過一個叫做dockershim的模塊實現對docker的支持,然后以后版本會移除這個dockershim模塊。

典型的k8s runtime架構(dockershim)

關于dockershim是什么還要從k8s發布之初和docker的關系說起。k8s在發布之初,docker在容器實現方面占據壟斷地位。為了迎合主流,kubernetes官網也率先使用docker作為底層容器的實現。

注:?shim 顧名思義就是 “墊片”的意思。

2016年12月k8s發布CRI(Container Runtime Interface),很重要的一個考量就是為了避免后續兼容其他運行時帶來的維護工作,所以發布了統一的CRI接口。這樣凡是支持CRI的運行時,皆可以直接作為k8s的底層運行時。

所以之前的架構是:

Kubelet 通過CRI接口調用dockershim請求創建容器;

dockershim把創建容器的請求轉換成docker daemon的請求往docker創建一個容器;

這時候把容器創建請求請求到使用CRI實現的containerd;

containerd通過OCI調用containerd-shim然后進而使用操作系統底層實現容器的創建?;

看到這兒,相信大家就知道官網為什么要移除dockershim了!!!

因為這個調用合著需要經過兩個劃水的dockershim和docker daemon。kubelet直接調用containerd就完事了。于是就有了如下新架構:

????????總結來說,k8s啟用的其實是dockershim,選擇直接對接CRI接口;并且默認支持的是containerd(就是docker自帶的組件),所以完全可以和docker本身做到100%兼容。k8s去除dockershim是自身發展考慮,為的是支持更通用的CRI標準,更高抽象化意味著更好的兼容性。

????????順便說下,即便啟用docker也不代表docker就要涼了。docker帶給我們的是更新的工作流和開發方式,一種容器化的思維。在我們的日常開發中,docker在臨時搭建一些環境時還是可以發揮巨大作用的。


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716245.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716245.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716245.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt外部調用進程類QProcess的使用

有的時候我們需要在自己程序運行過程中調用其他進程,那么就需要用到QProcess。 首先可以了解一些關于進程的相關知識:線程與進程,你真得理解了嗎_進程和線程的區別-CSDN博客 進程是計算機中的程序關于某數據集合上的一次運行活動&#xff0…

Java面試——Redis

優質博文:IT-BLOG-CN 一、Redis 為什么那么快 【1】完全基于內存,絕大部分請求是純粹的內存操作,非常快速。數據存在內存中。 【2】數據結構簡單,對數據操作也簡單,Redis中的數據結構是專門進行設計的。 【3】采用單線…

【Vue3】全局切換字體大小

VueUse 先安裝VueUse <template><header><div class"left">left</div><div class"center">center</div><div class"right">right</div></header><div><button click"cha…

飛天使-學以致用-devops知識點4-SpringBoot項目CICD實現(實驗失敗,了解大概流程)

文章目錄 代碼準備創建jenkins 任務測試推送使用項目里面的jenkinsfile 進行升級操作 文字版本流程項目構建 代碼準備 推送代碼到gitlab 代碼去叩叮狼教育找 k8s 創建jenkins 任務 創建一個k8s-cicd-demo 流水線任務 將jenkins 里面構建時候的地址還有token&#xff0c; 給到…

azure devops工具實踐分析

對azure devops此工具的功能深挖&#xff0c;結合jira的使用經驗的分析 1、在backlog的功能描述&#xff0c;可理解為需求項&#xff0c;這里包括了bug&#xff0c;從開發的角度修復bug也是個工作項&#xff0c;所以需求的范圍是真正的需求&#xff08;開發接收到的已經確認的…

已解決org.springframework.web.multipart.MultipartException處理多部分請求異常的正確解決方法,親測有效!!!

已解決org.springframework.web.multipart.MultipartException處理多部分請求異常的正確解決方法&#xff0c;親測有效&#xff01;&#xff01;&#xff01; 目錄 問題分析 出現問題的場景 報錯原因 解決思路 解決方法 總結 在Web開發過程中&#xff0c;我們經常需要處…

基于JAVA協同過濾算法網上海鮮水產推薦購物商城系統設計與實現(Springboot框架)可行性分析

博主介紹&#xff1a;黃菊華老師《Vue.js入門與商城開發實戰》《微信小程序商城開發》圖書作者&#xff0c;CSDN博客專家&#xff0c;在線教育專家&#xff0c;CSDN鉆石講師&#xff1b;專注大學生畢業設計教育和輔導。 所有項目都配有從入門到精通的基礎知識視頻課程&#xff…

【PDF技巧】網上下載的pdf文件怎么才能編輯

不知道大家有沒有遇到過網上下載的PDF文件不能編輯的情況&#xff0c;今天我們來詳細了解一下導致無法編輯的原因即解決方法有哪些。 第一種原因&#xff1a;PDF文件中的內容是否是圖片&#xff0c;如果確認是圖片文件&#xff0c;那么我們想要編輯&#xff0c;就可以先使用PD…

分享經典、現代以及前沿軟件工程課程

https://www.icourse163.org/course/PKU-1003177002 隨著信息技術的發展&#xff0c;軟件已經深入到人類社會生產和生活的各個方面。軟件工程是將工程化的方法運用到軟件的開發、運行和維護之中&#xff0c;以達到提高軟件質量&#xff0c;降低開發成本的目的。軟件工程已經成為…

第三方支付牌照出讓,具備何種優勢的買方容易成功

在支付牌照并購的過程中&#xff0c;選擇一個合適的并購方是至關重要的。基于多年的支付牌照公司股權并購居間經驗&#xff0c;我發現具備以下特質的并購方在并購過程中表現得較為靠譜&#xff0c;他們不僅使得并購過程更為順暢&#xff0c;還能顯著提高并購的成功率。 并購方…

字符函數和字符串函數(下)

個人主頁&#xff08;找往期文章包括但不限于本期文章中不懂的知識點&#xff09;&#xff1a;我要學編程(?_?)-CSDN博客 目錄 strncpy函數的使用 函數原型&#xff1a; strncpy的使用 strncat函數的使用 函數原型&#xff1a; strncat的使用 strncmp函數的使用 函…

Vue3快速上手(十六)Vue3路由傳參大全

Vue3路由傳參 一、傳參的多種方式 1.1 拼接方式 這種方式適合傳遞單個參數的情況&#xff0c;比如點擊查看詳情&#xff0c;傳個id這樣的場景 傳參&#xff1a; <RouterLink to"/person?id1" active-class"active">person</RouterLink> …

Unity - 相機畫面為黑白效果

一、 在Hierarchy中創建一個Global Volume,并設置它為局部作用 二、 將場景出現的作用域范圍縮小至相機所在位置&#xff0c;將相機包含即可。 三、添加覆蓋組件Color Adjustments,并將Saturation直接拉為-100 。 此時&#xff0c;相機拍攝畫面為黑白&#xff0c;場景視圖中…

1、Linux-安裝

一、Linux和Windows的一些區別 1、Linux嚴格區分大小寫——【Windows創建文件夾時不區分大小寫】 2、Linux中所有內容都以文件形式存儲&#xff0c;包括硬件 3、Linux不靠拓展名區分文件類型&#xff0c;而是可以通過讀取文件開頭的一些字節來區分。 但是在實際使用中一般要…

MYSQL---日志

1.日志的概述 日志是MySQL數據庫的重要組成部分。日志文件中記錄著MySQL數據庫運行期間發生的變化&#xff1b;也就是說用來記錄MySQL數據庫的客戶端連接狀況、SQL語句的執行情況和錯誤信息等。當數據庫遭到意外的損壞時&#xff0c;可以通過日志查看文件出錯的原因&#xff0…

Leetcode算法題

用隊列實現棧 用隊列實現棧的四個操作&#xff1a; push(x)——元素x入棧pop()——移出棧頂元素top()——獲取棧頂元素empty()——返回棧是否為空 注意&#xff1a; 只能使用隊列的基本操作&#xff0c;即只可以調用隊列的push to back&#xff0c;pop from front&#xff…

C語言中的字符魔法:大小寫轉換的藝術

引言 在C語言的世界里&#xff0c;字符處理是一項基礎且重要的任務。字符作為編程中最基本的元素之一&#xff0c;承擔著信息展示、數據交互等多重角色。特別是在處理文本信息時&#xff0c;字符的轉換和識別顯得尤為重要。大小寫字母的轉換就是其中一個常見的需求&#xff0c…

電子電氣架構——汽車DoIP診斷通信建立流程

電子電氣架構——汽車DoIP診斷通信建立流程 我是穿拖鞋的漢子,魔都中堅持長期主義的工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 人們會在生活中不斷攻擊你。他們的主要武器是向你灌輸對自己的懷疑:你的價值、你的能力、你的潛力。他們往往會…

4款塞紙條盲盒交友源碼,可以對接公眾號

一元盲盒交友源碼/脫單盲盒源碼/交友盲盒/戀愛盲盒公眾號版 可以對接自己支付&#xff0c;全部自定義 沒有任何bug版本&#xff0c;已經測試完全可以 免費源碼&#xff0c;不包搭建指導 源碼下載地址專業知識分享社區-專業知識筆記免費分享 (chaobiji.cn)

華為OD機試 - 螺旋數字矩陣

1 題目描述 疫情期間&#xff0c;小明隔離在家&#xff0c;百無聊賴&#xff0c;在紙上寫數字玩。他發明了一種寫法&#xff1a; 給出數字個數 n &#xff08;0 < n ≤ 999&#xff09;和行數 m&#xff08;0 < m ≤ 999&#xff09;&#xff0c;從左上角的 1 開始&…