容器完全指南:從入門到實戰

更新 發佈閱讀 27 分鐘

前言

是不是很多人一想到「容器 = Docker」?

其實,在容器技術的世界裡,除了 Docker 之外,還有各種不同的選擇。 本文會從容器的基礎概念開始,詳細介紹 Docker 以外的主要容器引擎。

本文可以學到什麼?

  • 容器技術的基本概念
  • Docker 以外主要容器引擎的特色
  • 各個引擎的使用情境與取捨方式
  • 實際的安裝步驟與使用範例

1. 容器技術的基礎知識

1.1 什麼是容器?

容器是一種將「應用程式及其所有相依套件」打包起來,並在隔離環境中執行的技術。

與虛擬機(VM)相比,有以下特徵:

raw-image


1.2 什麼是容器引擎?

容器引擎是用來管理容器生命週期(建立、啟動、停止、刪除)的軟體。

主要功能包含:

  • 映像檔管理:建立、儲存、發佈容器映像檔
  • 容器執行:從映像檔啟動並管理容器
  • 網路管理:設定容器之間的網路溝通
  • 儲存管理:資料持久化處理

1.3 容器相關標準規格

容器技術有以下標準規格:

  • OCI(Open Container Initiative):針對容器執行格式與映像檔格式的標準
  • OCI Runtime Spec:容器如何執行的規格
  • OCI Image Spec:容器映像檔格式的規格
  • CRI(Container Runtime Interface):Kubernetes 與容器 Runtime 之間的介面

有這些標準存在,可以確保不同容器引擎之間的相容性。


2. 為什麼需要 Docker 以外的選擇?

Docker 是很優秀的工具,但因為以下原因,大家逐漸開始尋找替代方案:

2.1 授權與成本問題

  • 自 2021 年 9 月起,Docker Desktop 在大型企業的商業用途需要付費
  • 小型團隊仍可免費使用,但依組織規模不同可能產生年度授權費

2.2 架構上的課題

  • Docker 需要常駐的 Daemon 行程(dockerd
  • Daemon 以 root 權限執行,存在資安風險
  • 一旦 Daemon 停止,所有容器都會受到影響

2.3 使用情境的多樣化

  • 在 Kubernetes 環境中,偏好更輕量的 Runtime
  • 在 CI/CD 環境中,希望能在無特權(non-privileged)模式下執行會更安全
  • 在微服務架構中,針對特定用途最佳化的工具更有效

3. 主要容器引擎詳細解說

3.1 Podman

概要

Podman 是 Red Hat 開發的容器引擎,是目前最受歡迎的 Docker 替代方案之一。

主要特點

  1. 無 Daemon 的架構(Daemonless Architecture)
  • 不需要背景常駐 Daemon
  • 容器以一般行程的方式執行
  • 提升整體系統穩定性
  1. Rootless 執行
  • 不需要 root 權限即可執行容器
  • 大幅降低安全風險
  • 適合多使用者環境安全使用
  1. 與 Docker 的相容性
  • 只要把 docker 指令換成 podman 就能運作
  • 可以直接使用既有的 Dockerfile
  • 與 Docker Hub 等 Registry 相容
  1. Pod 的概念
  • 支援 Kubernetes 相容的 Pod(多容器群組)
  • 往 Kubernetes 遷移較為容易

優點

  • 資安水準高
  • 從 Docker 遷移非常容易
  • 有 Red Hat 的商業技術支援
  • 與 systemd 的整合非常好

缺點

  • 與 Docker Compose 並非完全相容(可用 podman-compose 因應)
  • Windows 原生支援較有限
  • 生態系尚未如 Docker 成熟

適用情境

  • 重視安全性的環境
  • 開發機上替代 Docker 的選項
  • CI/CD Pipeline
  • Linux 環境上的正式上線系統

安裝與快速開始

# macOS(使用 Homebrew)
brew install podman

# Podman Machine(macOS/Windows 用)初始化
podman machine init
podman machine start

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y podman

# RHEL/CentOS/Fedora
sudo dnf install -y podman

# 確認版本
podman --version

# 執行 Nginx 容器
podman run -d -p 8080:80 --name web nginx

# 顯示容器列表
podman ps

# 停止並刪除容器
podman stop web
podman rm web

與 Docker 指令對照

# Docker 指令 → Podman 指令
docker run → podman run
docker ps → podman ps
docker build → podman build
docker images → podman images

# 設定 alias 後幾乎可當 Docker 用
alias docker=podman

3.2 containerd

概要

containerd 原本是 Docker 的核心元件之一,目前是 CNCF(Cloud Native Computing Foundation)的專案。

主要特點

  1. 輕量且簡潔
  • 僅提供執行容器所需的最小功能
  • 提供低階 API
  • 額外負擔(Overhead)很小
  1. Kubernetes 標準 Runtime
  • 是 Kubernetes 推薦的容器 Runtime
  • 完全符合 CRI(Container Runtime Interface)
  • 許多 Managed Kubernetes 服務採用
  1. 業界標準
  • 被 Docker、Kubernetes、AWS ECS、Google Cloud Run 等廣泛使用
  • 符合 OCI 規範
  • 穩定性與信賴度高

優點

  • 非常輕量、效能佳
  • 與 Kubernetes 的相容性極佳
  • 在正式環境有大量實績
  • 作為 CNCF 專案屬中立立場

缺點

  • 內建 CLI 功能基本(進階操作多用 nerdctl
  • 不算是新手友善工具
  • 不像 Docker 那樣提供整合式開發體驗
  • 映像檔建置功能需搭配其他工具(如 BuildKit)

適用情境

  • Kubernetes 叢集的容器 Runtime
  • 正式環境中需要輕量 Runtime
  • 需將容器 Runtime 嵌入自家產品時
  • Cloud Native 架構環境

安裝與快速開始(Ubuntu/Debian 範例)

# 安裝依賴套件
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release

# 新增 Docker 官方 GPG 金鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 設定套件庫
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安裝 containerd
sudo apt-get update
sudo apt-get install -y containerd.io

# 啟用 containerd
sudo systemctl enable --now containerd

# 安裝 nerdctl(Docker 風格 CLI
wget https://github.com/containerd/nerdctl/releases/latest/download/nerdctl-full-1.7.0-linux-amd64.tar.gz
sudo tar Cxzvf /usr/local nerdctl-full-1.7.0-linux-amd64.tar.gz

# 使用 nerdctl 執行容器
sudo nerdctl run -d -p 8080:80 --name web nginx

# 查看容器列表
sudo nerdctl ps

# 查看映像檔列表
sudo nerdctl images

containerd 設定

# 產生預設設定檔
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# 編輯設定(例如改用 systemd cgroup driver)
sudo nano /etc/containerd/config.toml
# [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
# SystemdCgroup = true

# 重新啟動 containerd
sudo systemctl restart containerd

3.3 CRI-O

概要

CRI-O 是專為 Kubernetes 設計的輕量容器 Runtime,重點就是與 Kubernetes 的緊密整合。

主要特點

  1. Kubernetes 專用設計
  • 專注實作 CRI(Container Runtime Interface)
  • 不包含 Kubernetes 不需要的多餘功能
  • 完全追隨 Kubernetes 版本更新
  1. 符合 OCI 標準
  • 完全符合 Open Container Initiative 標準
  • 支援多種 Runtime(runc、crun、Kata 等)
  • 架構彈性高
  1. 重視安全性
  • 最小權限原則(Least Privilege)
  • 整合 SELinux、AppArmor
  • 支援 Seccomp Profile

優點

  • 在 Kubernetes 環境中有最佳化效能
  • 強化安全性
  • Red Hat OpenShift 預設採用
  • 與 Kubernetes 版本同步有保證

缺點

  • 基本上不考慮 Kubernetes 以外使用情境
  • 不適合單機、獨立開發用
  • 文件多半假設你已有 Kubernetes 知識
  • 學習資源相比 Docker 較少

適用情境

  • Kubernetes 叢集(特別是重視安全性時)
  • Red Hat OpenShift 環境
  • 企業級 Kubernetes 環境
  • 具嚴格法規/稽核需求的環境

安裝範例(Kubernetes 節點/Ubuntu 20.04)

# 前置作業
sudo apt-get update
sudo apt-get install -y software-properties-common curl

# 新增 CRI-O 套件庫(以 1.28 版本為例)
export OS=xUbuntu_20.04
export VERSION=1.28

echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list

curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/Release.key | sudo apt-key add -
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | sudo apt-key add -

# 安裝
sudo apt-get update
sudo apt-get install -y cri-o cri-o-runc

# 啟動 CRI-O
sudo systemctl enable --now crio

# 確認狀態
sudo systemctl status crio

# 使用 crictl(CRI 相容 CLI
sudo crictl version
sudo crictl images
sudo crictl ps

與 Kubernetes 的整合範例

# kubeadm 設定範例(/etc/kubernetes/kubeadm-config.yaml)
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
networking:
podSubnet: 10.244.0.0/16
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
containerRuntimeEndpoint: unix:///var/run/crio/crio.sock


3.4 LXC/LXD(Linux Containers)

概要

LXC 是很早期的 Linux 容器技術,LXD 則是其上層管理工具。它提供介於「虛擬機」與「應用程式容器」之間的「系統容器」。

主要特點

  1. 系統容器(System Container)
  • 可以執行一整套完整的 Linux 系統
  • 內含 init 系統(例如 systemd)
  • 使用感受接近虛擬機(VM)
  1. 適合長時間執行
  • 適用於有狀態(stateful)的工作負載
  • 可以作為虛擬機的替代方案
  • 支援容器遷移(Migration)
  1. LXD 的附加功能
  • RESTful API
  • 映像伺服器
  • 叢集管理功能
  • Snapshot 與備份

優點

  • 比虛擬機更輕量、更快速
  • 可使用完整的 Linux 環境
  • 網路與儲存設定彈性高
  • 有 Canonical 的支援

缺點

  • 與 Docker 類型的「應用程式容器」思維不同
  • 映像檔生態系較小
  • 不太適合典型的 Cloud Native 用途
  • 學習曲線稍高

適用情境

  • 開發、測試環境
  • 當作虛擬機的輕量替代品
  • 有狀態的應用程式
  • 多租戶(multi-tenant)環境

安裝與快速開始(Ubuntu/Debian)

sudo apt-get update
sudo apt-get install -y lxd

# 初始設定(互動式)
sudo lxd init
# 使用預設值一路按 Enter 即可

# 將使用者加入 lxd 群組
sudo usermod -aG lxd $USER
newgrp lxd

# 查看可用映像
lxc image list images: | grep ubuntu

# 建立並啟動 Ubuntu 22.04 容器
lxc launch images:ubuntu/22.04 my-ubuntu

# 查看容器列表
lxc list

# 進入容器 shell
lxc exec my-ubuntu -- /bin/bash

# 停止容器
lxc stop my-ubuntu

# 刪除容器
lxc delete my-ubuntu

實戰範例:建置 Web 伺服器

# 使用 Ubuntu 22.04 建立 Nginx 伺服器
lxc launch images:ubuntu/22.04 webserver

# 進入容器
lxc exec webserver -- bash

# 在容器內安裝 Nginx
apt update
apt install -y nginx
systemctl enable nginx
exit

# 設定 Port Forwarding
lxc config device add webserver myport80 proxy listen=tcp:0.0.0.0:8080 connect=tcp:127.0.0.1:80

# 在瀏覽器開啟 localhost:8080

3.5 Buildah

概要

Buildah 是專門用來建置容器映像檔的工具。

它可以不透過 Docker Daemon,甚至不必使用 Dockerfile,而以腳本方式建置映像檔。


主要特點

  1. 專注於 Build
  • 只負責映像檔建置
  • 執行容器則交給 Podman 等其他工具
  • 符合「單一責任原則」
  1. 不一定需要 Dockerfile
  • 可用 Shell Script 完整描述建置流程
  • 更細緻的操作控制
  • 當然也仍可使用 Dockerfile
  1. 控制映像檔層(Layer)
  • 可控制在何時產生 Layer
  • 容易縮小映像檔尺寸
  • Cache 策略更彈性

優點

  • 容易最佳化映像檔大小
  • 可以在 rootless 環境下建置
  • 容易與腳本/自動化流程結合
  • 可善用既有 Shell Script 資產

缺點

  • 相對於 Dockerfile,學習成本略高
  • 容器執行需靠其他工具
  • 社群規模仍小於 Docker
  • 文件資源較少

適用情境

  • CI/CD Pipeline
  • 映像檔大小優化很重要時
  • Build 流程複雜,需要細緻控制時
  • Dockerfile 難以表達需求的 Build 情境

3.6 Kata Containers

概要

Kata Containers 是一種「混合型」容器 Runtime,利用 VM 做隔離,但又保留容器的便利性。 簡單說:兼具容器的輕量與虛擬機的高安全等級。


主要特點

  1. 以硬體虛擬化提供隔離
  • 每個容器在自己專屬的輕量 VM 中執行
  • 於 Kernel 層級完全隔離
  • 能有效避免鄰近租戶攻擊(noisy neighbor)
  1. 與容器 API 相容
  • 完全符合 OCI 與 CRI
  • 可與 containerd、CRI-O 整合
  • 可直接使用既有容器映像檔
  1. 使用輕量 VM 技術
  • 使用 QEMU 或 Cloud Hypervisor 等
  • 啟動時間約數百毫秒(比傳統 VM 快很多)
  • 盡量降低記憶體額外開銷

優點

  • 安全等級極高
  • 非常適合多租戶環境
  • 能符合嚴謹的法規/稽核需求
  • 能與 Kubernetes 無縫整合

缺點

  • 比一般容器「重」(需要啟動 VM)
  • 必須支援硬體虛擬化(Intel VT-x / AMD-V 等)
  • 設定較複雜
  • 除錯較困難

適用情境

  • 多租戶雲端環境
  • 安全性要求極高的系統
  • 需要執行不信任的程式碼
  • 金融、醫療等高規範產業

3.7 gVisor

概要

gVisor 是 Google 開發的 User-space Kernel,


在應用程式與宿主機 Kernel 之間再加上一層安全防護。


主要特點

  1. User-space Kernel
  • 截獲 Linux System Call
  • 限制對宿主機 Kernel 的直接存取
  • 使用 Go 實作的自家 Kernel(Sentry)
  1. 與 OCI 相容
  • 可與 Docker、containerd、Kubernetes 整合
  • 既有容器映像檔可直接使用
  • 可作為 runc 的替代 Runtime
  1. 沙箱(Sandbox)執行
  • 大幅減少 System Call 攻擊面
  • 保護宿主機 Kernel 不被直接攻擊
  • 降低容器逃逸(container escape)風險

優點

  • 高安全性
  • 不需硬體虛擬化(比 Kata Containers 輕量)
  • 已在 Google Cloud Run 等服務實戰部署
  • 應用程式相容性相當高

缺點

  • 有效能額外負擔(尤其 I/O)
  • 並非所有 System Call 都被支援
  • 除錯難度較高
  • 記憶體使用量可能增加

適用情境

  • Serverless 環境(例如 Google Cloud Run)
  • 多租戶 SaaS
  • 執行不信任的程式碼
  • 任何以安全性為優先的容器環境

3.8 Firecracker

概要

Firecracker 是 AWS 開發的超輕量 microVM 技術,


是 AWS Lambda 與 Fargate 的底層技術之一。


主要特點

  1. microVM
  • 基於 KVM 的極小虛擬機
  • 啟動時間小於 125 ms
  • 記憶體 Overhead 小於 5 MB
  1. 重視安全性
  • 以 VM 等級完整隔離
  • 精簡的 Device Model
  • 將攻擊面壓到最低
  1. 針對 Serverless 最佳化
  • 高密度執行(一台 Host 可跑上千個 microVM)
  • 快速 Snapshot 功能
  • 透過 REST API 管理

優點

  • 啟動極快
  • VM 等級的安全隔離
  • 極輕量(CPU / 記憶體效率高)
  • 在 AWS 上有大量實際使用案例

缺點

  • 只能在 Linux Host 上執行(x86_64 / aarch64)
  • 不直接與 OCI 容器相容
  • 設定較低階,操作較複雜
  • 社群規模小於 Docker

適用情境

  • Function as a Service(FaaS)平台
  • 多租戶環境
  • Edge Computing
  • 短時間執行的工作負載

3.9 systemd-nspawn

概要

systemd-nspawn 是整合在 systemd 裡的作業系統層級容器技術。


適合用來建立輕量的容器環境、除錯或隔離開發環境。


主要特點

  1. 與 systemd 原生整合
  • systemd 內建(多數現代 Linux 免額外安裝)
  • 能與 systemd-machined 整合
  • 可透過 journalctl 做統一 Log 管理
  1. OS-level 虛擬化
  • 可視為加強版的 chroot
  • 隔離行程、網路、檔案系統
  • 啟動非常輕量快速
  1. 偏向系統容器用途
  • 可執行完整 Linux 系統
  • 包含 init(systemd)
  • 很適合作為開發/測試環境隔離工具

優點

  • 只要有 systemd 就能用,安裝成本低
  • 與 systemd 工具整合良好
  • 輕量、簡單
  • 很適合除錯與測試使用

缺點

  • 不適合作為典型應用程式容器平台
  • 沒有像 Docker 那樣的映像檔生態系
  • 不太適合 Cloud Native 用途
  • 官方文件相對較少

適用情境

  • 開發與除錯環境
  • 系統測試
  • 在乾淨環境中驗證行為
  • 與 systemd 相關的開發

3.10 Singularity/Apptainer

概要

Singularity(現稱 Apptainer)是專為 HPC(High Performance Computing,高效能運算)


與科學運算設計的容器平台,在研究機構與超級電腦環境相當普及。


主要特點

  1. HPC 特化設計
  • 可整合 MPI、GPU(CUDA、ROCm)
  • 針對平行計算環境最佳化
  • 在超級電腦上有大量實績
  1. 安全模型
  • 預設 rootless 執行
  • 以一般使用者權限執行容器
  • 適合共用 HPC 環境
  1. 重視再現性
  • 使用 SIF(Singularity Image Format)格式
  • 單一不可變映像檔
  • 方便確保科學研究可重現
  1. Docker 相容性
  • 可將 Docker 映像檔轉為 SIF
  • 可從 Docker Hub 取得映像檔
  • 可重用 Dockerfile 設計概念

優點

  • 在 HPC 環境中實績豐富
  • rootless 執行安全性高
  • 對 GPU、MPI 支援良好
  • 與科學計算工作流程高度相容
  • 單一映像檔易於分發與管理

缺點

  • 對一般容器用途來說可能有點「太重」
  • 與 Kubernetes 的整合較有限
  • 社群規模仍小於 Docker
  • 不特別適合典型 Web 開發情境

適用情境

  • HPC/超級電腦環境
  • 機器學習、AI 研究
  • 生物資訊(Bioinformatics)
  • 科學計算工作流程
  • 需要嚴謹再現性的研究專案
留言
avatar-img
留言分享你的想法!
avatar-img
Kiki的沙龍
4會員
55內容數
心繫正體中文的科學家,立志使用正體中文撰寫文章。 此沙龍預計涵蓋各項資訊科技知識分享與學習心得
Kiki的沙龍的其他內容
2025/11/01
先說在前面——你是不是常常隨意地寫 Dockerfile 呢?其實只要稍微用點心思,就能讓映像檔更輕量、可讀性更高。 這次就來介紹幾個實用的小技巧。
2025/11/01
先說在前面——你是不是常常隨意地寫 Dockerfile 呢?其實只要稍微用點心思,就能讓映像檔更輕量、可讀性更高。 這次就來介紹幾個實用的小技巧。
2025/10/30
Google 近日推出的 「Google Skills」,正是為了填補這個技能落差而打造的終極免費學習平台。 本文將說明技術人員與商務人士如何善用這個平台,讓自己的職涯在 AI 時代加速前進。
2025/10/30
Google 近日推出的 「Google Skills」,正是為了填補這個技能落差而打造的終極免費學習平台。 本文將說明技術人員與商務人士如何善用這個平台,讓自己的職涯在 AI 時代加速前進。
2025/10/30
Oracle 發布一款領先業界的綜合平台——「Oracle AI Data Platform, AIDP」,可讓生成式AI 模型安全地連接至企業的資料、應用程式與工作流程。透過自動資料擷取、語義強化、向量索引建立,並與內建的生成式 AI 工具結合加速使用者開發。
Thumbnail
2025/10/30
Oracle 發布一款領先業界的綜合平台——「Oracle AI Data Platform, AIDP」,可讓生成式AI 模型安全地連接至企業的資料、應用程式與工作流程。透過自動資料擷取、語義強化、向量索引建立,並與內建的生成式 AI 工具結合加速使用者開發。
Thumbnail
看更多