1. 程式人生 > >Docker容器技術

Docker容器技術

容器技術

在計算機的世界中,容器擁有一段漫長且傳奇的歷史。容器與管理程式虛擬化 (hypervisor virtualization,HV)有所不同,管理程式虛擬化通過中間層將一臺或者多臺獨立 的機器虛擬執行與物理硬體之上,而容器則是直接執行在作業系統核心之上的使用者空間。因 此,容器虛擬化也被稱為“作業系統級虛擬化”,容器技術可以讓多個獨立的使用者空間執行 在同一臺宿主機上。

由於“客居”於作業系統,容器只能執行與底層宿主機相同或者相似的作業系統,這看 起來並不是非常靈活。例如:可以在 Ubuntu 服務中執行 Redhat Enterprise Linux,但無法再 Ubuntu 伺服器上執行 Microsoft Windows。

相對於徹底隔離的管理程式虛擬化,容器被認為是不安全的。而反對這一觀點的人則認 為,由於虛擬容器所虛擬的是一個完整的作業系統,這無疑增大了攻擊範圍,而且還要考慮 管理程式層潛在的暴露風險。

儘管有諸多侷限性,容器還是被廣泛部署於各種各樣的應用場合。在超大規模的多租戶 服務部署、輕量級沙盒以及對安全要求不太高的隔離環境中,容器技術非常流行。最常見的 一個例子就是“許可權隔離監牢”(chroot jail),它建立一個隔離的目錄環境來執行程序。 如果許可權隔離監牢正在執行的程序被入侵者攻破,入侵者便會發現自己“身陷囹圄”,因為 許可權不足被困在容器所建立的目錄中,無法對宿主機進一步破壞。

最新的容器技術引入了 OpenVZ、Solaris Zones 以及 Linux 容器(LXC)。使用這些新技 術,容器不在僅僅是一個單純的執行環境。在自己的許可權類內,容器更像是一個完整的宿主 機。對 Docker 來說,它得益於現代 Linux 特性,如控制元件組(control group)、名稱空間 (namespace)技術,容器和宿主機之間的隔離更加徹底,容器有獨立的網路和儲存棧,還 擁有自己的資源管理能力,使得同一臺宿主機中的多個容器可以友好的共存。

容器被認為是精益技術,因為容器需要的開銷有限。和傳統虛擬化以及半虛擬化相比, 容器不需要模擬層(emulation layer)和管理層(hypervisor layer),而是使用作業系統的系 統呼叫介面。這降低了執行單個容器所需的開銷,也使得宿主機中可以執行更多的容器。

儘管有著光輝的歷史,容器仍未得到廣泛的認可。一個很重要的原因就是容器技術的復 雜性:容器本身就比較複雜,不易安裝,管理和自動化也很困難。而 Docker 就是為了改變 這一切而生的。

Docker特點

1)上手快

使用者只需要幾分鐘,就可以把自己的程式“Docker 化”。Docker 依賴於“寫時複製” (copy-on-write)模型,使修改應用程式也非常迅速,可以說達到“隨心所致,程式碼即改” 的境界。

隨後,就可以建立容器來執行應用程式了。大多數 Docker 容器只需要不到 1 秒中即可 啟動。由於去除了管理程式的開銷,Docker 容器擁有很高的效能,同時同一臺宿主機中也 可以執行更多的容器,使使用者儘可能的充分利用系統資源。

2)職責的邏輯分類

使用 Docker,開發人員只需要關心容器中執行的應用程式,而運維人員只需要關心如 何管理容器。Docker 設計的目的就是要加強開發人員寫程式碼的開發環境與應用程式要部署 的生產環境一致性。從而降低那種“開發時一切正常,肯定是運維的問題(測試環境都是正 常的,上線後出了問題就歸結為肯定是運維的問題)”

3)快速高效的開發生命週期

Docker 的目標之一就是縮短程式碼從開發、測試到部署、上線執行的週期,讓你的應用 程式具備可移植性,易於構建,並易於協作。(通俗一點說,Docker 就像一個盒子,裡面 可以裝很多物件,如果需要這些物件的可以直接將該大盒子拿走,而不需要從該盒子中一件 件的取。)

4)鼓勵使用面向服務的架構

Docker 還鼓勵面向服務的體系結構和微服務架構。Docker 推薦單個容器只執行一個應 用程式或程序,這樣就形成了一個分散式的應用程式模型,在這種模型下,應用程式或者服 務都可以表示為一系列內部互聯的容器,從而使分散式部署應用程式,擴充套件或除錯應用程式 都變得非常簡單,同時也提高了程式的內省性。(當然,可以在一個容器中執行多個應用程 序)