Docker--容器技術

什麼是“容器”和“虛擬機”

容器和虛擬機它們的目的很相似:即將應用程序和它的依賴放到一個可以在任何環境運行的自足單元中。

此外,容器和虛擬機消除了對物理硬件的需求,從而在能源消耗和成本效益方面能讓我們更有效地使用計算資源,

容器和虛擬機的主要區別在於它們的架構方式。讓我們繼續深入瞭解。

虛擬機

虛擬機在本質上是對現實中計算機的仿真,它會像真實的計算機一樣執行程序。使用 “hypervisor” 可以將虛擬機運行於物理機上。hypervisor 可以在主機運行,也可以在“裸機”上運行。

讓我們來揭開這些術語的面紗:

hypervisor(之後都以虛擬機管理程序稱呼)是能讓虛擬機在其上運行的軟件,固件或者硬件。虛擬機管理程序本身會在物理計算機上運行,稱爲“主機”。主機爲虛擬機提供資源,包括 RAM 和 CPU。這些資源在虛擬機之間被劃分並且可以根據需要進行分配。所以如果一個虛擬機上運行了資源佔用更大的應用程序,相較於其它運行在同一個主機的虛擬機你可以給其分配更多的資源。

運行在主機上的虛擬機(再次說明,通過使用虛擬機管理程序)通常也被叫做“訪客機”。訪客機包含了應用以及運行這個應用所需要的全部依賴(比如:系統二進制文件和庫)。它還帶有一個自己的完整虛擬化硬件棧,包括虛擬化的網絡適配器,儲存和 CPU-這意味着它還擁有自己成熟的整個訪客操作系統。從虛擬機內部來看,訪客機的操作都認爲其使用的都是自己的專用資源。從外部來看,我們知道它是一個虛擬機-和其它虛擬機一起共享主機提供的資源。

就像前面所提到的,訪客機既可以運行在託管的虛擬機管理程序上,也可以運行在裸機虛擬機管理程序上。它們之間存在一些重要的差別。

首先,託管的虛擬化管理程序是在主機的操作系統上運行。比如說,可以在一臺運行 OSX 操作系統的計算機的系統上安裝虛擬機(例如:VirtualBox 或者 VMware Workstation 8)。虛擬機無法直接訪問硬件,因此必須通過主機上運行的操作系統訪問(在我們的例子中,也就是 Mac 的 OSX 操作系統)。

託管虛擬機管理程序的好處是底層硬件並不那麼重要。主機的操作系統會負責硬件的驅動而不需要管理程序參與。因此這種方式被認爲具備更好的“硬件兼容性”。在另一方面,在硬件和管理程序之間這個額外的附加層會產生更多的資源開銷,這會降低虛擬機的性能。

裸機虛擬機管理程序通過直接在主機硬件上安裝和運行來解決這個性能問題。因爲它直接面對底層的硬件,所以並不需要運行在主機的操作系統之上。在這種情況下,安裝在主機上第一個作爲操作系統運行的就是這個裸機虛擬機管理程序。與託管虛擬機管理程序不同,它有自己的設備驅動直接與每個組件交互,以執行任何 I/O,處理或特定於操作系統的任務。這樣可以獲得更好的性能,可伸縮性和穩定性。這裏的權衡在於其對硬件的兼容性有限,因爲裸機虛擬機管理程序內置的設備驅動只有那麼多。

在討論了虛擬機管理程序之後,你可能想知道爲什麼我們需要在虛擬機和主機之間這個額外的“虛擬機管理程序”層。

好吧,虛擬機管理程序在其中確實發揮了重要的作用,由於虛擬機擁有自己的虛擬操作系統,管理程序爲虛擬機管理和執行訪客操作系統提供了一個平臺。它允許主機與作爲客戶端運行的虛擬機之間共享其資源。

Docker--容器技術

虛擬機圖示

正如你可以在圖示中所看到的,VMS 會爲每個新的虛擬機打包虛擬硬件,一個內核(即操作系統)和用戶空間。

容器

與提供硬件虛擬化的虛擬機不同,容器通過抽象“用戶空間”來提供操作系統級別的虛擬化。當我們詳解容器這個術語的時候你就會明白我的意思。

從所有的意圖和目的來看,容器看起來就像一個虛擬機。比如說,它們有執行進程的私有空間,可以使用 root 權限執行命令,具有專有的網絡接口和 IP 地址,允許自定義路由和 iptable 規則,可以掛載文件系統等。

容器和虛擬機之間的一個重要區別在於容器和其它容器共享主機系統的內核。

Docker--容器技術

容器圖示

這圖表明容器只會打包用戶空間,而不是像虛擬機那樣打包內核或虛擬硬件。每個容器都有自己獨立的用戶空間從而可以讓多個容器在單個主機上運行。我們可以看到所有操作系統級別的體系架構是所有容器共享的。要從頭開始創建的部分只有 bins 和 libs 目錄。這就是容器如此輕巧的原因。

Docker 是從哪來的?

Docker 是基於 Linux 容器技術的開源項目。它使用 Luinux 的內核功能(如命名空間和控制組)在操作系統上創建容器。

容器已經遠遠不是一個新技術:Google 已經使用他們自己的容器技術好多年了。其它的容器技術包括 Solaris Zones、BSD jails 和 LXC 也已經存在好多年。

那麼爲啥 Docker 會突然取得成功呢?

使用簡單:Docker 使得任何人(開發人員,運維,架構師和其他人)都可以更輕鬆的利用容器的優勢來快速構建和測試可移植的應用程序。它可以讓任何人在他們的筆記本電腦上打包應用程序,不需要任何修改就可以讓應用運行在公有云,私有云甚至裸機上。Docker 的口頭禪是:“一次構建,處處運行”。

速度:Docker 容器非常輕量級和快速。因爲容器只是運行在內核上的沙盒環境,因此它們佔用的資源更少。與可能需要更多時間來創建的虛擬機相比,你可以在幾秒鐘內創建一個 Docker 容器,因爲虛擬機每次都必須啓動一個完整的操作系統。

Docker Hub:Docker 用戶也可以從日益豐富的 Docker Hub 生態中受益,你可以把 Docker Hub 看作是 “Docker 鏡像的應用商店”。Docker Hub 擁有數萬個由社區構建的公共鏡像,這些鏡像都是隨時可用的。在其中搜索符合你需求的鏡像非常容易,你只需要準備拉取鏡像而且幾乎不需要任何修改。

模塊化和可擴展性:Docker 可以讓你輕鬆地把應用程序按功能拆分爲單個獨立的容器。比如說,你的 Postgre 數據庫可以運行在一個容器中,Redis 服務運行在另一個容器中,而 Node.js 應用運行在另一個容器中。使用 Docker,將這個容器鏈接在一起以創建你的應用程序將會變得更簡單,同時在將來可以很輕鬆地擴展和更新單獨的組件。最後但並不重要的是,有誰不喜歡 Docker 的鯨魚(Docker 的標誌)呢?:)

Docker--容器技術

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章