一、關於應用程式服務器(application server)的淺談
應用程式服務器(application server)現今常指能執行Web應用程式的Web伺服器。一般中小型服務會使用 LAMP(Linux + Apache + MySQL + PHP 的簡稱)的架構來架設一個應用伺服器,網路上關於 LAMP 的資源相當多,大多數的初學者也會使用這樣的組合來練習架設動態網站。即便一個熟練的工程師要以 LAMP 去建置一個網路平台,也得花費不少時間在系統安裝與設定上,才能夠讓手邊的原始碼在網路上執行。
圖1. 應用程式服務器 LAMP 架構
『主機時代』比的是單個伺服器的物理效能。那麼『雲端時代』的來臨,數據雲端化也加速雲端伺服器開發的需求,意味我們不需要在盲目追求高效能的主機,轉為看重憑藉虛擬化技術所構建的叢集處理能力。雲服務無所不在,最重要的關鍵點在於虛擬化技術。一般來說雲端的應用服務是由實體伺服器(Host)上的虛擬機(Virtual Machine,VM)所提供,這些應用程式是在開發人員(Development Team)發布完成後,轉交給維運人員(Operation Team)並且在 VM 上運行。
假設開發者 Ada 本身慣用的電腦是 Mac OS 的系統,客戶的需求是用 Ubuntu 14.04 開發,Ada 選擇在電腦上安裝虛擬主機(Virtual Machine),讓軟體相容性變得不是問題,但是如果 Ada 手邊的其他案子客戶指定或者本身既有的環境不是 Ubuntu 14.04,這樣一來 Ada 的電腦就會有各式各樣不同的虛擬作業系統,Debian、Ubuntu、CentOS、Windows 7……等等好幾十套不同版本的開發環境。一台電腦最多可以執行十台虛擬主機就很勉強,Ada 必須去準備一個硬碟來存放這些映像檔,而且如果需要同時執行多個虛擬主機時候,電腦的效能明顯會降低,總不能因此就再去買一台新的效能更好的電腦。
再來,一旦客戶需要伺服器遷移(例如從亞馬遜雲遷移到其他雲服務),往往需要對每個應用都進行重新部署和調試,這些事情極大的降低了工作效率,而且這些應用直接運行在底層操作系統上,無法保證同一份應用在不同環境中行為一致。
因此容器技術(Container)因應而生。
二、虛擬機 ( VM ) 與容器技術 ( Container )
不在實體伺服器上運行應用程式服務器,反而選擇虛擬主機技術(VM)來運行的優點,以下僅列出三項:
① 每個應用程式擁有獨立甚至相互不同的作業系統及環境
② 管理 Host 的資源(CPU、RAM、Storage)並分配於各 VM,讓應用程式有效利用
如上述開發者 Ada 的例子,如果不使用 VM 技術,這樣每項專案就得換一台電腦或換一個作業系統來開發或維護應用程式。
③ 透過 Hypervisor 管理 VM 快照(Snapshot),以實踐災難恢復(Disaster Recovery)
圖2. 實體伺服器與虛擬機 LAMP 架構比較
雖然伺服器虛擬化和 Container 技術兩者的目標都是為了將一套應用程式所需要的執行環境打包起來,建立孤立環境,以方便在不同硬體中移動。但是兩者的運作方式截然不同。在此我們將以 Docker Container 為例作為容器技術的淺談。
傳統的虛擬主機技術利用硬體的功能來模擬實現也可以通過作業系統軟體來實現,常見的傳統虛擬化技術,例如 vSphere 或 Hyper-V 是以作業系統為中心,而 Container 技術則是直接將一個應用程式所需的相關程式碼、函式庫、環境配置檔都打包起來建立沙箱執行環境。
其中最明顯的差異是,虛擬機器需要安裝作業系統(安裝 Guest OS)才能執行應用程式,而 Container 技術不是在 OS 外來建立虛擬環境,是透過作業系統內的核心系統層來打造虛擬執行環境,透過共用 Host OS 的作法,取代一個一個 Guest OS 的功用。
圖3.虛擬機與 Docker Container 的應用程式服務器架構比較
表1. 容器技術與虛擬主機性能比較表
功能平台 |
容器(Container) |
虛擬主機 (Virtual Machine) |
技術 |
不需要安裝作業系統 以應用程式為中心 |
需要安裝作業系統(Guest OS) 以作業系統為中心 |
開機載入速度 |
秒為單位 |
分鐘為單位 須等待作業系統開機時間 |
硬碟容量 |
MB 為單位 |
GB 為單位 |
相容性 |
接近原生 |
受限於虛擬技術支援性 |
單一主機 同時運行 |
最高可到數千個 |
最多可到數十個 |
隔離性 |
完全隔離 |
完全隔離 |
Container 技術透過共用 Host OS 的作法,取代一個一個 Guest OS 的功用,因此建立 Container 不需要等待作業系統開機時間,不用 1 分鐘或幾秒鐘就可以啟用,遠比需要數分鐘甚至數十分鐘才能開啟的傳統虛擬機來得快。
一個 Container 的映象檔內可以安裝多支程式,但建議一隻程式安裝在一個 Container 內,再把這些 Container 疊起來提供一個完整的服務。類似一種 Microservices(微服務)的新軟體架構,把將組成一個應用系統的每個 Stack 拆解成許多小型服務,每一個服務都是包在 Container 裡的一隻程式,例如 MySQL 服務就是部署在 Container 內的 MySQL。這樣做的好處是可以建立一個鬆散耦合的彈性應用程式架構,可以輕易抽換其中一個 Container。像是要升級 MySQL,只需要重新載入新版 MySQL 的 Container 映象檔,就可以完成資料庫升級,不用將整套系統停機。
容器化就像是貨櫃允許利用船隻、火車或貨車運輸貨物,而不論內含哪種貨物,軟體容器是軟體部署的標準單位,可以包含不同程式碼和相依性。而且可以將所開發的程式用容器打包起來,快速移植到另一個平台上。
也正意味著,如果再開發一套 Web 線上系統時候,我們將不論是否在本機端、開發機、測試機、預備機或正式機上,都可以保證應用程式的環境是一致的,也可以降低因底層操作系統環境配置的不同所產生的錯誤。
看起來容器會完全掌握未來市場,並取代 VM 的所有應用,但至少目前不會。如果雲服務符合以下兩點任一條件,VM 的架構就比較符合需求。
- 在應用程式運行的環境中,維運人員需要管理到系統底層。
- 必須建構在許多不同的作業系統之上。
當然大部分情況下建議把應用程式容器化,跟上時代趨勢,藉此提升市場競爭力。
--
文獻參考 - 網站資源
- 淺談輕量化的虛擬技術 - Docker 容器,網址:http://www.cc.ntu.edu.tw/chinese/epaper/0036/20160321_3611.html
- 淺談虛擬機 ( VM ) 與容器 ( Container ) 之差異,網址:https://www.inwinstack.com/2017/10/13/vm-container-difference/
- 10 個 Q&A 快速認識Docker,網址:https://www.ithome.com.tw/news/91847
評論