第236期 / June 5, 2017

研發新視界

分享到臉書!分享到維特!分享到噗浪!分享到Google+!分享到微博!轉寄友人友善列印

輕量化的虛擬技術–Docker發展及應用

作者/陳佳宏

[發表日期:2017/6/5]

前言

對於軟體工程師來說,在程式開發及環境部屬上虛擬機器(Virtual Machine)是一項不可或缺的技術,工程師可以在主機上使用常見的VMWare、Hyper-V建立孤立的環境,在這孤立的環境上進行程式開發或環境部屬,有了這虛擬化的技術,讓軟體相容性不再是問題。

但是安裝虛擬主機往往需要花費幾十分鐘至幾個小時,才能完整安裝自己所需的作業系統、應用程式...等等。另外也必須考慮到系統版本,有時可以目前所使用的版本已經不支援舊版軟體的編譯,又得花費額外的工時安裝可以讓這軟體編譯的系統版本,才能繼續往下開發。這樣的情況一再發生,久而久之一台主機上必須同時執行多個虛擬機器,會降低系統效能。

若此時有個新的虛擬技術,可以在一台主機上同時執行數百個虛擬應用程式,而且彼此完全孤立。因為每個虛擬應用程式的容量並不大,開機載入的速度也比虛擬機器還快許多,Docker正是符合此需求的虛擬技術。


《圖一》


Docker的誕生

Docker是由Docker Inc這間公司所創建的產品,而Docker Inc的前身為dotCloud。dotCloud為一間PaaS供應商,針對全世界的公司提供Web、Application、Transaction、Database等IDC服務。但隨著提供的服務越來越複雜,dotCloud也面臨要將這些服務最佳化及資源分配的挑戰。dotCloud針對他們所提供的服務深入研究之後有重大的發現,原來以VM為最小單位的服務區隔方式並不符合成本效益及客戶需求。dotCloud所提供的IDC服務通常有以下幾個要點:
  • 以Linux平台為主


  • VM的Hypervisor必須模擬硬體,無法使用原生硬體的效能,而且所佔容量也太大。


  • 快速的啟動時間


  • 更彈性的服務組合


  • 快速的服務升級及更新時間

為了滿足以上的條件,dotCloud的工程師們開始研究出一個以Linux為主,不須使用Hypervisor(虛擬機器監視器),又可以讓服務能夠獨立執行的環境。在2013年dotCloud的工程師以container的技術包裝出一個LXC的產品,一開始這項產品只是dotCloud公司內部專屬專案,用來滿足公司的需求,到2013年7月dotCloud將這個專案進行商業化,並且讓Docker成為Open Source的專案,dotCloud也在同年改名為Docker Inc,Docker就這麼誕生了。

Docker的概念及比較

Docker是一個開源專案,讓應用程式部屬在軟體容器(Container),讓建立、部屬及執行應用程式更加容易,透過容器的機制開發者可以更隨心所欲將自己所需的應用程式包裝,並且可以將包裝好的應用程式轉載至其他主機,因此當開發者轉換主機開發的時候可以無需顧慮到太多繁雜的設定。
其實整理來說Docker還是與虛擬機器的概念很相似,只是不像虛擬機器必須從整個作業系統安裝起,Docker讓所有應用程式在同樣的Linux核心系統上運作,所以只需要將未安裝的應用程式搬運至指定主機。這可使應用程式提升效能並且減少容量。

更重要的是Docker是開源碼,也意指任何人都可以將Docker功能做延伸,將原本不在其中的功能自己再附加上去,使其功能更加完整。

Docker主要的概念分成三部分,映像檔(Image)、容器(Container)、倉庫(Repository)
  • 映像檔(Image) - Docker映像檔為一個唯讀的檔案,可以用來建立Docker容器。


  • 容器(Container) - 容器是由映像檔建立出來,可以做啟動、開始、停止、刪除...等動作,每個容器都是彼此孤立、互不影響。


  • 倉庫(Repository) - 倉庫是個集中存放映像檔的地方,又可以分為公開倉庫(Public)和私有倉庫(Private),目前最大的公開倉庫為Docker Hub,存放了大量的映像檔供使用者下載。而一般企業也可以建立私有倉庫,供自己企業內部使用。

Docker的目標是實作輕量級的作業系統虛擬化解決方案,Docker的基礎是Linux容器(LXC),在LXC的基礎上Docker做了進一步的封裝,讓使用者不需要顧慮容器管理,使得操作更為簡單。讓Docker可以達成底下的目的:
  • 不需要透過Hypervisor,可以直接利用硬體效能。


  • 保留VM的操作概念,像是CPU、記憶體分配...等操作都符合目前的操作習慣。


  • 拋棄VM檔案系統的概念,使用層次化的檔案系統,維持Container的輕便。

因此Docker與虛擬機器的差異由下圖所示,傳統虛擬機器必須建立起Hypervisor,並且在上面建立作業系統,搭建起需要的環境。反觀Docker的實作不需多餘的Hypervisor及作業系統,直接使用本地主機的作業系統,大大減少所需的容量消耗。


《圖二》


Docker如何應用?

Docker是個對程式開發者和系統管理者都很有幫助的工具,因此常常會與DevOps(Developers和Operations)的流程做結合。對於程式開發者來說,他們無須再顧慮系統上運作的應用程式種類及版本,讓他們能夠專注在程式碼的撰寫。對於系統維運的成員們,因為Docker容量小、耗能低的特性,使得系統能更有彈性而且大量減少所需的系統數量。

這邊也總結了幾個Docker的使用情境,企業該如何借助Docker的優勢,在低開銷的情況之下,打造一個一致性的環境。


《圖三》


一、簡化配置(Simplifying Configuration)

這也是Docker Inc.一直提倡的主要使用情境,雖然VM最大的優勢在於可以在硬體設施上運行各種不同的平台(軟體、系統),但Docker則是在降低效能的情況下達成相同的功能。它能夠讓使用者將環境和配置寫進程式碼中並且部署,同一個配置又可以在不同的環境做使用,降低硬體需求和應用環境之間的耦合度。

二、程式碼流程管理(Code Pipeline Management)

前面簡化配置的結果也對程式碼流程有大大的幫助,程式碼從開發者的主機最終在正式環境上部署,中間需要通過許多環境,而每個環境又有自己微小的差別。Docker則給應用提供一個從開發到上線有一致的環境,讓程式碼流程管理簡單不少。

三、提高開發效率(Developer Productivity)

這就是Docker提供額外的好處,在不同的開發環境時,一般開發者會想達到兩個目標,第一是想要開發環境盡量貼近正式環境,再來是想要快速建立開發環境。

事實上,如果要達成第一個目標,需要將每個應用服務都運行在獨立的VM上以便監控各服務的運行狀態,然而這方式需要過多的網路連結,編寫時也要連上不同的VM上處理,並且消耗過多的資源。這也是Docker的優勢,一般開發環境的記憶體規格會比較低,之前使用VM時往往得增加開發環境的規格,而如今Docker能輕易的使幾十個服務在Docker上運行。

四、應用區隔(App Isolation)

就像前一項所說,開發者往往有許多理由必須在同一個機器上運行不同的應用服務。而Docker同時將整體的服務拆分為各別的微服務,在伺服器整合時又降低成本。

五、伺服器整合(Server Consolidation)

就像傳統虛擬機器整合了許多應用程式,Docker將各個獨立的應用程式整合在一起並且不耗成本。由於Docker少了作業系統的記憶體消耗,也能在各個服務之間共享未使用的記憶體,Docker可說是比VM提供了更好的伺服器整合方案。

六、偵錯能力(Debugging Capabilities)

Docker也提供了許多工具,這些工具雖然並不是因為容器才有的,卻還是適合在容器做使用。它們提供了許多功能,包括可以為容器設置檢查點、設置版本及比對兩容器的差異,這些功能都可以幫助開發者偵錯。

七、多租戶模式(Multi-Tenancy)

這也是Docker其中一項有趣應用,由於彼此獨立容器的特性,過去在多租戶的情況下,程式碼的處理往往非常複雜且難以處理,要重新規劃一個應用不但耗費時間,而且浪費金錢。使用Docker可以為每個租戶的應用層建立隔離的環境,不僅簡單且成本較低,Docker環境啟動快速,效能也很高。

八、快速部署(Rapid Deployment)

在VM誕生之前要建立在新的硬體需要花費幾天的時間,虛擬化技術(Virtualization)江浙花費的時間縮減了不少。而Docker的建立過程只需透過容器而無需另外建立作業系統,再次將這過程縮短至秒級。這正是Google和Facebook等科技大廠所看重的特性。

輕量化的未來

不管是軟體產品或是互聯網的應用都朝向輕量化的目標前進,而Docker也正應運而生的迎合這樣的趨勢。Docker也成為目前業界最受歡迎的開源技術,不少國內外的企業開始參與進來。甚至越來越多企業將Docker發展成桌面應用程式,使得這項應用會影響到更多使用者。像是微軟將Docker的技術引進他們的Azure平台,讓微軟的產品在未來能更容易的與Linux應用程式做整合。在MAC和Windows等作業系統上,也可以使用Docker的技術。

透過Docker輕量化的特性,提供客戶包含DevOps、微服務架構、CI&CD、維運管理等在內的解決方案,讓客戶能容易管理大量的外包服務,使其業務更快速的交付。

資料來源

1.Docker
2.Docker—從入門到實踐
3.最完整的Docker聖經 - Docker原理圖解及全環境安裝
4.What is Docker?
5.8 Ways to Use Docker in the Real World