[軟體概念入門系列] Image與Container

Brett Yu
Brett’s dev log
Published in
Nov 4, 2023

本節說明容器化相關技術及名詞

虛擬機器 Virtual Machine

在Host OS上虛擬化創造出Guest OS, 再將要執行的應用程式放到Guest OS中

不同的Guest OS除了硬體問題外不會互相影響, 但多個應用程式仍會共享Guest OS的資源, 若有調整環境變數或系統設定等都可能會互相影響, 另Guest OS若有多餘的資源也較難以讓不同Guest OS上的應用程式使用

容器 Container

在Host OS上透過Container Manager直接將一個應用程式所需的執行檔及需要的Runtime打包, 並直接共用Host OS上的系統資源

Container間是完全獨立的, 在一個Container內只有一個應用程式的情況下, 應用程式間也不會互相影響, 雖然是共用Host OS上的系統資源, 但可以透過設定資源限制的情況下避免單一個Container占用大量資源的情況

Docker並不是唯一使用container的技術, 仍有其他相較市占率較小的技術可以實作容器化的架構

Docker Image與Container

Image是一個應用程式及其執行環境的模板, 而Container則是根據Image產生出來的實體, 同樣的Image可以產生多個Container, 而多個Container是互相獨立的, 也可以擁有相異的參數值 (如資料庫的連線字串, 外部API的網址)

以實際生活中的例子來看, Image像是建築藍圖, 同樣的藍圖可以在社區中建造出許多不同棟的房子, 這些房子因為是照著同樣的藍圖來建造, 因此會有同樣的結構設計及管線配置, 但這些房子仍然可以有不同的門牌號碼, 登記為不同的屋主等差異, 取決於Image設計者留下多少的彈性

Docker Image可以疊加並生成一個新的Image, 如下圖在Debian為基礎上再安裝emacs及apache, 每個動作都可生成一個Image, 再由最後疊加後的Image建立Container

修改Container後使用Docker commit指令也可生成一個新的Image, 只是此操作通常無法自動化, 故不是一個正常建立Image的流程

Docker build

一般都是使用Docker File, 可以定義一系列的步驟以建立出最終的Image, 並加上指定的版本號

如以下是一個簡單的python image範例

FROM python:3.9

WORKDIR /app

COPY modules.txt ./
RUN pip install --no-cache-dir -r modules.txt

COPY src /app

CMD [ "python", "server.py" ]
docker build -t testing-python-image:1.0.3 .

Docker Registry

已產生的Image可以存放在Docker Registry中, 各大廠商也會將自己旗下的產品放到官方Registry中, 以讓其他開發人員進一步利用

目前公司存放私有Docker Image的平台為Harbor, 若為AWS則為Amazon Elastic Container Registry (ECR)

Kubernetes

Kubernetes因為K跟S中間有8個字母, 故又被簡稱為K8S

K8S是一套可以自動化操作及管理容器的工具, 在使用Docker的情況下, 我們較難自動化的完成監控資源並自動Scale Out並完成Service discovery的一系列營運操作, 而K8S可以預先定義相關的條件, 在滿足的情況下K8S可以自動生成新的Container來分散負載, 或是自動化的生成新的Container來取代已無回應的異常Container

K8S實際中控制的最小單位為Pod, 而Pod之中才是Container, 一個Pod可以對應到一至多個Container, 而這些Container一樣是用Image來部署的

K3S

輕量化的K8S, 將特定版本的 K8S 進行封裝打包並刪除部分功能, 由於刪除後只有K8S的一半大小, 故從10個字元的K8S得名為5個字元的K3S

延伸閱讀:

其他Docker的代替品

Kubernetes 基礎教學系列文

--

--