1. 程式人生 > >docker容器詳解(入門必看)(一)

docker容器詳解(入門必看)(一)

本篇文章不會涉及到複雜的名詞,不會涉及到複雜的實現過程,這篇文章的一個基本目的是讓你明白docker是幹嘛的,它這樣做與之前相比有什麼進步,哪些地方有優化。希望能用最簡單的語言讓你明白,這種技術帶來的利弊。
目錄

虛擬化發展

在我們上大學的時候,就會被馮諾依曼體系洗腦,導致我們都知道了計算機是由計算器、控制器、儲存器、輸入、輸出這五部分組成。那計算器和控制器現在一般都結合在一起作為cpu,儲存器一般包括記憶體和磁碟,輸入輸出一般指的是網路的I/O或者磁碟的I/O。所以,我們在生活中常見的IT資源就有cpu、記憶體、磁碟、網絡卡等等這些裝置,使用作業系統來驅動這些裝置,讓它們協同合作,這就變成了一臺完整的計算機。

那麼,問題來了,隨著計算任務的變化,我們對計算機有了更多的需求。比如,你只有一臺電腦,上面已經裝了windows系統,你卻想讓他在跑一臺linux;再比如,你現在的電腦計算能力不夠了,但是加上你同學的電腦就可以了。也就是說,我們想要計算機的資源能夠具有很強的彈性伸縮能力,可任意增長,也可任意消減。

於是,科學家們提出了虛擬化這一說法,希望能夠使用軟體的方法重新定義和劃分IT資源,可以實現IT資源的動態分配、靈活排程、跨域共享,提高IT資源利用率,使IT資源能夠真正成為社會基礎設施,服務於各行各業中靈活多變的應用需求。虛擬化目前有兩個方向,其一是把一個物理機虛擬成多個獨立的邏輯虛擬機器;其二是把若干分散的物理機擬為一個大的邏輯虛擬機器。現在用的較多的一般都是第一種技術。

虛擬化技術其實是很早就提出來的概念,經歷了這麼多年的發展,其技術迭代如下圖所示。現在處於容器級虛擬化階段,也就是將應用程式、開發軟體包、依賴環境等統一打包到容器中,將整個容器部署至其他的平臺或者伺服器上。
這裡寫圖片描述
圖1 虛擬化發展

對比主機虛擬化和容器虛擬化

主機級虛擬化

主機級別的虛擬化是將物理資源轉變為邏輯上可以管理的資源,以打破物理結構之間的壁壘,使計算元件執行在虛擬的基礎上,而不是真實的物理資源上。通過虛擬化技術,可以將物理資源轉變為邏輯資源(虛擬機器),應用程式服務執行在虛擬資源上,而不是真實的物理機上。因此,對於主機級虛擬化,我們的實現方式一般是想辦法去模擬出硬體環境,模擬出虛擬的cpu、記憶體、硬碟、網絡卡等資源,然後在這些虛擬資源之上安裝合適的作業系統來控制這些資源。


這裡寫圖片描述
圖2 主機虛擬化
如上圖所示,在VMM(又叫做hypervisor)之上,可以模擬出邏輯的計算機虛擬環境,然後安裝作業系統,使其成為一臺邏輯上虛擬的計算機主機,該主機有自己的系統核心,有自己的使用者空間,可以在自己的使用者空間內跑各種各樣的應用程式。

容器虛擬化

容器是一種虛擬化的方案,和傳統的虛擬機器(通過中間層”guerst OS”執行服務)不同,Docker直接執行在作業系統之上。因此容器虛擬化也被稱之為作業系統虛擬化。Docker容器依賴於Linux核心特性,Namespace和Cgroups,所以只能執行在Linux之上。
一句話來概括的話,主機級虛擬化就是通過各種各樣的手段,把物理資源重新分配,然後抽象出一部分拿來做虛擬機器的虛擬硬體,是對硬體的模擬;而容器虛擬化技術相當於把作業系統進行虛擬化,把物理的作業系統模擬為邏輯上的多個作業系統,不同的作業系統有自己的使用者空間,實現了應用程式間的隔離。

常見問題

這裡寫圖片描述
圖3 對比
上面這幅圖可以幫助我們更主管的理解二者之間的區別,下面歸納常見的疑問。

Q1:Container技術和伺服器虛擬化是一樣的技術嗎?

答:不是。兩者雖然都屬於虛擬化的技術,目標都是為了將一套應用程式所需的執行環境打包起來,建立一個孤立環境,方便在不同的硬體中移動,但兩者的運作思維截然不同。簡單來說,常見的傳統虛擬化技術如vSphere或Hyper-V是以作業系統為中心,而Container技術則是一種以應用程式為中心的虛擬化技術。

傳統虛擬化技術從作業系統層下手,目標是建立一個可以用來執行整套作業系統的沙盒獨立執行環境,習慣以虛擬機器(Virtual Machine)來稱呼。而Container技術則是直接將一個應用程式所需的相關程式程式碼、函式庫、環境配置檔案都打包起來建立沙盒執行環境,為了和傳統虛擬化技術產生的虛擬機器區分,Container技術產生的環境就稱為Container。

Q2:一般常見的虛擬機器和Container有何不同?
答:最明顯的差別是,虛擬機器需要安裝作業系統(安裝Guest OS)才能執行應用程式,而Container內不需要安裝作業系統就能執行應用程式。Container技術不是在OS外來建立虛擬環境,而是在OS內的核心繫統層來打造虛擬執行環境,透過共享Host OS的作法,取代一個一個Guest OS的功用。Container也因此被稱為是OS層的虛擬化技術。

Q3:為何Container是輕量級虛擬化技術?
答:因為Container技術採取共享Host OS的作法,而不需在每一個Container內執行Guest OS,因此建立Container不需要等待作業系統開機時間,不用1分鐘或幾秒鐘就可以啟用,遠比需要數分鐘甚至數十分鐘才能開啟的傳統虛擬機器來的快。

效能比較

Hyper-V、KVM和Xen等虛擬機器管理程式都“基於虛擬化硬體模擬機制。這意味著,它們對系統要求很高。” 然而,容器卻使用共享的作業系統。這意味著它們在使用系統資源方面比虛擬機器管理程式要高效得多。容器不是對硬體進行虛擬化處理,而是駐留在單單一個Linux例項上。這反過來意味著,你可以“丟棄沒有用的99.9%的虛擬機器垃圾,剩下一個小巧簡潔的膠囊式容器,裡面含有你的應用程式,”,因此,藉助經過全面調優的容器系統,你就可以在同一硬體上擁有數量比使用Xen虛擬機器或KVM虛擬機器多出四到六倍的伺服器應用例項。

容器技術的優劣

舉一個例子來說明容器技術的優越性,比如說同時要在虛擬機器和容器上都部署Nginx伺服器,那麼分析下這二者之間的區別

  • 傳統虛擬化:硬體伺服器-HostOS-VMM-GuestOS-Nginx WEB服務

  • Docker虛擬化:硬體伺服器-HostOS-VMM-Nginx WEB服務

傳統的虛擬化技術多了一層要去啟動虛擬機器的作業系統的流程,而虛擬機器的作業系統執行時非常消耗記憶體資源的。在資源的利用上,以及響應速度上,容器虛擬化技術要優越於主機虛擬化技術。

Docker目標

  • 提供簡單輕量級的建模方式(docker的啟動是毫秒級的)

  • 職責的邏輯分離:開發人員只需要關注容器中執行的程式,運維人員只需要關注對容器的管理。Docker開發提高了開發程式和部署容器的一致性

  • 快速高效的開發宣告週期:縮短程式碼從開發、測試到部署上線的生命週期

  • 鼓勵使用面向服務的架構:docker推薦單個容器只執行一個應用程式/程序,這樣就形成了一個分散式的應用程式模型,避免服務之間的互相影響。實現 高內聚,低耦合。

Docker使用場景

1.使用Docker容器開發、測試、部署服務:docker本身是輕量級的,所以本地開發人員可以構建、執行並分享docker容器,容器可以在開發環境中建立,然後提交到測試,在到生產環境。

2.建立隔離的執行環境:在很多企業應用中,同一服務的不同版本可能服務於不同的使用者,使用Docker很容易建立不同的環境來執行不同版本的服務

3.搭建測試環境:有於Docker的輕量化,所以開發者很容易在本地搭建測試環境,用來測試程式在不同系統下的相容性,甚至叢集式的測試環境。

4.構建多使用者的平臺服務(PaaS)基礎設施

5.即同軟體即服務(SaaS)應用程式

6.高效能、超大規模的宿主機部署

Docker缺陷

以上介紹了那麼多Docker的優點,那麼它有沒有某些地方在設計之初的時候,是沒有被考慮進去的,當然是有的。Docker是一項對開發人員及其友好的技術,因為開發跑的程式只要打包好,就可以直接執行在生產環境中了,但這對於運維是一項挑戰,因為,這個映象已經是被打包好的,如果你想要在裡面做一些效能上的調整是很難得,你很難去對已經打包好的這個映象做處理。又或者,服務執行出問題了,你需要查日誌,分析資料,然後做相應的操作,但對於已經封裝好的容器來說,這是有難度的。

小結

總之,docker是目前虛擬化技術發展的一個頂峰了,前陣子還報道,京東已經將所有應用從虛擬機器遷移到了容器中,構建了最大的k8s叢集,由此可知,這項技術正在以驚人的速度改變著我們現行的世界。