實驗環境總覽#

在開始學習容器(Container)之前,先建立一個可以重現的實驗環境。容器技術依賴 Linux Kernel 的特定機制,因此實驗環境的選擇會直接影響後續觀察的細節。本章節說明建議的環境組合,以及為什麼需要這些前提條件。

為何需要 Linux 環境#

容器並不是獨立的虛擬機器(Virtual Machine, VM),而是由 Linux Kernel 提供的一組隔離機制(命名空間 Namespaces 與 控制群組 cgroups)所構成的「受限制的行程(Process)」。這意味著:

  • 容器的本質依然是 host 上的 Linux 行程
  • 沒有 Linux Kernel,就沒有原生容器
  • Windows 與 macOS 上要執行 Linux 容器,必須透過 VM 模擬出 Linux 環境

換句話說,容器並非「跨作業系統」的技術,而是「依附在 Linux 上」的技術。

建議的實驗環境#

為了讓觀察結果一致,建議直接使用 Linux 環境(實體機或 VM 皆可)。常見組合如下:

  • 實體 Linux 主機(Ubuntu、Debian、Fedora、Rocky Linux 等發行版)
  • 雲端 Linux VM(AWS EC2、GCP Compute Engine、Azure VM)
  • 本機 VM(VirtualBox、VMware、UTM、QEMU)
  • macOS 上的 Lima、Colima、OrbStack(皆會啟動 LinuxKit VM)
  • Windows 上的 WSL2(基於輕量化 Hyper-V VM)

如果使用 Docker Desktop,無論在 macOS 或 Windows,背後都會自動啟動一個 Linux VM 來執行 Docker Engine。

Kernel 版本要求#

Docker Engine 對 Linux Kernel 有最低版本要求,原因是命名空間與 cgroups 的功能會隨 Kernel 版本演進:

  • Docker 官方建議 Kernel 版本 3.10 以上
  • 較新功能(如 cgroups v2、user namespace 完整支援)建議 4.x 以上
  • 多數現代發行版(Ubuntu 20.04+、Debian 11+、RHEL 8+)皆已內建適合版本

可以使用以下指令確認 Kernel 版本:

uname -r
uname -a

預期輸出(具體值依環境而異):會顯示類似 5.15.0-xx-generic6.x.x 的版本字串,前兩段數字(5.15 / 6.x)就是判斷 Kernel 版本的依據。

必要的核心功能#

確認 Kernel 是否啟用容器所需的功能,可以檢查 /proc/config.gz/boot/config-$(uname -r)

grep -E "NAMESPACES|CGROUPS|OVERLAY" /boot/config-$(uname -r)

主要會關注以下選項是否為 y

  • CONFIG_NAMESPACES
  • CONFIG_PID_NS
  • CONFIG_NET_NS
  • CONFIG_UTS_NS
  • CONFIG_IPC_NS
  • CONFIG_USER_NS
  • CONFIG_CGROUPS
  • CONFIG_OVERLAY_FS

大多數主流發行版的預設 Kernel 都已啟用上述選項。若使用自行編譯的 Kernel,才需要特別檢查。

Docker Engine 簡介#

Docker Engine 是執行容器的核心元件,負責:

  • 與 Linux Kernel 互動,建立 Namespaces 與 cgroups
  • 管理映像檔(Image)的下載與儲存(透過 OverlayFS 等聯合檔案系統 Union File System)
  • 提供 REST API 給 docker CLI 或其他用戶端使用
  • 由 systemd(在多數發行版上)管理為背景服務

Docker Engine 並不等同於 Docker Desktop。後者是一個包含 GUI、VM、CLI 的桌面套裝產品;前者是只有 daemon 與 CLI 的伺服器端元件。下一章會詳細區分兩者的安裝方式。

環境檢查清單#

在開始後續章節前,建議先確認以下項目:

  1. 作業系統是否為 Linux,或具備能執行 Linux VM 的能力
  2. Kernel 版本 ≥ 3.10(建議 ≥ 5.x)
  3. 已安裝 Docker Engine 或 Docker Desktop
  4. 使用者具備執行 docker 指令的權限(在 docker 群組中,或使用 sudo
  5. 網路可正常連線到 Docker Hub 或其他映像檔倉庫

延伸閱讀#