緯育 2026-0516

出自頂極製作所

本次系列講座首先介紹了 Docker 中兩種備份與遷移機制:docker save/docker load(用於映像檔)與 docker export/docker import(用於容器)。講師強調了兩者在處理對象、檔案大小及匯入命名上的差異。接著比較了 docker commit 與 docker export/import 兩種建立映像檔的方式,指出 commit 會增加不必要的映像檔層數,建議優先使用 export。課程實作部分,指導學員使用 scp 將檔案傳輸至 Linux 虛擬機,並編寫 Dockerfile 建立一個包含 Tomcat 的 Web Server 映像檔,涵蓋 FROM、RUN、ADD、EXPOSE、ENTRYPOINT 等指令。

隨後,講座深入探討了 Dockerfile 中 ENTRYPOINT 與 CMD 的核心差異,建議初學者使用 ENTRYPOINT 以確保容器穩定啟動。課程進而延伸至 Kubernetes (K8s) 的學習,將其比喻為多引擎飛機,強調其叢集備援與高可用性的優勢。講師介紹了學習 K8s 的重要資源網站(kubernetes.io, cncf.io)及相關專業認證(CKA, CKAD, CKS),並闡述了容器化技術相較於傳統虛擬機部署的核心優勢,如免安裝、避免人為錯誤、跨平台及實現應用與底層作業系統的解耦,這正是雲原生(Cloud Native)的核心精神。

講座接著深入探討了雲原生領域的知識,包括 IT 認證的類型(選擇題 vs. 實務操作型)、CNCF 基金會的宗旨與專案成熟度分級。最後,詳細闡述了 Kubernetes 的起源、架構(Master 與 Worker 節點及其組件如 API Server、Scheduler、etcd、Kubelet、Kube-proxy)以及其核心功能,如資源調度、自我修復、服務發現和自動擴展/縮減。講師特別強調了「聲明式配置」作為 K8s 的重要核心觀念,以及內建 DNS(CoreDNS)在服務發現機制中的關鍵作用,並解釋了 Control Manager 如何監控並維持系統的預期狀態,實現自動化管理與故障恢復。

Docker 映像檔與容器的備份、遷移與客製化

  • 映像檔的備份與還原 (docker save / docker load)
    • 用途: docker save 將一個或多個映像檔 (Image) 儲存成 .tar 檔案;docker load 則從檔案中載入映像檔。
    • 特性: 載入後的映像檔名稱與原始名稱完全相同。
    • 應用情境: 適用於無網路或無倉庫 (Registry) 環境下的備份、還原及主機間遷移。
  • 容器的匯出與匯入 (docker export / docker import)
    • 用途: docker export 匯出一個容器 (Container) 的檔案系統成為 .tar 檔案;docker import 則將該檔案匯入並建立成一個新的「映像檔」。
    • 特性:
      • 處理對象是容器而非映像檔。
      • 匯入時可以為新映像檔指定全新名稱。
      • 可用於建立客製化映像檔:啟動基礎容器 -> 修改 -> 匯出 -> 匯入成新映像檔。
  • docker commit vs docker export/import
    • 目的: 兩者皆可基於容器變更建立新映像檔。
    • 主要差異: commit 會在原有映像檔上疊加新層 (Layer),增加層數,可能影響載入速度;而 export/import 產生的映像檔只有一個基礎層。
    • 最佳實踐:
      • 建議使用 export/import 來基於容器變動建立映像檔。
      • 建議使用 save/load 來交換或備份完整的映像檔。
  • Dockerfile 指令 (ENTRYPOINT vs. CMD)
    • ENTRYPOINT: 定義的指令在容器啟動時一定會被執行,不會被 docker run 後附加的指令覆蓋。
    • CMD: 定義的指令會被 docker run 後附加的指令覆蓋。
    • 建議: 初學者建議優先使用 ENTRYPOINT,以避免因意外附加指令導致容器啟動失敗。

Docker 映像檔的建立與執行 (Web Server 實例)

  • Dockerfile 常用指令
    • FROM rockylinux:9: 指定基礎映像檔。
    • WORKDIR /root: 設定容器內的工作目錄。
    • RUN ...: 在建構過程中執行指令,如安裝套件。
    • ADD jdk-8u191-linux-x64.tar.gz /: 將主機檔案加入映像檔並自動解壓縮。
    • EXPOSE 8080: 宣告容器將開放的連接埠。
    • ENV JAVA_HOME ...: 設定環境變數。
    • ENTRYPOINT [...]: 設定容器啟動時執行的命令。
  • 建置與執行流程
 1. 準備檔案: 使用 scp 將 Dockerfile 及所需檔案(如 JDK)傳輸至伺服器。
 2. 建置映像檔: docker build -t webserver .
 3. 執行容器: docker run --name my-web-server -p 8080:8080 webserver
 4. 驗證: 透過瀏覽器訪問主機 IP 的 8080 連接埠。

Docker 容器化技術的優勢與雲原生精神

  • Image 的核心價值
    • 簡化部署: 將應用程式與其所有依賴(套件、函式庫、設定)打包在一起,如同「綠色軟體」,免安裝即可執行。
    • 避免人為錯誤: 標準化的 Image 確保了環境的一致性。
    • 跨平台與可移植性: 「一次打包,到處部署」,不受底層作業系統發行版差異的影響。
  • 解耦(Decoupling)與雲原生(Cloud Native)
    • 核心目標是實現應用程式與作業系統的解耦,讓應用程式擺脫對特定環境的強依賴性,提升靈活性與可移植性。
  • 持久卷掛載(Persistent Volume)
    • 將主機節點的資料夾掛載到容器內部,實現資料持久化。即使容器被刪除,資料依然保留在主機上。

Kubernetes (K8s) 基礎概念

  • 從單機到叢集管理
    • Docker 是單機管理工具,存在單點故障風險。
    • K8s 是叢集管理工具,跨多台主機管理容器,提供備援 (HA, High Availability)。講師以多引擎飛機比喻其叢集備援特性。
  • 操作模型:指令型 vs. 聲明型
    • 指令型 (Imperative): 告訴系統「如何做」(How)。
    • 聲明型 (Declarative): 宣告想要的「最終狀態」(What),系統會自動完成部署。這是 K8s 的核心理念,也是未來趨勢。
  • 起源與命名: 源自 Google 內部專案 Borg,K8s 是其簡稱。100% 由 Go 語言撰寫。
  • 學習資源與認證
    • 官方網站: kubernetes.io (官方文件) 和 cncf.io (雲原生運算基金會)。
    • 專業認證: CKA (Administrator), CKAD (Developer), CKS (Security Specialist) 是含金量較高的實務操作型認證。

Kubernetes (K8s) 架構與核心組件

  • Master Node (管理節點): 負責整個叢集的管理。
    • API Server: 所有操作的統一入口,預設透過安全的 6443 連接埠進行認證與授權 (RBAC) 存取。
    • etcd: 儲存叢集所有狀態與設定的分佈式鍵值資料庫,極為重要。
    • Scheduler: 負責將 Pod 調度到最合適的 Worker Node 上。
    • Control Manager: 自動化管理中心,監控並維持系統的預期狀態,執行自我修復。
  • Worker Node (工作節點): 負責運行應用程式。
    • Kubelet: 負責管理 Pod 的完整生命週期,並向 Master 回報節點狀態。
    • Kube-proxy: 負責節點內的網路通訊與負載平衡,底層基於 IPtables 或 IPVS 實現。
    • Container Runtime: 容器執行環境,如 ContainerD。

Kubernetes (K8s) 核心功能

  • 服務發現 (Service Discovery)
    • 內建 DNS 服務(新版為 CoreDNS),當建立 Service 時,會自動為其創建 DNS 紀錄。
    • FQDN 格式為 服務名稱.命名空間名稱.svc.cluster.local,其中 服務名稱.命名空間名稱 必須記住。
    • Pod 內的 DNS 設定會被 K8s 自動覆寫,指向內部 DNS。
  • 主要功能特性
    • 資源調度 (Scheduling): 自動選擇節點部署應用。
    • 自我修復 (Self-healing): 當應用異常時,自動恢復到正常狀態。
    • 擴展與縮減 (Scaling): 可手動或自動(Auto-scaling)增減應用實例數量以應對負載變化。

Linux 相關知識

  • 套件管理工具: apk (Alpine), apt (Ubuntu), yum (Red Hat/Rocky), zypper (openSUSE)。
  • 檔案傳輸: 使用 scp 指令在本地與遠端主機間安全地複製檔案,是必備技能。語法:scp [本地檔案] [使用者]@[遠端主機]:[遠端路徑]。

2026-0516-01.png

MiniKube 與版本策略

  • MiniKube 用途與取態
    • 本機快速建立單一節點 K8s,適合練習上層應用部署;核心操作與正式環境相似,但部分設定與原生 K8s 不一致,故僅使用基本功能以避免非標準行為。
    • 過往以 KVM2 驅動,現場改用 Docker driver,降低學習門檻與卡關機率。
  • 版本選擇
    • 強調使用已驗證版本而非追新:MiniKube v1.38.1 搭配 K8s 1.28.3;最新功能非必要,穩定安裝為優先。
  • Addons 與常用操作
    • minikube addons list/enable 可快速啟用 Ingress、Dashboard、EFK、Istio、Metrics 等;但版本差異可能造成落差,示範不過度延伸。
    • 基本指令:start/stop、dashboard(需先安裝對應套件),清理可移除家目錄下 .minikube。
  • 安裝與驗證實作
    • 下載執行檔至 /usr/local/bin;以 Docker driver 啟動時若為 root 需加允許參數(強制執行)。
    • 啟動過程自動拉取 K8s 映像,容器配置約 2G RAM/2 vCPU;部署完成以 kubectl get nodes 驗證 Ready 節點(minikube,v1.28.3)。
  • kubectl 安裝與倉庫設定
    • 於等待鏡像期間,於 Master 節點設定 K8s 官方套件倉庫(新格式),再用套件管理器安裝 kubectl;未設倉庫將出現找不到套件的錯誤。

Kind(Kubernetes in Docker)

  • 工具定位與優劣
    • 基於容器建立多節點叢集,更貼近原生語義;適合對齊後續三台 VM 的教學架構。
    • 無開箱 Addons,需自行部署元件(如 Ingress),較貼近正式環境作法。
  • 示範流程
    • 安裝執行檔至 /usr/local/bin;以 YAML 宣告三節點拓撲,執行後自動拉取鏡像並部署。
    • 以 kubectl 檢查預期三節點出現。
  • 注意事項
    • 下載鏡像受網路影響大、體積偏大;容器中跑容器(nesting)效能較差但便於練習。

原生 K8s 與企業生態

  • 原生與商業版比較
    • 開源版彈性高、成本低但安裝辛苦;商業版(如 Red Hat OpenShift、VMware 等)整合完善且有技術支持,但費用高昂(動輒數百萬至數千萬/年)。
    • 教學採開源路線以保有彈性與可學性;正式企業常因保險與支援需求選擇商業版。
  • 職場角色與分工
    • DevOps 介於 Infra 與開發之間,目標是讓開發者幾乎感受不到 K8s(Git 驅動 CI/CD 自動打包與部署)。
    • 台灣常見分工不清與「打雜」現象;職缺描述與實務落差大,需審慎評估職涯路線(DevOps/SRE/Infra/K8s 管理)。

三節點原生安裝(K8s 1.24)

  • 自動化與原生指令
    • 以 Ansible 指令(RAW ENV 1.24/RAW K8S 1.24)與腳本(k8s-1.24.sh)在 master 上執行,完成前置到初始化與節點加入。
    • 原生流程:kubeadm init(帶 --service-cidr/--pod-network-cidr 等參數)後以 kubeadm join 將 node1、node2 加入。
  • Linux 前置作業
    • 停用 swap、按需處理 SELinux 與防火牆、啟用 IP Forward、載入必要模組與安裝套件;Ansible 已自動化多數步驟。
  • CNI 選型
    • 以 Calico 為主(支持 Network Policy);亦提及 Flannel、Cilium 等可選方案。
  • 一致性與故障排查
    • 僅在 master 執行;維持三節點一致密碼(root/085)以便 Ansible 連線。
    • 常見問題:相依套件缺失、OS 未更新、磁碟空間不足、密碼變更致不通、鏡像下載卡住(網路不穩);若畫面出現紅色 ignore屬正常,其餘失敗需重試與修正。
    • 若目錄被刪需以 SCP 等方式補齊;確認三節點可互通與登入。

容器運行時演進(Dockershim 移除後)

  • 版本與路線
    • K8s 1.24 起移除 Dockershim,主流改用 Containerd 或 CRI-O;若堅持 Docker 需加 cri-dockerd 作橋接,疊層複雜不建議。
  • 操作工具
    • Containerd 原生用 ctr;為保留 docker 操作手感可用 nerdctl(約 80–90% 相似度),並留意 Namespace(default/k8s.io)。
    • 建議在整合環境中以 nerdctl --namespace k8s.io 操作,避免資源看不到或誤域。
  • 管理視角轉換
    • K8s 管理聚焦 Pod/Deployment/Service 等資源;容器層指令僅於特殊除錯使用。
    • 教材已將過往 docker 指令示例改寫為 nerdctl 等價操作。

後續課程與操作對比

  • 應用部署路徑
    • 已演示以系統套件與 Docker 部署 Nginx;下一步將以 K8s 部署 Nginx,對比三種方法的差異與適用情境。

2026-0516-02.png