接下來,我們會大量使用 Docker ,相信讀者都對這種基於 lxc 的容器 (container) 技術都有相當的熟悉度,所以我們不會說太多,今天來聊聊使用 Docker 的原因、Docker 的生態系,以及為什麼 Docker 適合雲原生的開發。要了解 Docker 的歷史,首先要來看一張圖
圖片來源[註1]
對我來說,使用 Docker 最大的好處,是這種技術讓 Immutable Infrastructure [註2]的概念容易被實現。直觀的來說,當生產環境的代碼被部署的時候,我們不希望再把手伸進去做任何改動,如果必須要改動,必須帶有版本管理。也就是說當我必須部署新的生產代碼時,我可以基於對某個二進位映象檔(image)進行抽換,而不是對於代碼 incremental 的改動,同理,如果要回復到之前的版本,也是基於 image 的抽換。由於容器的啟閉速度遠比虛擬機器來得快,也讓不可變基礎設施的理想變得實際。這樣的世界看起來很美好,代碼有版本管理,映象檔有版本管理,部署應用看起來堅不可破,然而,魔鬼藏在細節裡,除了要考慮雲原本的平台供應商(Cloud Provider)的基礎建設強度,與可遷移性之外,不同部署環境的配置檔管理(Configuration Management),往往容易成為部署失敗的 Root Cause,相信有在生產環境工作過的開發或運維人員,一定能深切理解那種痛苦,這個我們後面再說。
容器本身並不是什麼全新的技術,一直到 dotCloud 把它發揚光大,一下子熱門起來。就我所知,還是有不少團隊仍然用 VM 在部署單體應用 (Monolithic application) ,必須注意的是,並不是微服務 (Micro Services) 就一定會使用 Docker 來包裝各個組件,就微服務而言,有其它框架可以選擇,像是 Java 系,Dubbo、Spring Cloud、Netflix OSS...etc ,關於架構的演進如果展開下去,會是很大的篇幅,我們放在補充資料讓讀者自行深究。
圖片來源[註3]
總結一下,雲原生時代的架構下,我們可以基於容器與雲原生基礎建設(Kubernetes 已經成為雲原生基礎建設事實上的標準),快速地搭建混合異質語言寫出來的微服務。進一步地說,在各項基礎建設的協助下,各種應用的 Scale-Out、Self-Healing ,都變得相當容易。