# Containerization 的最高戰略 ![image](https://hackmd.io/_uploads/BJq2ncT3ke.png) Containerization 的最高戰略目標,是要能讓企業的任何應用程式 (app) 輕鬆地在任意一台電腦上執行,並且不會影響或污染該台電腦的既有環境。 ### 那麼,要如何實現這個目標呢? ![image](https://hackmd.io/_uploads/HkVgp5Th1l.png) 答案是透過 Application Container 的技術。Application Container 可以被看作是一種電腦,許多人可能對它感到陌生,這是因為真正理解其運作原理的人並不多。既然稱之為一台「電腦」,它就必須具備一般電腦所需的主機名稱、網路環境、檔案系統以及硬體資源管理等能力。 - 主機名稱所使用的技術是 Linux Namespace。 - 檔案系統所使用的技術則是 chroot 結合 overlay2。 - 網路環境所使用的技術則是 Virtual Bridge。 - 硬體資源限制與管理所使用的技術則是 CGroup。 Application Container 與傳統電腦最大的差異,在於它會共用 Host 主機作業系統的 Kernel,以共享電腦內 CPU、記憶體與網路等硬體資源,因此能有效地執行應用程式並實現隔離。 ## 什麼是 OCI 標準? * OCI 標準運作架構圖 ![image](https://hackmd.io/_uploads/SJVGTqThkg.png) OCI (Open Container Initiative) 組織針對 Application Container 制定了三個重要標準,主要目標即是實現「任何應用程式都能在任何地方執行」(Running any app anywhere)。 要做出 Application Container 的技術很難,但它帶來的好處很多,因此 OCI 組織便透過制定這三個標準,讓更多使用者能更快速、更簡單地實現與使用 Application Container。 - **OCI-image** 定義了一種標準化的格式,用來儲存應用程式及其相關的依賴檔案。這種標準格式主要由一個設定檔 (config) 和多個目錄區組成。設定檔 (config) 中包含了 Container 執行時所需的設定,例如預設執行的命令、環境變數等等;目錄區則包含應用程式與所需的所有相依檔案。 - **OCI-distribution** 制定了應用程式可在任意環境間自由移動的標準流程。具體作法是將應用程式及其相依檔案依照 OCI-image 標準打包成 image,再依據 OCI-distribution 標準規定的流程,將這個 image 上傳到 image registry。其他使用者便能透過相同的標準流程,將該 image 從 image registry 下載到本地電腦中使用。 - **OCI-runtime** 負責實際利用 Linux Namespace、Virtual Bridge、overlay2、chroot、CGroup 等技術來做出 Application Container。因此,根據 OCI-runtime 標準,目前已有許多程式,如 runc、crun、runsc 等,透過這些程式使用者便能輕鬆地建立與執行 Application Container。