架構雜談《七》

容器VS虛擬機

一、什麼是虛擬機

虛擬機(Virtual Machine)指通過軟件模擬的具有完整硬件系統功能的、運行在一個完全隔離環境中的完整計算機系統。

虛擬系統通過生成現有操作系統的全新虛擬鏡像,它具有真實windows系統完全一樣的功能,進入虛擬系統後,所有操作都是在這個全新的獨立的虛擬系統裡面進行,可以獨立安裝運行軟件,保存數據,擁有自己的獨立桌面,不會對真正的系統產生任何影響 ,而且具有能夠在現有系統與虛擬鏡像之間靈活切換的一類操作系統。虛擬系統和傳統的虛擬機(Parallels Desktop ,Vmware,VirtualBox,Virtual pc)不同在於:虛擬系統不會降低電腦的性能,啟動虛擬系統不需要像啟動windows系統那樣耗費時間,運行程序更加方便快捷;虛擬系統只能模擬和現有操作系統相同的環境,而虛擬機則可以模擬出其他種類的操作系統;而且虛擬機需要模擬底層的硬件指令,所以在應用程序運行速度上比虛擬系統慢得多。

流行的虛擬機軟件有VMware(VMWare ACE)、Virtual Box和Virtual PC,它們都能在Windows系統上虛擬出多個計算機。

總結下:

虛擬機用於為用戶提供一個完整的系統鏡像,常見的虛擬機有VMware、Virtual Box、KVM等。虛擬機技術可以為每個用戶分配虛擬化後的CPU、內存和I/O等設備資源,但是為了能運行應用程序,除了需要部署應用程序本身及其依賴外,還需要安裝整個操作系統和驅動。

二、什麼是容器

容器是一種輕量級、可移植的為應用程序提供了隔離的運行空間。每個容器內都包含一個獨享的完整用戶環境,並且一個容器內的環境變動不會影響其他容器的運行環境,可以使應用程序在幾乎任何地方以相同的方式運行(如 在開發人員自己的本子上創建並測試好的容器無須任何修改就能在生產環境中的虛擬機、物理服務器或者雲上運行)

在技術方面,容器是通過一系列系統級別的機制來實現的(如:通過Linux Namespaces進行空間隔離,通過文件系統的掛載點來決定容器可以訪問哪些文件;通過cgroups 來確定每個容器可以利用多少資源),容器之間通過共享同一個系統內核來提升內存的使用率。

三、容器與虛擬機的區別

容器是對應用層的抽象,它把應用程序的代碼和相關依賴打包在一起執行,多個容器可以在同一臺物理機上互不影響地獨立運行,並且共享操作系統內核。啟動快、佔用空間少。而虛擬機是物理硬件層上的虛擬化,系統管理程序使虛擬機能夠運行在同一臺物理機上,但是每臺虛擬機必須包括一整套操作系統、應用程序和各種依賴庫等。啟動慢、佔用空間大。

架構雜談《七》

四、容器主要解決的問題

容器有輕量級、可隔離性和可移植等特性,所以應用程序的容器化使得應用程序具備了超強的可移植性。

在 Web 1.0 時代,信息是單向的,交互只在人與網絡之間進行,大多人上網是為了看新聞,因此應用程序相對簡單,一般採用 LAMP。 ( Linux-Apache-MySQL-PHP )的三層架構(Presentation 、 Application 、 Data ),只需要部署到有限的幾臺物理服務器上;在如今的 Web2.0甚至 Web 3.0 時代,互聯網連接一切,包括連接人與人、人與物、物與物,系統架構較 10 年前己經變得非常複雜,開發人員通常使用多種服務構建和組裝應用,比如分佈式消息隊列 Kafka、分佈式緩存 Redis、分佈式文件系統 HDFS 或 Spring Cloud 或 Azure Service Fabric等。複雜應用系統的相應部署環境也變得非常複雜,可能會部署到不同的環境中,比如開發服務器、測試服務器和生產服務器,服務器也可能是虛擬服務器、私有云或公有云等,如下圖:

架構雜談《七》

因為存在各種服務和環境,所以開發人員在編寫代碼時需要考慮不同的運行環境,運維人員則需要為不同的服務和平臺進行各種配置,對於他們雙方來說,這些都是艱鉅的任務,那麼如何讓每種服務在所有的部署環境中順利運行呢?容器就很好地幫我們解決了這個難題。

我們先聯想下幾十年前的運輸行業,在每一次運輸中,貨主與承運方都會擔心貨物因種類不同而受損,比如易碎的東西被錯誤地壓在了最下面。另 一方面,在運輸過程中需要使用不同的交通工具,比如貨物先被裝上卡車運到碼頭,再被裝上船,到岸後又被卸下船,再被裝上火車 ,到達目的地再被卸下 。其中的大部分時間都花費在對不同物品的裝貨、卸貨上,而且搬上搬下還容易損壞物品 。幸運的是,集裝箱的發明解決了這個難題 : 任何貨物,不管是床墊還是機器,都被放在各自的集裝箱中,集裝箱在整個運輸過程中都是密封的,只有到達目的地才被打開。標準集裝箱可以被高效地裝卸、重疊和長途運輸。現代化的起重機可以方便地在卡車、輪船和火車之間移動集裝箱,集裝箱被譽為運輸業與世界貿易的最重要的發明。

Docker 將集裝箱思想運用到對軟件的打包上,為代碼提供了 一個基於容器的標準化運輸系統,可以將任何應用及其依賴打包成一個輕量級、可移植、自包含的容器,可以運行在幾乎所有操作系統上。

五、Docker的優勢

 1)、Docker 在開發方面的優勢

每個人的開發環境都不一樣,由於在開發過程中會不斷地切換項目工程,所以每次都要不斷的重複修改和設置開發環境,而Docker可以使這一過程變得自動化,讓開發人員更加關注軟件開發(比如:開發人員使用Docker後就不需要單獨安裝和配置數據庫,也不需要擔心不同版本的衝突問題),容器化的應用更容易構建、分享和運行,如果團隊有新的同事加入,也不需要花費好幾個小時講解如何搭建環境及安裝軟件和相關的配置,只需要花費幾分鐘安裝Docker就能編譯和調試程序了。

2)、Docker 在運維方面的優勢

Docker 使軟件的發佈更加高效,不管是更新版本還是修復 Bug,都能快速發佈完成,並且能瞬間伸縮擴展。Docker 能夠實現自動化的編譯、打包、測試和部署,運維人員不再需要WiKi 、 README 、 CleckList 文檔,因為 Docker 在開發、測試和生產環境中都使用了相同的鏡像,所以更新時不會出現不一致的問題。

3)、Docker 在容器和虛擬機方面的優勢

Docker 使容器和虛擬機相結合( Docker Machine 實現了容器和虛擬機的有效結合),使部署和管理應用變得更加靈活 。我們可以在虛擬機中啟動一個容器,這裡的虛擬機並不是由 Docker控制的,而是通過現有的虛擬化管理設施來控制的 。一旦系統實例啟動,就可以通過安裝 Docker來運行容器並進行其他特殊設置。同時由於不同的容器運行在不同的虛擬機上,容器之間也能有很好的隔離。

架構雜談《七》

說明:

1、參考書籍:《分佈式服務架構:原理、設計與實戰》

2、如有不合適的地方請反饋。綜合後更改。

架構雜談《七》


分享到:


相關文章: