Docker真正的價值不是技術,而是讓人們建立共識。未來目標是實現全由虛擬機器串連的虛擬網際網路。──Docker創辦人暨技術長Solomon Hykes

圖片來源: 

iThome

當Linux之父Linus Torvalds在2013年2月18日張貼了Linux核心3.8版正式發布的訊息時,只是簡單地提到為了等待一些小更新釋出,而延後到華盛頓生日這天才釋出,讓3.8版變成了一個總統版釋出。但他在公告上刻意沒提到的是,在這個版本對Control Group和Namespaces機制的強化,促成了開源社群努力多年的Linux Container技術(LXC)得以實現。

這個LXC技術不只顛覆了開發者打造應用程式的思維,推翻了MIS舊有系統維運模式,新興的搶手職務DevOps因此得重新定義角色,雲端IaaS和PaaS市場版圖更瀰漫一股沒跟上就淘汰的洗牌壓力,更撼動了VMware和微軟聯手把持的虛擬化帝國,微軟還承諾要讓Windows也能和Linux支援同一套Container標準。Container掀起了傳統IT架構下個十年的變革之路。

Google每周啟用20億個Container

許多網路服務業者或雲端平臺紛紛支援Container,如Amazon、微軟Azure、IBM Softlayer、Rackspace、紅帽OpenShift、百度、Google、Heroku、OpenStack等。甚至有不少網路業者大量使用Container來執行自家服務,Google基礎架構部門副總裁Eric Brewer在6月初的Dockercon14會議上透露,Google一周就要啟用20億個Container。許多眾所皆知的Google服務都是在Container內執行。

不過,變革的源頭並不只是因為Container技術本身,更關鍵的是一家去年3月才創立的美國軟體公司Docker一手打造的Container標準化平臺。

Docker創辦人暨技術長Solomon Hykes在今年6月首屆Dockercon技術大會上,引述了物件導向語言之父Alan Kay對網際網路的期待,有一天應該發展成一個全由虛擬機器組成的虛擬網際網路(A virtual internet of virtual machines)。Solomon Hykes發願要用Docker平臺實現這個藍圖,「現在正是讓網際網路升級的時候到了。」他說。

Container是以應用程式為中心的虛擬化

Solomon Hykes憑什麼這麼說?這要從Container技術談起。不同於常見的傳統虛擬化技術如vSphere或Hyper-V是以作業系統為中心,Container(或可稱為軟體貨櫃)技術則是一種以應用程式為中心的虛擬化技術。兩者都是為了要更方便地將一套應用程式所需的執行環境打包起來,來能簡化複雜的IT架構方便管理、移動或部署各種應用程式,而不需要讓開發人員自行管理執行這個應用程式所需的繁多目錄和大量檔案。

傳統虛擬化技術從作業系統層下手,目標是建立一個可以用來執行整套作業系統的沙箱獨立執行環境,習慣以虛擬機器(Virtual Machine)來稱呼。虛擬機器用軟體模擬出vCPU、vRAM等實體伺服器的功能,讓作業系統看起來是身處於實體機器中,所以,可以在這個虛擬機器中安裝各種作業系統,接著安裝應用程式所需的執行環境,如網站伺服器、資料庫程式、中介軟體等。傳統的虛擬化技術能將軟體和硬體的相依關係切開,讓軟體盡可能地不用綁定於特定廠牌或規格的硬體。

傳統虛擬機器的優點是安全性高,對作業系統而言,看起來就像是在一臺正常的實體機器中,就算多個虛擬機器在同一臺實體伺服器中執行,虛擬機器間也不會知道彼此的存在。這也就出現了Host OS和Guest OS的架構,負責執行虛擬化平臺的是Host OS,而在虛擬化平臺內建立的虛擬機器內則是執行Guest OS。

但是將作業系統打包進虛擬機器中的後果是,任何虛擬機器都得先裝妥一套作業系統後才能開始執行應用程式,不僅導致虛擬機器的建立速度,受限於作業系統的開機速度,得等上數十秒到數分鐘才能新增一個虛擬機器。虛擬機器的映象檔所需容量也不小,即使要執行的程式碼只有10KB,也得安裝一整套上百MB的作業系統軟體才行。執行作業系統本身也得消耗不少的運算資源,倘若一臺實體伺服器內要執行100個虛擬機器,就等同於要執行一百套Guest OS,即使虛擬化技術有許多改良來解決運算資源的利用率,但Guest OS仍瓜分了不少應用程式能用的實際運算資源。

在OS層內建立虛擬環境

電腦科學家們早在現代虛擬化技術成熟前,十幾年前就開始嘗試發展另一種虛擬化技術Container,不是在OS外來建立虛擬環境,而是在OS內的核心系統層來打造虛擬機器,透過共用Host OS的作法,取代多個Guest OS的功用。Container也因此被稱為OS層虛擬化技術。

例如1982年出現的Unix系統內建chroot機制、1998年的FreeBSD jails、2005年出現的Solaris Zones和OpenVZ,或像是Windows系統2004年就有的Sandboxie機制都屬於在作業系統內建立孤立虛擬執行環境的作法,都可稱為是Container的技術。

Container直接將一個應用程式所需的相關程式碼、函式庫、環境配置檔都打包起來,並建立了嚴格的資源控管機制來分配Host OS上的系統資源,避免因這個Container占用資源或當機時,而影響了Host OS或其他Container的執行。

因為Container是利用系統核心控管機制來分配Host OS資源,也就不需要另外安裝Guest OS個別管理。也就是說,當一臺實體伺服器內建立了100個Container時,這100個Container共用同一個Host OS的核心,再利用OS內建機制來分配每一個Container可用的資源。因為Container不需要執行OS,因此,一臺實體伺服器可以執行的Container數量,遠遠高於傳統虛擬化技術的虛擬機器,甚至可以有數倍的差異。一臺有能力執行100個測試環境VM的實體伺服器,往往能執行2、3百個用Container提供的測試環境。這批Container的映象檔案所需儲存空間,也因不用安裝整套OS而比用VM映象檔來得少。不論處理器資源或儲存空間的利用上,Container技術都遠優於伺服器虛擬化技術。

開頭提到在總統版Linux在核心內建的Control Group和Namespaces機制,正是用來分配Host OS運算資源的機制。

Namespaces是系統資源的使用名單,記錄了系統資源要分成多少份,每一份的名字是什麼,方便呼叫和取用特定一份的資源。就像辦公室的座位表一樣,不只是員工姓名清單,也記錄了每一個姓名所在的位置,甚至聯絡這個員工的分機。一個Container會擁有自己唯一的Namespaces名稱,來區分身份,而透過Namespace清單,這個Container不用知道其他Container的存在也能分配資源,就像是高一新生入學後,同班學生都還不認識時,老師可以透過點名簿知道每一個人的姓名和入學考試成績一樣。Host OS可以透過Namespaces來分辨每一個Container,而Container間也可以不知道對方的存在。

有了名單機制後,就可以利用Control Group來管理每一個名字可用資源的權限。Control Group可以管制記憶體、檔案快取、CPU使用、磁碟I/O等,也可追蹤這些資源被使用的情況,安排不同資源存取的優先順序,甚至是凍結程式的執行。LXC技術就是利用Control Group來管理一個Container使用各種資源的權限。結合了Namespaces和Control Group,就可以很容易地在Linux內建立一個虛擬的應用程式執行環境,讓應用程式看起來是在一個孤立環境中執行。

不過,早在Linux核心完善Namespaces和Control Group機制之前,已有不少PaaS服務業者看到了在OS層內建置虛擬機器的好處,也紛紛發展自家Container技術,例如Heroku、Parallels、Pantheon,連Red Hat的OpenShift也有類似技術。Docker公司的前身dotCloud正是其中一家PaaS業者。

而Google更是早從2006年就開始發展自己的Container技術,也開發了用來控管Linux資源的程式,稱為Process Containers,這個技術隔年更名為Control Group,變成了Linux核心的功能之一,這就是Control Group的第一版。Google可說是Linux Container的技術源頭之一。後來Google將自家Container技術命名為lmctfy(Let Me Contain That For You),但至今仍是測試版階段。

儘管許多人參與了Control Group機制的開發,但在總統版Linux核心3.8版釋出之前,Control Group還無法控管到核心記憶體資源,因此所建立的Container還不穩定,或是需要自行開發許多搭配的資源監測和管控機制才能有效建立沙箱環境。

Linux核心支援促成Container標準化

直到去年2月,Control Group增加了核心記憶體管理能力,不需要開發額外機制,只要利用Linux核心指令,就能實現Container環境,也讓LXC真正有機會普及每一個Linux環境。所有的Linux從此開始有了一套共同的LXC技術。Container技術的發展,也往標準化的路上邁進了一大步。不過,因為各家Container技術實作仍有不同,所以還是缺乏一套所有人都支援的標準作法。

出乎意料地,3.8版釋出才一個月,dotCloud公司就在2013年3月公開了一個從2010年開始進行的內部專案Docker,並以開源釋出程式碼。這是docCould開發自家PaaS服務時,為了利用Linux Container技術管理PaaS上的應用程式所開發的平臺。

Docker執行長Ben Golub表示,在2000年以前,應用程式有三大特性,包括了應用程式預期會長期存活、且以整套應用建置在單一環境中運作的方式設計,也只部署在一臺伺服器上。

但是到了2014年,「傳統應用程式的本質已經徹底改變了。」Ben Golub說,今日的應用程式總是持續且反覆地開發新版本,也大多由一堆鬆散耦合的元件組成,而且會部署在多臺伺服器上。

他說,要把不同開發階段或多重用途的程式,部署到不同的硬體或雲端環境中,是一個很大的挑戰,Docker正是dotCloud利用Container技術來客服這個挑戰的平臺。

目標是打造Container生態系

Ben Golub說:「Docker不只是一項Container技術,而是要打造一個Container生態系,讓應用程式可以在任何地方執行。」Docker要用Container技術讓應用程式具有相同的封裝方式、啟動方式、存取方式,不用修改就能在任何支援Docker的平臺上執行。因此,「Docker是一個可以來建置、移動和執行分散式應用程式的開放平臺」他說。

就像是因為出現了標準化的貨櫃,擁有統一的尺寸規範、一致的固定孔洞位置、封裝方式,讓貨櫃可以成為任何貨物透過各種方式、不論是汽車、火車、輪船、飛機都能載送的共通容器。

Docker專案一發表,立刻獲得廣大迴響,Linux作業系統業者紛紛支援,包括了Redhat、ubuntu、Debian、Fedora、CentOS、CoreOS,幾乎涵括了所有主流Linux版本,連雲端作業系統OpenStack都支援。許多大型雲端服務業者也相繼採用,如Amazon、微軟Azure、IBM Softlayer、Rackspace、紅帽OpenShift、百度、Google、Heroku等。dotCloud公司乾脆以Docker為名,另外成立新公司力推。

2014年6月,Docker公司發表了Docker 1.0正式版,也舉辦首次技術大會。到場分享Google自家Container發展經驗的Eric Brewer都表示,即使Google使用Container多年,也真想實現Docker這樣的運用,讓Container非常容易使用,而Docker的確做到了。也因此,Google決定大力支持Docker,發起了一個打造Docker Container管理工具的開源計畫Kubernetes,要將Docker技術延伸到伺服器叢集上使用。

就連傳統虛擬化技術的兩大龍頭VMware和微軟,今年都相繼宣布擁抱Docker,VMware在8月的VMworld上宣布擁抱Docker,將在vSphere內支援Docker,讓虛擬機器內更容易執行Docker,例如用虛擬機器來強化Container的安全性。相關VMware虛擬化管理平臺也能和Docker的API溝通,要將Docke延伸到VMware虛擬化技術生態系中。

而微軟執行長Satya Nadella也剛在10月中宣布,未來要在Windows Server中內建Docker,讓Docker不只能調度Linux上的Container,也能管理和建立在Windows內的Container。

為何連Container技術源頭之一的Google,都稱讚Docker實現了Google一直想做卻還沒做到的事?

Docker映象檔是實現Container標準化的關鍵。Docker將Container打包成一個映象檔檔案,這個檔案裡包括了所有建立Container時需要的程式和設定資訊。只要在其他支援Docker的環境中啟用這個映象檔,就能建立一個一模一樣的Container環境。曾為矽谷鐵道系統公司開發出CI(持續整合)平臺的悠邁科技解決方案架構師蘇旭昱表示,Docker打包的Container映象檔因此變成可以通行無阻的應用程式標準容器。

Docker提供了一個類似Github版本控管服務的Docker映象檔Repository服務,稱為Docker Hub(也稱為Registry服務),可以讓開發人員發布映象檔和這個映象檔的Dockerfile。其他人就可以再利用這些映象檔,或參考Dockerfile中的環境部署指令設計自己的映像檔。

Docker是一個Client-Server架構的應用程式,安裝Docker之後,會提供了一個命令列的用戶端程式來和在背景執行的Docker伺服器溝通,Docker也完整支援RESTful API,可讓開發人員透過API執行所有Docker指令。甚至Docker還提供了一個腳本語法描述的Dockerfile設定檔,可以用來紀錄和描述建立Docker映象檔的每一個指令。不用複製Docker映象檔,只憑Dockerfile也可以自動建立一個和原來一模一樣的Container的映象檔。甚至可以從Registry服務下載一個映象檔,再依此來建立下一個映象檔,例如從ubuntu的映象檔中,加入MySQL程式,來建立一個內有ubuntu和MySQL的映象檔,用來啟用Container。

Ben Golub透露,未來Registries服務將推出可在企業內部部署的套裝版,不只可以用來儲存私有Docker印象檔,也能建立私有的Docker工作流程,讓企業自建內部的Docker映象檔管理平臺。

Docker最大的特性是快,建立Container的速度不到1分鐘,甚至只要數秒鐘。遠比動輒要數分鐘或是數十分鐘才能啟動的虛擬機器來得更快。幾個月前開始導入Docker的時間軸科技研發中心主任工程師戚務漢實際展示了他們已導入Docker的新網站系統,除了在從網路下載基礎印象檔資料花了不少時間外,光是啟動一個內含Ubuntu系統、MySQL、Ruby等網頁所需執行環境的Container,不到一分鐘。

實現基礎架構程式化

曾擔任過一年Devops職務,現在負責系統維運的時間軸科技研發中心主任工程師陳俊廷表示,更大的優點是Docker實現了Infrastructure as code的精神(基礎架構程式化)。因為Dockerfile記錄了建置應用程式所需執行環境的指令和參數,解決了過去開發人員難以和維運部門溝通的困難,彼此有一套可以追蹤記錄的機制,甚至Dockerfile還可以結合版本控管功能,可以隨時回到前一版本。

不只可以改善開發團隊和維運人員的協同工作,臺北榮總醫院資訊工程師鄭淳伊指出,Docker更大的影響是讓IaaS平臺只要支援Docker,就能夠執行封裝在Container中的任何應用程式,IaaS很容易就能具備了PaaS服務的能力。鄭淳伊曾在宏碁eDC機房擔任維運人員,也在玉山銀行參與系統開發超過5年,他大膽預測,甚至,Docker可能會讓PaaS服務消失,這也是為何IaaS業者或PaaS業者莫不積極擁抱Docker的緣故,沒有跟上的人會被淘汰。

根據Docker官方統計,到今年8月為止,參與Docker開源專案開發者超過6百人,已有超過2萬個開源計畫使用Docker,眾多開發者在Docker Hub網站上也發布了超過3萬個Docker映象檔。

不過,因為Docker目前仍只能在單一主機上執行,需要搭配第三方工具,如Google的Kubernetes工具,才能將Container快速轉移到其他伺服器中,或是在伺服器叢集內移動。

下一步,Ben Golub表示,將聚焦在叢集式多引擎架構和雲端Orchestration協同機制,也希望強化內容區塊建置能力、網路和儲存管理機制、映象檔和使用者安全,並擴大和第三方技術或工具的整合。推出不到2年的Docker,距離實現虛擬網際網路藍圖的大夢,仍有很長一段路。

 

Docker發布後,Linux作業系統業者紛紛支援,幾乎涵括了所有主流Linux版本,連雲端作業系統OpenStack都支援。許多大型雲端服務業者也相繼採用,如Amazon、微軟Azure、IBM Softlayer、Rackspace、紅帽OpenShift、百度、Google、Heroku等。

 

時間軸科技研發中心主任工程師陳俊廷表示,Docker實現了Infrastructure as code的精神(基礎架構程式化),用Container來記錄各式各樣的環境配置,解決了過去開發人員難以和維運部門溝通的困難。

 

相關報導請參考


Advertisement

更多 iThome相關內容