正如全部關心docker技術的人所知道的那樣,docker是以容器虛擬化爲技術爲基礎的軟件,所以在學習docker具體的內容以前,有必要討論一下虛擬化和容器技術。docker
虛擬化技術:
在瞭解虛擬化技術時,各位同窗能夠以本身機器上運行的虛擬機做爲原型,方便理解。
一句話來描述虛擬化技術,就是把真實的計算機硬件資源(內存、CPU、網卡等)經過虛擬化技術虛擬化成虛擬的計算機資源供程序運行使用。性能
虛擬化爲應用程序跨平臺而生的:學習
在計算機技術發展的早期,各種計算平臺、計算資源所提供的接口、調用方式十分雜亂,沒有像今天這樣相對統一的標準。因爲要適配不一樣的平臺,寫各類兼容代碼,這無形給開發者帶來了不少的困擾。這種混亂甚至都出如今 IBM 這一家公司下不一樣機型的機器上,因此 IBM 的工程師們創造了虛擬化技術,用來幫助程序快速適配不一樣平臺的物理機器。spa
熟悉計算機原理的朋友應該知道,程序對計算機資源的調用主要依賴於操做系統所給出的接口。咱們的程序經過操做系統提供的接口,向物理硬件發送指令。虛擬化技術正是經過其自己適配不一樣平臺的硬件,而加以抽象成統一的接口,來實現程序跨平臺運行這一目的的。操作系統
將虛擬化應用於資源管理:
docker的原理其實和這個差很少,只不過docker犧牲了跨平臺來解決虛擬技術的效率問題。
將虛擬化用於資源管理的道理其實並不複雜,虛擬化技術自己就是抽象計算機的物理資源進而加工成虛擬的計算資源的,它天然很容易從中作「手腳」,來告訴應用程序一些虛假的資源數據。例如,咱們只要告訴程序計算機只有 4GB 內存,那麼無論真實的物理機是 8GB、16GB 仍是 32GB,應用程序都會按照 4GB 這個虛假的值來處理它的邏輯。接口
經過虛擬化技術來管理計算機資源的方式,不但讓咱們對計算機資源的控制變得更加靈活,也大幅提升了計算機資源的使用率(注意:這裏是提升計算機資源使用率,而非減小程序資源的佔用率,)。圖片
虛擬化的分類:
硬件虛擬化:
硬件自己更支持虛擬化。舉個例子來講,某個平臺的 CPU,可以將另一個平臺的指令集轉換爲自身的指令集執行,並給程序徹底運行在那個平臺上的感受。又或者說,CPU 可以自身模擬裂變,讓程序或者操做系統認爲存在多個CPU,進而可以同時運行多個程序或者操做系統。這些都是硬件虛擬化的體現。
軟件虛擬化:
軟件虛擬化則指的是經過軟件的方式來實現虛擬化中關鍵的指令轉換部分。依然用 CPU 的例子來講話,在軟件虛擬化實現中,經過一層夾雜在應用程序和硬件平臺上的虛擬化實現軟件來進行指令的轉換。也就是說,雖然應用程序向操做系統或者物理硬件發出的指令不是當前硬件平臺所支持的指令,這個實現虛擬化的軟件也會將之轉換爲當前硬件平臺所能識別的。內存
容器:
容器技術是一種全新意義上的虛擬化技術,按分類或者實現方式來講,其應該屬於操做系統虛擬化的範疇,也就是在由操做系統提供虛擬化的支持。資源
所謂容器技術,指的是操做系統自身支持一些接口,可以讓應用程序間能夠互不干擾的獨立運行,而且可以對其在運行中所使用的資源進行干預。固然,目前來講容器技術尚未一個嚴格的定義,其實現方式也各有不一樣,因此這裏只能算是個人一點小小總結概括。開發
因爲應用程序的運行被隔離在了一個獨立的運行環境之中,這個獨立的運行環境就好似一個容器,包裹住了應用程序,這就是容器技術名字的由來。
容器技術近年來已是一個火遍大江南北的概念了,其之因此能名聲大噪,很重要的一個緣由是其在運行性能上要遠超虛擬機等其餘虛擬化實現。更甚一步說,運行在容器虛擬化中的應用程序,在運行效率上與真實運行在物理平臺上的應用程序不相上下。
爲何容器技術可以造就近乎完美的運行效率呢?這就得從容器技術如何實現應用程序的指令轉換開始提及。下面這張圖展現了容器技術如何進行指令轉換的。
...
實在無奈,沒有找到容器技術進行指令轉換的圖片,由於容器技術壓根沒有作指令轉換。是的,你沒有聽錯,有時候解決問題的最佳方法就是不解決它。
因爲沒有指令轉換,運行在容器中的應用程序自身必須支持在真實操做系統上運行,也就是必須遵循硬件平臺的指令規則。
不少同窗這時候就有疑問了,指令都不轉換,也沒有解決程序跨平臺兼容的問題,這算哪門子虛擬化技術。
沒錯,正是這種緣由,不少人並不認同容器技術屬於虛擬化技術的範疇。不過另外一派觀點認爲,容器技術提供了相對獨立的應用程序運行的環境,也提供了資源控制的功能,因此咱們依然能夠概括其爲一種實現不徹底的虛擬化技術。