雲原生的基石,一文讀懂容器、Docker、Pod到底是什麼

雲原生的基石,一文讀懂容器、Docker、Pod到底是什麼

作者 | Aholiab

出品 | CSDN(ID:CSDNnews)

封圖|CSDN下載自視覺中國

雲原生(Cloud Native),是2013年由Pivotal公司率先提出的概念。雲原生以容器化、微服務、可持續交付性,幫助企業構建和運行可彈性擴展的應用。由於雲原生應用構建簡便快捷,部署輕鬆自如,運行按需伸縮等特點,近年來受到越來越多企業的歡迎。

容器是雲原生概念的重要組成部分,作為一種計算單元,容器可以以更加輕量化、更小開銷的方式來運行;而作為一種應用的包裝形式,容器則賦予了應用獨立和便攜的能力。隨著Docker、Kubernetes技術的成熟,容器也成為了時下最火的開發理念。

根據Gartner的預計,2022年有75%的全球化企業將在生產中使用容器化的應用(當前約為30%)、50%的應用軟件將容器化適應超融合環境(目前約為20%)。Docker和Kubernetes將從成為成為跨環境的新標準。因此,瞭解容器、Docker的基本概念,是玩轉雲原生開發的基礎。

為了幫助開發者瞭解容器的基本概念及應用場景,3月12日,京東雲與AI雲產品研發部專家架構師劉俊輝在CSDN在線公開課平臺開啟了《六週玩轉雲原生》系列技術公開課,在第一講中,劉俊輝老師以《容器與Pod簡介》為主題,從容器的構成、Docker的基本概念、容器的典型應用、Pod的基本概念、容器安全與京東智聯雲原生容器等方面,為開發者系統梳理了容器的相關知識。

同時,通過容器與Pod的「課後作業」,鼓勵參會的同學在課後親自動手,從而加深印象。參加課程的同學紛紛表示收穫頗豐。那麼,劉俊輝老師究竟分享了哪些乾貨?容器和Pod究竟是什麼?讓我們一起來回顧一下精華內容吧!

云原生的基石,一文读懂容器、Docker、Pod到底是什么

容器是什麼?

要給容器下一個準確的定義,是一件不容易的事情,因為每個人看待容器的視角有所不同。在劉俊輝看來,容器既是一種計算單元的提供方式;又是一種應用的包裝形式。

1、容器是一種計算單元

作為一種計算單元,容器與線程、進程、虛擬機、物理機一樣(如下圖所示)。在連續尺度上,越往左隔離性、安全性和開銷越低,越往右則越高。而容器則恰恰是介於進程和虛擬機之間的一種計算單元。

云原生的基石,一文读懂容器、Docker、Pod到底是什么

但並非所有的應用都適合選擇容器,開發者可以根據自己應用的特點和需求選擇最適合的計算單元。例如,你的應用是高性能、互信的,且處於同一個管理區域,那麼用線程或者進程就可以滿足;但如果你的應用是多租戶的,並且和其他應用運行在同一個空間,那麼你就需要考慮如何將這些應用安全地隔離開,使得數據不會被洩露或性能受到影響。那麼這時,容器也許就是一個不錯的選擇了。

因為容器是一個「高度隔離的進程」,它在一般進程的隔離基礎上又增加了新的隔離機制,這些隔離機制是使用Linux的內核提供的,它包括一些命名空間(Name Spaces)和CGroup。命名空間可以分為網絡、存儲和計算三大類。其中,最為重要的是網絡命名空間。保證了容器的網絡是獨立於其他容器網絡的。每個容器自己看到的文件系統和其他容器的是不共享的,每個容器只能看到自己的進程ID,而進程編號也是連續的。

而說到容器與虛擬機最大的區別,劉俊輝認為,相對於虛擬機,容器最大的特徵是它沒有自己獨立的操作系統,而是共享其宿主機上的一個操作系統;而虛擬機則運行在「一臺獨立的服務器上」。

因此,容器相比於虛擬機的成本會小,但隔離性卻有所欠缺。

2、容器是一種應用的包裝形式

有過應用開發經驗的人都知道,應用並不是一個單一的可執行文件,一個稍微複雜一點的應用包括多個部分,包括:代碼、可執行文件、配置依賴、外部依賴(動態鏈接庫)等。

所以在應用發行包裝的時候,需要考慮目標操作系統的版本、系統架構以及它所依賴的模塊等因素。否則應用安裝時會改動系統的不同部分。

而容器作為一個應用的包裝,它最大的特點就是實現了應用的獨立和便攜,容器本身包含了應用所有的依賴,這使得它可以再任意的基礎設施上運行,不會因為系統版本、架構的問題,而導致各種意外。

云原生的基石,一文读懂容器、Docker、Pod到底是什么

Docker是什麼?

簡單來說,Docker可以看作是一個非常成功的容器管理平臺。Docker最重要的部分就是它的運行管理環境(如下圖所示)。

云原生的基石,一文读懂容器、Docker、Pod到底是什么

正如上面所說,容器是一個計算單元,那麼Docker的運行環境就是用來創建、管理和銷燬這些計算單元的。在創建和管理這些計算單元的時候,需要用到計算單元的包裝(也就是它的軟件發行包),這些包裝以容器鏡像的方式存放在它的運行環境中,所有的容器計算單元都是通過這些鏡像來創建的。

但鏡像本身會有版本的發佈、升級等需求,這就涉及到Docker的另一個重要組成部分DockerHub了。DockerHub有點像蘋果的App Store,它是一個非常大的「容器市場」,所有常用的軟件都可以在DockerHub上找到。

最後一個Docker的重要模塊,就是用戶界面和管理工具,它們用來向容器的運行環境發佈命令或查看狀態。只需要用一個Docker的命令加上一些參數,就可以實現創建、刪除、查看容器的運行情況等操作。

接下來我們就來看看Docker的實際操作情況,我們會以運行一個Hello World的容器為例,講講Docker的使用情況。其實,只需要安裝好Docker就可以嘗試運行這個Hello World的容器了。

通過下面代碼,我們來看看Docker做了些什麼:

云原生的基石,一文读懂容器、Docker、Pod到底是什么

首先我們看到Docker在本地要去找Hello World最新版本的鏡像,它發現本地並沒有這個鏡像後去DockerHub上把這個鏡像給下載了下來。然後,這個鏡像就被運行了,之後Docker後臺就創建了這樣一個容器。

Docker的出現,讓容器應用管理變得非常輕鬆,運行容器只需要一個命令就可以實現。而從DockerHub上下載鏡像、創建各種各樣的隔離環境、創建容器與外部的網絡通信環境都可以由Docker來完成。可以說Docker可以管理容器的整個生命週期。

云原生的基石,一文读懂容器、Docker、Pod到底是什么

容器vs.虛擬機,伐木工的斧與鋸

作為對容器的總結,我們可以把容器最大的特點歸納為輕量級和完全獨立部署。這兩大特點與雲原生的彈性無限擴展和按需使用的定位十分吻合,也正因為如此,容器成為了雲原生的基石。

雖然容器和虛擬機都是計算單元,但從虛擬機到容器,並不能看做是一個簡單的性能提升或架構的改變,而是一種應用理念的改變。

舉個例子,從前伐木工人看書的時候會用斧子,後來大家覺得用斧子太費力氣,有個高人就介紹了另一個砍樹的工具「鋸子」。但如果伐木工人拿著鋸子去砍樹的話,會發現還沒有斧子好用。但事實是,斧子和鋸子是兩種使用的理念。

而說回容器和虛擬機理念的不同,我們可以通過下面的圖表來進一步感受。

云原生的基石,一文读懂容器、Docker、Pod到底是什么

容器的典型應用可以分為兩類,一類是微服務,一類是DevOps。

微服務是指系統的不同單元或功能運行不同的容器,每一個服務的容器數量可以根據自己的負載進行調整。比如,一個大系統包含用戶登錄、貨品展示、貨品交互等功能,但這個系統的各個部分並不是同時線性增加的,有些部分可能忙一些,有些部分的容量可能還有富餘。

云原生的基石,一文读懂容器、Docker、Pod到底是什么

DevOps是指開發者、測試、生產過程流水線化。因為容器的「自包含」特性,當它作為標準的流通物品,可以使開發環境、測試環境和生產環境的應用包裝完全一致,這樣就減少了應用由於依賴關係配置錯誤等導致的意外,從而使得開發、測試、生產的整個流水線變得更高效。

云原生的基石,一文读懂容器、Docker、Pod到底是什么云原生的基石,一文读懂容器、Docker、Pod到底是什么

Pod,一種增強型容器

Pod是一種組合的多容器運行單元,也是Kubernetes裡的一個基礎單元。你可以把它看作是一種容器的擴展或者增強型的容器。Pod裡面包括一個主容器和數個輔助容器,它們共同完成一個特定的功能。把多個進程(容器也是一種隔離的進程)打包在一個Name Space裡的時候,就構成了一個Pod。Pod裡面不同進程的應用包裝仍然是獨立的(每個容器都會有自己的鏡像)。

Pod的意義在於,它可以既保持主容器和輔助容器的的密切關係,又保持主容器的獨立性。由於主容器和輔助容器的生命週期相同,可以同時被創建和銷燬,因此把它們放在一個Pod中,可以使他們的交互更加高效。

而另一方面,主容器需要完成一些主要的工作,而另一些工作可能是有共性的,就可以單獨打包由輔助容器來運行。

非常推薦大家去一個叫Katacoda的網站,它上面有大量免費的在線實驗,包括Docker及Docker Image等動手操作項目,而且現在是完全免費的。大家不妨去這裡動手實操起來。

云原生的基石,一文读懂容器、Docker、Pod到底是什么

京東智聯雲原生容器,安全為王

最後,劉俊輝老師就京東智聯雲原生容器做了相關的介紹。在介紹之前,他先著重講解了安全性對於容器產品的重要性。

當一個容器平臺運行多個租戶應用的時候,很容易發生「側向攻擊」,即進程利用系統的漏洞來進行權限提升,例如把自己的權限升級成管理員,從而獲得對系統上運行的其他進程或容器的操作權限。目前這類漏洞通常會導致惡意的使用計算資源用來「挖礦」。

針對這一問題,目前有兩種解決方案,一種是「限制系統調用」;一種是「獨立內核」。

限制系統調用,指的是通過限制應用的系統調用,來降低應用的能力,從而避免對其他應用的危害。目前,Google的Givsor和IBM的Nabla都是採用的這種做法。如下圖所示,原來一個應用會訪問到所有的系統調用,但在Nabla的模式下,應用只會訪問必要的系統調用,其他調用則都被屏蔽了。

云原生的基石,一文读懂容器、Docker、Pod到底是什么

但這種方法的弊端在於,它需要你在一開始就要給應用開放「恰到好處」的權限,如果一不小心沒有開放足夠的權限,那應用就可能會崩潰。

獨立內核則參考了虛擬機的解決方案,它是指在容器中增加一個新的內核,這個內核是輕量化的,包括「微內核」和Unikernel兩種實現方式。Unikernel和應用是編譯在一起的,它們之間可以直接通過函數調用,而不需要系統調用。

這一方案的好處在於,容器本質上只是跟自己的內核打交道,而內核則是跟宿主機打交道,內核與宿主機的交互只需要一些通用的指令即可,不涉及到直接調用到危害系統的指令。目前Kata Container和京東智聯雲原生容器,就是採用的這種方式。

這種方式的好處在於,微內核作為一個最小化的操作系統,可以滿足所有系統的調用,同時去除一些不必要的系統操作部分;它的系統啟動時間非常短,可以達到秒級,同時開銷比虛擬機要小。

除了安全性之外,京東智聯雲原生容器還有許多其他的優勢,總結起來包括以下幾個方面:

- 兼具虛機的安全性和容器的靈活性;

- 採用獨立微內核,提供與虛機相同級別的安全保證;

- 使用標準Docker鏡像直接啟動,無需安裝配置宿主機;

- 具有與虛機能力相同的計算、網絡、存儲能力;

- 支持容器和Pod,支持Kubernetes集群。

通過本次學習,開發者和對雲原生感興趣的人對容器的基本概念有了全面的瞭解,在老師分享環節之後,有不少學員都通過提問的方式與老師進一步交流,劉俊輝老師也就大家常見的疑問進行了耐心的解答。

值得留意的是,京東智聯雲還為本次課程設置了「課後作業」環節,作業包括兩個部分:

  1. 使用京東智聯雲上的雲主機,安裝Docker運行環境,瞭解Docker運行、管理容器的基本操作,使用Linux系統工具,探索容器和Pod的基本結構;

  2. 使用京東智聯雲直接創建原生容器,通過京東智聯雲控制檯對容器進行基本操作。瞭解、體驗原生容器與Docker容器的異同。通過課後練習進一步夯實對容器和Pod的理解,同時完成作業並提交的同學,都可以獲得精美的小禮品。

在這樣一頓操作之後,很多參加課程的小夥伴都紛紛表示這次課程簡直是「幫助小白走近了容器世界的大門」,並對下次課程充滿期待!

雲原生的時代已來,而你,也將成為這個新時代的構建者之一!


分享到:


相關文章: