實驗環境總覽#
在開始學習容器(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-generic 或 6.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_NAMESPACESCONFIG_PID_NSCONFIG_NET_NSCONFIG_UTS_NSCONFIG_IPC_NSCONFIG_USER_NSCONFIG_CGROUPSCONFIG_OVERLAY_FS
大多數主流發行版的預設 Kernel 都已啟用上述選項。若使用自行編譯的 Kernel,才需要特別檢查。
Docker Engine 簡介#
Docker Engine 是執行容器的核心元件,負責:
- 與 Linux Kernel 互動,建立 Namespaces 與 cgroups
- 管理映像檔(Image)的下載與儲存(透過 OverlayFS 等聯合檔案系統 Union File System)
- 提供 REST API 給
dockerCLI 或其他用戶端使用 - 由 systemd(在多數發行版上)管理為背景服務
Docker Engine 並不等同於 Docker Desktop。後者是一個包含 GUI、VM、CLI 的桌面套裝產品;前者是只有 daemon 與 CLI 的伺服器端元件。下一章會詳細區分兩者的安裝方式。
環境檢查清單#
在開始後續章節前,建議先確認以下項目:
- 作業系統是否為 Linux,或具備能執行 Linux VM 的能力
- Kernel 版本 ≥ 3.10(建議 ≥ 5.x)
- 已安裝 Docker Engine 或 Docker Desktop
- 使用者具備執行
docker指令的權限(在docker群組中,或使用sudo) - 網路可正常連線到 Docker Hub 或其他映像檔倉庫
延伸閱讀#
- Docker Docs — Install Docker Engine: https://docs.docker.com/engine/install/ ↗
- Linux man pages —
namespaces(7)、cgroups(7) - Linux Kernel documentation — Namespaces overview: https://www.kernel.org/doc/html/latest/admin-guide/namespaces/ ↗