架構雜談《七》

AjuPrince發表於2019-07-25

架構雜談《七》

容器VS虛擬機器

一、什麼是虛擬機器

  虛擬機器(Virtual Machine)指通過軟體模擬的具有完整硬體系統功能的、執行在一個完全隔離環境中的完整計算機系統
  虛擬系統通過生成現有作業系統的全新虛擬映象,它具有真實windows系統完全一樣的功能,進入虛擬系統後,所有操作都是在這個全新的獨立的虛擬系統裡面進行,可以獨立安裝執行軟體,儲存資料,擁有自己的獨立桌面,不會對真正的系統產生任何影響 ,而且具有能夠在現有系統與虛擬映象之間靈活切換的一類操作系統。虛擬系統和傳統的虛擬機器(Parallels Desktop ,VmwareVirtualBoxVirtual pc)不同在於:虛擬系統不會降低電腦的效能,啟動虛擬系統不需要像啟動windows系統那樣耗費時間,執行程式更加方便快捷;虛擬系統只能模擬和現有作業系統相同的環境,而虛擬機器則可以模擬出其他種類的作業系統;而且虛擬機器需要模擬底層的硬體指令,所以在應用程式執行速度上比虛擬系統慢得多。
  流行的虛擬機器軟體VMware(VMWare ACE)、Virtual BoxVirtual 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、如有不合適的地方請反饋。綜合後更改。

相關文章