2022.08: 更新內容至 Blog
從建立起 CI/CD 環境後,幫吉米的工作分擔了許多麻煩事。讓吉米有更多的時間去爭取新的專案的情況下。
吉米成立了自己的小公司,並邀請 Eric 作為技術上的顧問。
就這樣過了一兩年,這天,吉米與 Eric 吃飯時,討論起到到客戶那邊更新服務時,種種的情況與問題。
吉米
: 現在的案子,每次更版,至少都要更新兩三支以上的程式,每次都要重新設定真的有點花費太多的時間在這上面。
Eric
: 嗯嗯,最近的案子,程式都是安裝在客戶建立的 虛擬機 (Virtual Machine, VM) 中,每次都要重複進行相同的設定。在這情況下,我覺得可以 容量(Container) 技術導入我們的產品之中。
吉米
: 容量技術?是指近年來很紅的 Docker 或 K8S 嗎?這適合我們使用嗎?
Eric
: 嗯,我分析給你聽。
(圖片來源: What’s the Diff: VMs vs Containers)
在討論容器化技術之前,要先了解到底 容器(Container) 與 虛擬機器(Virtual Machine, VM) 兩者之間的差異到底在那。
雖然 Container 與 Virtual Machine 都是基於作業系統 (Operating System, OS) 的高階虛擬化的技術,但是兩者的架構與完全不一樣。而原本的作業系統,又稱為主要作業系統 (Host OS)。
Virtual Machine 是從 作業系統 下手,它的目標就是 建立一個可以執行完整作業系統的獨立環境。說到這,就不得不提到 Hypervisor 。
Hypervisor 又被稱為虛擬機器監視器 (Virtual Machine Monitor, VMM),它是 Guest OS 與實體機器(physical hardware)的中間層。
一方面,以軟體的方式,模擬硬體環境替代實體機器,提供適當的 CPU、記憶體、硬碟容量……等虛擬硬體資源給 OS 使用。
另一方面,負責協調不同虛擬硬體之間對實體機器的操作,以達到多個 OS 與應用程式共用同一套實體機器的資源。
例如 VMware vSphere 或 Microsoft Hyper-V 就是 Hypervisor。
可以想成,Hypervisor 就是硬體提供商,它單純只提供硬體。因此,需要安裝作業系統,才能執行應用程式。而安裝在 Hypervisor 上的 OS,又稱為 Guest OS。
Container 則是直接針對 應用程式層 下手,一方面將 應用程式本身與相關的函式庫、環境配置檔,打包成映像檔 (Image) ,以達到應用程式的獨立與模組化。
另一方面,藉由 OS 層的抽象化,經由 Containers Daemon 的支援,讓每一個 Container 都是獨立環境的前提下,共用 Host OS。這種架構,讓 Container 可運行在實體機、虛擬器,或是雲端基礎設施 (cloud infrastructure)。
因為 Container 共用 Host OS,所以不像 VM,需要等待 Guest OS 的啟動時間。自然而然,Container 的啟動時間,遠快於 VM。
(圖片來源: Operating System Containers vs. Application Containers)
我們可以將每一個應用程式都打包為單獨的 Image ,也可以將多個應用程式打包成一個 Image。
從上面可以看到,基於 Base Image 與不同需求,堆疊組合成不同版本的 Image,而這些 image 本身都是唯讀 (Read-only)。
當 Container 運行時,才會產生可供寫入的資源,提供 Container 使用。
Container 技術最早是被發佈與運用在 Linux 之中,經過 Docker 的推廣,才讓 Container 真正的大紅。
但是也因為如此,Docker 早期僅支援 Linux 環境。若要在 windows 之中使用,只能透過 Virtaul Machine 安裝 Linux Kernel 才能使用。
造成 container 在 windows 的環境下,表示出來的效能不佳。讓許多基於 windows 的軟體開發商避而不用。
Microsoft 先是推出 Windows Subsystem for Linux (WSL) ,提供 Linux 的程式於 windows 上使用,但依然有所局限。
之後,在 2017 年,Linux Container on Windows (LCOW) 與 Windows Container on Linux (WCOL) 的推出,更是消弭了 windows 與 Linux 之間的那道牆。
吉米
: 聽起來,Container 的導入,確實有一定的幫助。但要怎麼做呢?
Eric
: 建議可以從 Docker 先入手。
吉米
: 為什麼會建議使用 Docker 呢?
Eric
: 一來它的資源多,二來,我們的系統還沒大到需要 K8s。
<< 待續 >>