這事兒還得從上世紀60年代以前說起。。.。。.
那時,集裝箱運輸還未被認可,幾乎所有的貨物都是以散件方式運輸。
以“勇士號”為例,在一次從布魯克林到不來梅的運輸中,貨物裝卸都是由普通的碼頭工人來完成的,它裝載了5015英噸的貨物,主要是食品、日用品、郵件、機器和車輛的零部件以及53輛車。這批貨物的數量達到了驚人的194582件,而且大小和種類各不相同。
所有的貨物都是碼頭工人一件一件放到貨盤上,再把貨盤降到船艙中一件一件搬下來堆好。他們裝完這艘船總共用了6天時間;橫跨大西洋的航行用了10天半的時間;在不來梅港,碼頭工人是晝夜不停地干活兒,他們卸船用了4天時間。
總而言之,這次航行有一半時間都花在碼頭上了。
為什么非要裝載、卸載、轉移和再裝載那么多的散件貨物?為什么不把貨物裝進大箱子里,然后就只裝卸和搬運這些箱子?
集裝箱便由此誕生了。
運輸業大量采用集裝箱后,由咖啡制造商發出的一只35噸的集裝箱,可以在馬來西亞離開工廠,裝上一艘貨輪,經過16天的航行到達9000營里之外的洛杉磯。一天之后,這個集裝箱被一列火車運到芝加哥,并被隨機轉移到了一輛開往辛辛那提的卡車上。從離開馬來西亞的工廠到抵達俄亥俄州的倉庫,這次11000營里的行程可能只需要花費22天的時間,其速度是每天500英里,而費用比一張單程的頭等艙機票還低。另外,在這一路上,很可能沒有人碰過集裝箱里的東西,甚至根本沒有人打開過它。同傳統的貨輪相比,集裝箱船的裝卸只需要大約1/6的時間和1/3的勞動力。
今天我們要講的“容器技術”的思想正是來源于此。
集裝箱解決了什么問題?在一艘大船上,各種類型的貨物,小到奶粉、化妝品,大到機器設備、跑車,都可以被裝箱到一個標準的集裝箱內。托運貨物的人只需要保證貨物在集裝箱內的密封和固定,而無需關心集裝箱如何被擺放和運輸。
負責運輸的人則無需關心一個個集裝箱內裝的不同貨物,只需把集裝箱當做一個封閉、無差別的獨立個體,進行裝載、卸貨、堆放、運輸,整個過程中集裝箱保持封閉狀態直到被運送到目的地。從輪船到火車,再到卡車運輸,都可以利用起重機(吊車)對集裝箱進行操作,實現流程的自動化,從而以非常廉價的方式,有效解決了不同類型貨物在長距離運輸中的問題。
類似于集裝箱,容器技術的誕生給開發人員帶來了諸多方便,節約了不少成本,不管是在運維還是開發上。
容器技術的誕生史
在很久很久以前,想要在線上服務器部署一個應用,首先需要購買一個物理服務器,在服務器安裝一個操作系統,然后安裝好應用所需要的各種依賴環境,最后才可以進行應用的部署,而且一臺服務器只能部署一個應用。
這就造成了以下幾個明顯問題:
●部署應用非常慢
●需要花費的成本非常高
●而且容易造成資源的浪費,因為往往一個應用使用不了一個服務器的資源
●難于遷移和擴展
●遷移問題:要把應用進行遷移,又得重復部署應用的過程:買服務器 -》 安裝os -》 配置環境 -》 部署應用
●擴展問題:只能購買新的硬件來升級物理服務器,或者購買更高性能的服務器,這就又涉及到遷移問題了
●可能會被限定硬件廠商,因為那時候有不同硬件平臺
虛擬化技術出現以后,對于這種問題有所改變,虛擬化技術會在本地操作系統之上加多一層 Hypervisor層。Hypervisor是一種運行在物理服務器和操作系統之間的中間軟件層,可以虛擬化硬件資源,例如cpu、硬盤、內存資源等。然后我們可以基于通過虛擬化出來的資源之上安裝操作系統,這也就是所謂的虛擬機。
通過Hypervisor層,我們可以創建不同的虛擬機,并且可以限定每個虛擬機的物理資源,并且每個虛擬機都是分離、獨立的。例如A虛擬機給它使用2個cpu、8g內存、100g磁盤,B虛擬機給它使用4個cpu、16g內存、300g磁盤等等。。.。。.這樣就可以實現物理資源利用率的最大化。
如此一來:
●一臺物理機就可以部署多個應用
●每個應用都可以獨立運行在一個虛擬機里
虛擬化技術的優點:
●資源池——一個物理機的資源分配到了不同的虛擬機里
●很容易擴展——增加物理機或者虛擬機即可,因為虛擬機是可以復制的
●很容易云化——亞馬孫AWS,阿里云,谷歌云等
然而,隨著時間推移,用戶發現hypervisor這種方式麻煩越來越多。
為什么?因為對于hypervisor環境來說,每個虛擬機都需要運行一個完整的操作系統以及其中安裝好的大量應用程序。但實際生產開發環境里,我們更關注的是自己部署的應用程序,如果每次部署發布我都得搞一個完整操作系統和附帶的依賴環境,那么這讓任務和性能變得很重和很低下。
基于上述情況,人們就在想,有沒有其他什么方式能讓人更加的關注應用程序本身,底層多余的操作系統和環境我可以共享和復用?換句話來說,那就是我部署一個服務運行好后,我再想移植到另外一個地方,可以不用再安裝一套操作系統和依賴環境。
Linux Container容器技術的誕生(2008年)就解決了IT世界里“集裝箱運輸”的問題。Linux Container(簡稱LXC)它是一種內核輕量級的操作系統層虛擬化技術。
Linux Container主要由Namespace和Cgroup兩大機制來保證實現。
剛才我們上文中提到了集裝箱,集裝箱的作用當然是可以對貨物進行打包隔離了,不讓A公司的貨跟B公司的貨混在一起,不然卸貨就分不清楚了。那么Namespace也是一樣的作用,做隔離。
光有隔離還沒用,我們還需要對貨物進行資源的管理。同樣的,航運碼頭也有這樣的管理機制:貨物用什么樣規格大小的集裝箱,貨物用多少個集裝箱,貨物哪些優先運走,遇到極端天氣怎么暫停運輸服務怎么改航道等等。。.。。通用的,與此對應的Cgroup就負責資源管理控制作用,比如進程組使用CPU/MEM的限制,進程組的優先級控制,進程組的掛起和恢復等等。
下圖展示了容器技術的演變,當前,docker幾乎是容器的代名詞。
為什么容器技術對物聯網和云計算如此重要?
說了這么多,我們不妨來總結一下容器技術的特點:
1.資源獨立、隔離
Docker通過Linux Namespace、Cgroup限制了硬件資源與軟件運行環境,與宿主機上的其他應用實現了隔離,做到了互不影響。不同應用或服務以“集裝箱”(container)為單位裝“船”或卸“船”,“集裝箱船”(運行container的宿主機或集群 )上,數千數萬個“集裝箱”排列整齊,不同公司、不同種類的“貨物”(運行應用所需的程序、組件、運行環境、依賴)保持獨立。
這恰好也是云計算平臺的最基本需求。
2.環境的一致性
開發工程師完成應用開發后build一個docker image,基于這個image創建的container像是一個集裝箱,里面打包了各種“散件貨物”(運行應用所需的程序、組件、運行環境、依賴)。無論這個集裝箱在哪里:開發環境、測試環境、生產環境,都可以確保集裝箱里面的“貨物”種類與個數完全相同,軟件包不會在測試環境缺失,環境變量不會在生產環境忘記配置,開發環境與生產環境不會因為安裝了不同版本的依賴導致應用運行異常。這樣的一致性得益于“發貨”(build docker image)時已經密封到”集裝箱“中,而每一個環節都是在運輸這個完整的、不需要拆分合并的”集裝箱“。
3.輕量化
傳統的虛擬機通過硬件虛擬化創造一個虛擬的系統,每個虛擬機都有自己的內存、硬盤和操作系統,預分配的資源會被虛擬機完全占用。使用虛擬機來隔離應用會造成比較大的資源浪費,一個應用加上依賴只有幾十到幾百M的大小,而操作系統往往還需要消耗10G左右容量。
圖:容器技術和虛擬機的對比
上圖展示了容器技術和虛擬機的區別。容器包含了應用和所需的依賴,但不需要獨占資源,沒有一個虛擬系統,而是和宿主機共享硬件資源和操作系統,和其他容器共享內核,從而實現資源的動態分配。多個容器在同一個宿主機操作系統中的用戶空間以獨立的進程運行。因此,容器相比虛擬機要輕量許多,在一個主機上可以同時啟動近百個容器,一個應用要在數量上橫向擴展非常便捷,而虛擬機則幾乎不可能啟動同樣多的數量。對于重啟操作,容器近似于重啟一個進程,而虛擬機則相當于重啟操作系統。
4.Build Once, Run Everywhere
“貨物”(應用)在“汽車”,“火車”,“輪船”(私有云、公有云等服務)之間遷移交換時,只需要遷移符合標準規格和裝卸方式的“集裝箱”(docker container),削減了耗時費力的人工“裝卸”(上線、下線應用),帶來的是巨大的時間人力成本節約,這使未來僅有少數幾個運維人員運維超大規模裝載線上應用的容器集群成本可能。
看到這里,有沒有覺得非常眼熟?
近幾年大熱的物聯網平臺,宣傳的不也就是這些點嗎?
物聯網平臺商往往會這么告訴你:在我們的平臺上提供了多種多樣的開發工具,你可以使用拖拽式的手法開發程序,完全不用操心底層的操作系統和所依賴的環境,只需專注于客戶的需求和應用程序本身。。.。。.
就像OpenStack、Cloudstack這樣的技術是解決IaaS層的問題,容器技術的誕生其實主要解決了PaaS層的技術實現。
現在最常用的開源云平臺架構Kubernetes、Cloud Foundary還是Serverless,其背后驅動都是容器技術。而市面上多達上百家的物聯網平臺,幾乎都是PaaS平臺。
圖:2015-2017年物聯網平臺企業數量
圖:各XaaS中用戶管理和平臺功能的劃分
說到這里,大家可能就會充分理解容器技術的重要性了。
容器技術為軟件開發和系統運維帶來了顛覆性的突破,而隨著容器技術的普及,系統開發和管理的效率必將上升到一個新的臺階,從而為企業帶來不可估量的效益。
評論
查看更多