iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
Software Development

微服務導入:從觀念到落地的架構實戰地圖系列 第 23

微服務導入 – Day 23 釐清容器與 Kubernetes 的關係

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250930/20178262WC0diy6111.png

在近幾年的技術社群中,「容器」與「Kubernetes」幾乎是同時被提及的關鍵字。許多人誤以為兩者是相同的概念,甚至會將「Kubernetes」等同於「Docker」。然而,事實上這是兩個不同層次的技術:

  • 容器(Container) 是一種應用程式執行的封裝與隔離方式。
  • Kubernetes(K8s) 則是一個容器編排平臺,用來自動化管理與部署容器。

要真正理解這兩者之間的關係,需要從它們的定義、適用情境、技術演進,以及 Kubernetes 為什麼現在偏好 containerd 而非 Docker 開始探討。


什麼是容器(Container)?

容器是一種輕量級的虛擬化技術,基於 Linux 的 Namespace 與 Cgroups 機制,實現進程級別的隔離。簡單來說,容器讓應用程式可以在一個封閉的執行環境中運行,而這個環境包含應用所需的程式碼、函式庫、設定檔與依賴。

與傳統的 VM(虛擬機)不同,容器不需要模擬整個 OS,而是共用主機的 Kernel,因此啟動快、資源利用率高。

常見的 Container Runtime

  • Docker:最早普及容器的代表性技術。
  • containerd:CNCF 專案,輕量且專注於容器執行。
  • CRI-O:專門為 Kubernetes 設計的容器執行時。
  • Podman:無需 Daemon 的容器工具,強調安全性。

容器的使用情境

  1. 開發環境:快速啟動一個測試用的服務。
  2. 部署應用:保證開發與生產環境一致。
  3. CI/CD:透過容器映像檔(Image)打包應用,降低版本差異問題。
  4. 微服務:每個微服務獨立打包為容器,方便部署與擴展。

什麼是 Kubernetes(K8s)?

Kubernetes 是由 Google 開發、後來捐贈給 CNCF 的開源專案,是目前最流行的容器編排平臺

它的核心能力是:

  • 自動化部署容器
  • 管理多節點叢集
  • 提供自動擴展(Auto-scaling)
  • 流量路由與負載平衡
  • 自我修復(Self-healing)
  • 滾動更新、金絲雀釋出

Kubernetes 的主要元件

  • 大規模微服務部署:數十到數百個服務協同運作。
  • 跨雲或混合雲環境:支援多個數據中心或雲供應商。
  • 高可用架構:確保應用不中斷服務。
  • DevOps / GitOps:結合 CI/CD,自動化部署。

容器與 Kubernetes

容器是基礎,Kubernetes 是管理層

容器解決的是「如何封裝與運行應用程式」,而 Kubernetes 解決的是「如何在大規模環境中自動化管理這些容器」。

單機 vs. 叢集

  • 單機環境下,你可以用 Docker 直接啟動一個容器。
  • 當系統有數十個容器,需要跨機器管理,就需要 Kubernetes 來協調。

相輔相成

容器提供一致的應用執行環境,Kubernetes 則提供統一的調度、擴展與治理。


從 Docker 到 containerd:Kubernetes 的容器執行時演進

為什麼以前 Kubernetes 使用 Docker?

在容器剛興起時,Docker 幾乎是唯一的選擇,開發者也習慣用 Docker CLI 來建立與管理容器。早期的 Kubernetes 透過 Docker Shim 與 Docker 整合。

為什麼 Kubernetes 不再使用 Docker?

自 Kubernetes 1.20 開始,官方宣布 棄用 Dockershim,原因包括:

  • Docker 不是僅僅一個容器,它還包含 CLI、API、Build 工具等,對 Kubernetes 來說過於複雜。
  • Docker 本身使用 containerd 作為底層執行時,等於 Kubernetes 間接呼叫 containerd,效率較低。
  • CNCF 生態:Kubernetes 希望使用符合 CRI(Container Runtime Interface) 標準的執行時,如 containerd、CRI-O。

為什麼選擇 containerd?

  • 輕量化:containerd 專注於「拉取映像檔、管理容器生命週期」,沒有多餘的功能。
  • CNCF 專案:與 Kubernetes 生態整合度高。
  • 效能更佳:少了中間轉換層,容器啟動更快。
  • 社群支持:廣泛應用於 GKE、EKS、AKS 等雲端服務。

Docker vs Containerd

項目 Docker Containerd
定位 完整的容器平臺,包含 CLI、Build、Registry 輕量級容器執行時
是否符合 CRI 不完全(需 Dockershim) 原生支援 CRI
功能範圍 Build、Run、Push、API、CLI Run、Pull、管理生命週期
與 K8s 整合 透過 Dockershim(已棄用) 原生支援,官方推薦
適用情境 開發環境、單機操作 Kubernetes 生產叢集

使用 Docker 與 containerd 的實務建議

  1. 開發階段 → Docker / Podman
    1.1. 開發者仍可用 Docker CLI 來建構與測試容器映像檔,因為操作直覺,工具生態成熟。
    1.2. 現在 Docker Desktop 可能要授權費用,所以建議選用 Podman
  2. 生產環境 → containerd / CRI-O
    2.1. 在 Kubernetes 叢集內,建議使用 containerd 或 CRI-O,避免額外的轉換開銷。
  3. 混合策略
    2.2. 本地:Docker for Desktop / Podman
    2.3. 生產:containerd(Kubernetes 內建支援)

結語

  • 容器 ≠ Kubernetes
    容器是應用封裝與運行的單位,而 Kubernetes 是管理容器的平臺。
  • Docker ≠ Kubernetes
    Docker 是容器技術的代表,但 Kubernetes 是容器編排工具。
  • Docker vs containerd
    在 Kubernetes 生產環境中,Docker 已逐漸被 containerd 取代,原因在於效能、整合度與標準化。
  • 實作建議
    在開發環境,你仍然可以放心使用 Docker/Podman。
    在 Kubernetes 正式環境,選擇 containerd 或 CRI-O 才是未來的主流。

上一篇
微服務導入 – Day 22 微服務的部署議題
系列文
微服務導入:從觀念到落地的架構實戰地圖23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言