開放原始碼軟體專案Docker是一個輕量級的虛擬化技術,屬於作業系統層虛擬化,可以讓應用程式部署在軟體容器下的工作自動化執行。本文將介紹Docker的發展歷史以及未來的展望。
由於目前虛擬化技術在隔離性和安全性方面仍然比容器化技術優秀,在加上Docker並沒有提供類似虛擬化快照和VMware動態轉移虛擬機(VMotion)的技術,因此目前主流使用方式是在虛擬機的客體作業系統中再安裝Docker,執行容器化的應用程式,因此容器化與虛擬化彼此並非相互取代,而是互補。容器主要是解決應用層方面的部署和資源隔離,而虛擬機是解決基礎架構方面的部署和資料配置,請見圖3之比較差異。
|
▲圖3 Docker與虛擬機差異。 |
就類比虛擬化技術而言,容器映像檔如同虛擬機映像檔,容器是透過靜態映像檔所產生的執行時期實例,一般稱Docker是指Docker Engine,包含伺服器端(Docker Daemon)和用戶端(Docker Client),Docker Host是指包含Docker Engine的伺服器,伺服器端和用戶端可分離,用戶端亦可控制遠端的Docker Daemon。
前面提到微軟的Windows Container支援Docker,亦可用Linux平台的Docker用戶端去控制Windows版的Docker伺服器,如圖4所示。整個Docker相關工具還包含Docker Compose、Docker Machine、Docker Swarm Mode和Docker Registry等等,將在後續文章逐一介紹。
|
▲圖4 Docker用戶端與Windows版伺服器端。 |
Docker的使用方式
必須先具備Linux作業系統,安裝步驟說明如下。執行「curl -sSL https://get.docker.com/ | sh」,即可迅速完成Docker Engine安裝,並將目前使用者加到docker群組,省去每次輸入docker指令皆必須打上sudo,例如「sudo usermod -aG docker $your_user」。安裝好Docker Engine之後,直接執行「docker run hello-world」,就可看到Docker歡迎畫面和說明。
接著,說明Docker使用步驟。
先決定欲使用的Docker映像檔,可自行建立「docker build」或直接使用Docker Hub(Regisrty,這是Docker官方提供用來儲存Docker映像檔的伺服器軟體,亦可自行架設在公司內部,不對外公開)上預先建立的映像檔。
然後執行「docker pull」取得,亦可直接執行「docker run」,直接拉取並執行。
取得映像檔後,便存放於本機端,可用「docker images」查看靜態的映像檔清單,若使用「docker ps」則是查看執行中的容器實例。
上述步驟,可對照圖5的Docker使用步驟介紹。
正因為如此方便易用的特性,連「Nature」(自然)科學期刊網站都撰文介紹容器技術,主題為「Software simplified」。而且此文提到科學研究的一項趨勢,就是計算環境的重製性,透過Compute Capsules(運算膠囊)將研究計算所需的資料、研究方法、運算平台整合成一個網頁(類似Jupyter網頁式開發執行軟體,目前大量使用在數據分析和科學計算領域),如同雲端服務,只要開啟網頁,就可讓研究成果再利用,甚至共享再刺激出新的創作靈感。
|
▲圖5 Docker使用步驟。(資料來源:www.docker.com) |
Docker使用原則及未來發展
正如《箱子:貨櫃造就的全球貿易與現代經濟生活》一書所描述的貨櫃革命,麥克連(McLean)看到貨櫃對全球運輸和全球經濟的未來影響,認為鐵路、卡車與海運業應該是一體的,並與美國軍方合作,採用貨櫃作為越戰後勤運輸補給,進而制定出「一貨櫃(One Container)、一客戶(One Customer)、一商品(One Commodity)」的交付原則。一個容器映像檔內可以安裝多種服務,如同時安裝Apache、MySQL、PHP等,對比到實際貨櫃的裝載原則,因此Docker官方建議,一個容器(軟體貨櫃)內只提供一項服務,就像是樂高積木一樣,每個容器都是單一個積木,再將這些容器堆疊成一套完整的軟體架構。
Microservices(微服務)的軟體架構,相當適合使用容器,將單一服務依照業務邏輯組成特定的技術堆疊(Stack),藉由多個微型服務,例如RoR開發的Web前端、Java撰寫的後端服務、Node.js WebSocket即時服務等,每一項服務都封裝在容器之中,並且可依照負載量調整容器的數量,成為自動化水平擴展或縮減之鬆散耦合並具彈性的應用系統架構,也可抽換當中一項容器服務,輕易地達成零停機替換,例如要升級RoR開發的前端版本,先啟動新版的RoR容器,將Web流量導向新版,等待全部使用者皆切換到新版之後,再把舊版容器移除,不用為了更新特定元件而中斷服務。
甚至雲端平台提供的最新Serverless(無伺服器)架構,或稱Function as a Service(FaaS)平台或框架,如AWS Lambda、Azure Functuon和Google Cloud Functions等,底層也是採用容器技術才得以實現,因此容器的延伸技術仍舊還在發展。
再加上Docker官方在2017年的DockerCon大會上發表LinuxKit和全新開源的Moby(Docker改名成Moby開源專案,此後Docker是專屬Docker Inc.的產品名稱),請參閱圖6,在併購Unikernel Systems一年之後,將原本Unikernel結合容器技術實作出LinuxKit專案(https://github.com/linuxkit/linuxkit),透過LinuxKit打造自己專屬的Linux內核(Kernel),只包含執行該平台的必要元件,元件皆由容器所組成,可迅速移除替換,並適用於各種不同的環境,包含雲端平台、虛擬化系統、實體伺服器、IoT硬體等,且不只適用在Intel處理器,之後也會支援ARM處理器。因內核只包含必要元件,整個系統弱面會少掉很多提高安全性,相信這LinuxKit設計理念必定會顛覆目前現有Linux的所有思維。
|
▲圖6 Docker與Moby的關係圖。(資料來源:GitHub Moby專案) |
<本文作者:Philipz(鄭淳尹),Docker/Moby.Taipei社群共同發起人,曾任宏碁eDC維運工程師,玉山銀行資訊處專員,現為臺北榮民總醫院資訊工程師,系統維護及開發設計超過15年。開源技術愛好者,陸續在COSCUP開源人年會、Container Summit研討會台灣微軟開發者大會、群益期貨和永豐金證券等分享資訊技術,並在多間大學資工系擔任Docker容器技術講師。現任微軟MVP,並翻譯審閱多本容器技術書籍。>