輕量虛擬化改寫IT歷史 Docker容器技術細說從頭

開放原始碼軟體專案Docker是一個輕量級的虛擬化技術,屬於作業系統層虛擬化,可以讓應用程式部署在軟體容器下的工作自動化執行。本文將介紹Docker的發展歷史以及未來的展望。

每個時代都有新技術出現,自從2013年dotCloud這間PaaS公司將內部的專案Docker開源之後,就點燃了容器的光明時代。也正因軟體開源運動的蓬勃,大量技術愛好者紛紛投入協助貢獻其原始碼,加速了Docker這套容器工具的發展。

當然生逢其時,Docker借鏡了Linux CLI(Command-line Interface)的常用指令,和Linus Torvalds所發展的Git指令,讓開源愛好者很迅速就可上手,加上取名與GitHub類似的Docker Hub,提供使用者上傳個人的容器映像檔並可自動化建置,也擴大了Docker的影響力和格局,進而從套件封裝工具中脫穎而出,甚至改變了整個Linux作業系統生態,相同類型的工具包括AppImages(可攜式Linux軟體格式)、Snaps(Canonical公司推出的軟體部署和套件管理工具)和Flatpak(前身為xdg-app的沙箱式執行環境)。


Docker是什麼?容器又是什麼?

Docker剛推出標榜是輕量級的虛擬化技術,屬於作業系統層虛擬化(Operating System–Level Virtualization),建構在Linux內核包含的Linux Container(LXC)技術之上,直到0.9版之後,推出了libcontainer(之後改名為runC,https://runc.io/),便抽離了底層容器技術的相依性,因此2016年微軟推出Windows Container便直接相容Docker操作指令和API。

當然,容器技術並不是Docker公司憑空想像,如圖1所示,從1979年的Unix V7、2005年的OpenVZ,以及2008年LXC,甚至是2013年Google推出的容器技術Let Me Contain That For You(LMCTFY,https://github.com/google/lmctfy),皆不斷改進技術並貼近使用者,正因前面提到,Docker憑借友善直觀的指令和使用者提供豐富大量的Docker映像檔確立了本身在容器技術的主流市場。


▲圖1 容器的歷史。(資料來源:www.plesk.com)

筆者身為Java程式語言的開發人員,原本也對JVM的跨平台執行環境深信不疑,但隨著經驗和系統數量的增加,資訊軟體大廠在Java Development Kit(JDK)上的分歧,讓「Write Ones, Run Everywhere」淪為口號,此時Docker官方所標榜的「Build, Ship and Run Any App, Anywhere」特性,也是讓多數開發者全力擁抱的關鍵原因。因應用程式與執行環境和相依的函式庫,一同封裝到單一Docker映像檔,所以只要docker run一行指令,就可執行Linux任何應用程式,包含現在最火熱且很難安裝的深度學習框架TensorFlow(Google DeepMind開發,人工智慧圍棋程式AlphaGo就是用此框架發展出來的)。

再者,由於隔離性和可攜性,開發者在筆記型電腦寫好的應用程式,透過Docker封裝,便可無縫移植到任何Linux平台,當然就避免掉測試、營運環境要逐一部署檢查的煩人無謂工作,這也是官方所稱的Martix Hell(比喻多一項系統環境,就多一整排相依軟體需要測試,如果有五種環境和五套軟體,就有5×5的陣列組合,故稱矩陣地獄),進而成為DevOps軟體開發流程的核心工具,圖2上方便顯示整合軟體開發人員(Dev)和維運技術人員(Ops)的理念(https://www.docker.com/use-cases/devops)。


▲圖2 Docker標語和願景(資料來源:www.docker.com)

Docker容器跟VM虛擬機有何不同?

正因為初期定位為輕量級虛擬化,所以很多人誤解容器技術的使用方式,其實跟虛擬化技術所要解決的問題是南轅北轍。

傳統虛擬化技術是從模擬虛擬硬體下手,主要目標是建立一個完全獨立的沙箱式作業系統執行環境,單位是一整台虛擬機(Virtual Machine),所產生出的執行單位稱作實例(instance)。

而容器技術則純粹只是將應用系統相關的程式碼、函式庫、執行環境配置打包成隔離的可執行沙箱環境,並沒有做任何硬體虛擬化,正因為少了虛擬化的客體作業系統(Guest OS)這一層,所以執行應用系統效率會比虛擬化要好。但容器化技術並不會幫作業系統或硬體加速,單純只是資源利用率比較高。


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!