雅寶社區 · 頂客論壇 (AHPAL.COM)

2026 年 Docker 容器化部署實戰:從入門到 K8s 整合指南

modern%20workspace%20with%20laptop%2C%20smartphone...
發表時間:2026 年 08 月 15 日 | 更新日期:2026 年 08 月 15 日 | 編輯:雅寶社區編輯團隊

FROM node:20-alpine AS builder

COPY package*.json ./

RUN npm install

第二階段:執行環境

FROM node:20-alpine

COPY --from=builder /app/node_modules ./node_modules

COPY . .

ENV PORT=3000

EXPOSE 3000

CMD ["node", "app.js"]

接著執行建置:

docker build -t my-node-app:1.0 .

docker run -d -p 8080:3000 --name my-app my-node-app:1.0

打開瀏覽器存取 http://localhost:8080,你應該會看到應用程式的回應。這就完成了一個最基礎的 Docker 化應用!

三、多容器管理:Docker Compose 深入實戰

實際的應用很少只有單一容器,更多時候我們需要同時運行前端、後端、資料庫、快取服務等。Docker Compose 提供了一個宣告式方式,用一份 YAML 檔案定義並管理多個容器。接下來我們將建立一個「Web + PostgreSQL」的範例。

1. 為什麼需要 Compose?

假設你在開發一個待辦事項 API,它需要連接 PostgreSQL,你可能還要一個 Redis 作為快取。如果只用 docker run,你必須依序下達多條指令,還要設定網路、環境變數、volume,非常繁瑣。Compose 讓你可以把整個服務堆疊寫在一個 docker-compose.yml 檔案中,並用docker compose up 一條指令啟動所有服務。

在 2026 年,Compose 已不只是本機開發的工具,雲端環境如 AWS ECS 也支援 Compose 規格。因此熟練 Compose 對後續銜接 Kubernetes 非常有幫助,因為兩者都使用 YAML 描述基礎設施。

2. Compose 實戰:Web + PostgreSQL 服務堆疊

我們沿用上面的 Node.js 應用,但加入資料庫,並透過 Dockerfile 來建置 Web 服務。請先建立一個 docker-compose.yml:

version: '3.8'

services:

web:

build: .

ports:

environment:

depends_on:

restart: unless-stopped

db:

image: postgres:16

environment:

POSTGRES_USER: postgres

POSTGRES_PASSWORD: secret

POSTGRES_DB: mydb

volumes:

restart: unless-stopped

volumes:

db-data:

接著在 app.js 中讀取這些環境變數,建立 PostgreSQL 連線。這裡為了示範簡潔,可以只用環境變數列印出來,或使用 pg 套件存取。執行以下指令:

docker-compose up -d

docker-compose ps

docker-compose logs -f web

如此一來,資料庫的資料會保存在名為 db-data 的 volume 中,即使容器被刪除也不會流失。Compose 的常用指令還包括 docker-compose down(停止並移除網路與容器,但保留 volume)、docker-compose down -v(連同 volume 一起移除)等。

四、進入 Kubernetes:從單機容器到叢集編排

當你熟悉了 Docker 與 Compose,下一步自然是學習 Kubernetes。Kubernetes 是當今最成熟的容器編排平台,能夠自動處理容器調度、水平擴展、故障轉移與服務發現。本節將釐清 Kubernetes 的核心架構,並帶你在本機建立一個測試叢集。

1. Kubernetes 核心概念與架構

Kubernetes 叢集由一組機器(節點)組成,主要分為 Control Plane(控制平面)與 Worker Node(工作節點)。Control Plane 負責叢集的管理與 API 對外服務,主要元件包含:

  • kube-apiserver:提供 Kubernetes API,所有互動都經由它。
  • etcd:儲存叢集所有狀態的分散式鍵值庫。

  • kube-scheduler:將新建立的 Pod 排程到合適的工作節點。
  • kube-controller-manager:執行各種控制器,如 ReplicaSet、Deployment 等。
  • 每個工作節點則執行 kubelet(管理 Pod 生命週期)以及容器執行時期(例如 containerd)。在 Kubernetes 中,最基本的部署單位是 Pod,它可能包含一個或多個容器。我們通常不會直接操作 Pod,而是透過更高層的資源:

    Deployment:管理應用程式的聲明式更新、滾動升級、副本數。

    Service:提供 Pod 的穩定存取端點,內部可自動負載平衡。

    Ingress:管理叢集外部對服務的 HTTP/HTTPS 存取。

    ConfigMap / Secret:集中管理設定與敏感資料。

    2. 本機啟用 Kubernetes:Minikube vs kind

    在 2026 年,本機測試 Kubernetes 最熱門的兩種工具是 Minikube 與 kind(Kubernetes in Docker)。Minikube 會建立一個輕量虛擬機來執行單節點叢集,適合想要完整體驗 Kubernetes 而無需多台機器的教學場景。kind 則將整個 Kubernetes 叢集跑在 Docker 容器中,建置速度極快,特別適合 CI/CD 情境。

    選擇 Minikube 的安裝方式:

    # 以 Linux amd64 為例

    curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64

    sudo install minikube-linux-amd64 /usr/local/bin/minikube

    啟動單節點叢集,並指定 Docker 作為驅動

    minikube start --driver=docker

    確認狀態

    minikube status

    安裝 kubectl:

    curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

    chmod +x kubectl

    sudo mv kubectl /usr/local/bin/

    kubectl version --client

    現在你的本機已經有一個 Kubernetes 叢集了。試試看:

    kubectl get nodes

    kubectl get pods -A

    五、Docker 與 Kubernetes 整合實戰

    這一段是本文的重頭戲:將你先前用 Docker 建立的映像檔,部署到 Kubernetes 叢集,並讓它提供服務。我們會從建置映像、推送至 Container Registry,一路進行到 Deployment、Service、ConfigMap 與 Secret 的完整整合。

    1. 從 Docker 映像到 Kubernetes 部署

    首先,我們要將舊的映像檔標記並推送到 Docker Hub(或任何 Container Registry)。如果你還沒有帳號,請先到 Docker Hub 註冊一個。然後在終端機執行:

    # 使用你的 Docker Hub 使用者名稱

    docker tag my-node-app:1.0 yourusername/my-node-app:1.0

    docker login

    docker push yourusername/my-node-app:1.0

    推送到遠端 Registry 之後,就可以用 kubectl 直接建立 Deployment:

    kubectl create deployment my-node-app --image=yourusername/my-node-app:1.0 --replicas=3

    查看 Pods

    kubectl get pods

    這個指令會建立一個 Deployment 物件,自動創建三個 Pod。如果想要對外服務,還需要建立 Service:

    kubectl expose deployment my-node-app --type=NodePort --port=3000 --target-port=3000

    kubectl get service my-node-app

    如果是 Minikube 環境,可以直接用 minikube service my-node-app 開啟瀏覽器存取。

    2. 部署多層應用:完整 YAML 範例

    雖然 kubectl run 可以快速建立資源,但正式環境我們會將所有資源寫成 YAML,方便版本控制與變更管理。以先前的 Node.js 應用搭配 PostgreSQL 為例,我們在 Kubernetes 上需要兩個 Deployment 與兩個 Service。以下是一個完整範例(假設已存在名為 mydb-secret 與 app-config 的設定物件,後續會補上):

    # web-deployment.yaml

    apiVersion: apps/v1

    kind: Deployment

    metadata:

    name: web

    labels:

    app: web

    spec:

    replicas: 3

    selector:

    matchLabels:

    app: web

    template:

    metadata:

    labels:

    app: web

    spec:

    containers:

    • name: web

    image: yourusername/my-node-app:1.0

    ports:

    • containerPort: 3000

    env:

    • name: DB_HOST

    value: db-service

    • name: DB_USER

    valueFrom:

    secretKeyRef:

    name: mydb-secret

    key: username

    • name: DB_PASSWORD

    valueFrom:

    secretKeyRef:

    name: mydb-secret

    key: password

    resources:

    requests:

    memory: "128Mi"

    cpu: "100m"

    limits:

    memory: "256Mi"

    cpu: "200m"

    apiVersion: v1

    kind: Service

    metadata:

    name: web-service

    spec:

    selector:

    app: web

    ports:

    • protocol: TCP

    port: 80

    targetPort: 3000

    type: LoadBalancer

    # db-deployment.yaml

    apiVersion: apps/v1

    kind: Deployment

    metadata:

    name: db

    labels:

    app: db

    spec:

    replicas: 1

    selector:

    matchLabels:

    app: db

    template:

    metadata:

    labels:

    app: db

    spec:

    containers:

    • name: postgres

    image: postgres:16

    ports:

    • containerPort: 5432

    env:

    • name: POSTGRES_USER

    valueFrom:

    secretKeyRef:

    name: mydb-secret

    key: username

    • name: POSTGRES_PASSWORD

    valueFrom:

    secretKeyRef:

    name: mydb-secret

    key: password

    volumeMounts:

    • name: db-storage

    mountPath: /var/lib/postgresql/data

    resources:

    requests:

    memory: "256Mi"

    cpu: "100m"

    limits:

    memory: "512Mi"

    cpu: "200m"

    volumes:

    • name: db-storage

    persistentVolumeClaim:

    claimName: db-pvc

    apiVersion: v1

    kind: Service

    metadata:

    name: db-service

    spec:

    selector:

    app: db

    ports:

    • protocol: TCP

    port: 5432

    targetPort: 5432

    type: ClusterIP

    請將 web-deployment.yaml 與 db-deployment.yaml 儲存後,利用 kubectl apply -f 部署。此外還需要建立 PersistentVolumeClaim 與 ConfigMap/Secret,讓我們在下一節說明。

    3. 使用 ConfigMap 與 Secret 管理配置

    在上面的 YAML 中,我們引用了 mydb-secret,並可以直接用 kubectl create secret 建立:

    kubectl create secret generic mydb-secret \

    from-literal=username=postgres \

    from-literal=password=secret

    而配置非敏感資料則可以用 ConfigMap,例如將 Node.js 的環境變數 APP_MODE=production 放入:

    kubectl create configmap app-config --from-literal=APP_MODE=production

    若要在 Deployment 中使用 ConfigMap,範例如下:

    apiVersion: apps/v1

    kind: Deployment

    metadata:

    name: web

    spec:

    template:

    spec:

    containers:

    • name: web

    image: yourusername/my-node-app:1.0

    env:

    • name: APP_MODE

    valueFrom:

    configMapKeyRef:

    name: app-config

    key: APP_MODE

    這種設計讓你的映像檔完全無狀態,任何環境差異都由 Kubernetes 物件注入,正是 12-factor 應用提倡的精神。透過 Secret 與 ConfigMap,你不需要重新建置映像就能切換設定。

    六、進階部署技巧與 2026 新視野

    當你的應用成功在 Kubernetes 上運行後,下一個問題是:該如何讓它應付真實世界的流量?錯誤與延遲要怎麼監控?新興技術又將如何影響容器生態?本節將探討幾個關鍵進階主題。

    1. 資源管理與 HPA 自動擴展

    Kubernetes 內建的 HPA(Horizontal Pod Autoscaler)可以根據 CPU、記憶體或自訂指標自動調整 Pod 副本數。首先,你需要確定 Deployment 的每個 Pod 都有設定 requests 與 limits(如先前範例)。接著建立 HPA:

    kubectl autoscale deployment web --cpu-percent=50 --min=2 --max=10

    查看 HPA 狀態

    kubectl get hpa

    當 CPU 使用率超過 50% 時,Kubernetes 會自動增加 Pod 數量,最多到 10 個。這是雲端原生系統彈性最重要的體現。此外,2026 年的 Kubernetes 已內建更成熟的 KEDA(Kubernetes Event-driven Autoscaling),能整合 Kafka、RabbitMQ 等事件來源,讓自動擴展不只限於 CPU。

    2. 監控、日誌與安全實務

    生產環境中,你不可能總是手動 kubectl logs。一個成熟的監控堆疊通常包含:

  • Prometheus:抓取叢集指標(CPU、記憶體、網路、自訂 metrics)。
  • Grafana:提供視覺化儀表板。

    Loki / Elastic Stack:集中收集與查詢日誌。

    OpenTelemetry:進行分散式追蹤。

    在安全方面,2026 年已經有幾個不可忽視的趨勢。首先是「映像簽章」與「供應鏈安全」。使用 cosign 簽署你的容器映像,並在 Kubernetes 中透過策略引擎(如 Kyverno)要求所有映像必須有簽章才能部署。其次是「執行時期安全」,像是 Falco 這類工具可以偵測容器內的異常行為。最後,別忘了定期掃描映像漏洞,可使用 Trivy 或 Grype,並整合進 CI/CD pipeline。

    3. 新興趨勢:WASM、Kata Containers 與 AI 工作負載

    2026 年的容器世界正變得更多樣化。WebAssembly(WASM)因具備更快的啟動時間與更小的映像體積,開始被視為「輕量容器」的替代品。Kubernetes 現在可以透過 containerd 的 runtime class 同時管理傳統 Linux 容器與 Wasm 工作負載。例如,使用 wasmtime 的執行時期可以讓 Pod 以毫秒級速度啟動,特別適合 serverless 函式或邊緣運算。

    另一個發展是 Kata Containers,它結合了虛擬機的安全隔離與容器的靈活性,每幾個 Pod 運行在一個輕量虛擬機中,大幅強化多租戶安全。在 2026 年,Kata Containers 已成為高安全需求環境的熱門選擇。

    此外,AI/機器學習工作負載也大量以容器方式部署。Kubernetes 社群針對 GPU 資源調度、MIG(Multi-Instance GPU)切割以及 InfiniBand 網路支援都更加成熟。透過 Kubernetes 建立「Kubeflow」已成為機器學習工程師與 DevOps 合作的重要平台。

    七、結語:打造你的 2026 部署技能樹

    這篇從 Docker 入門一路到 Kubernetes 整合的指南,涵蓋了容器化部署的完整路徑。我們從傳統部署的困境看到容器的輕量與彈性,實際用 Dockerfile 打包應用,用 Compose 管理多容器,再進入 Kubernetes 學習 Pod、Deployment、Service 等核心基本元件。最後,透過完整的 YAML 整合範例與進階技巧,相信你已經具備了將 Docker 應用遷移到 Kubernetes 的基礎能力。

    但要真正成為容器化部署高手,光靠這一篇文章是不夠的。實際動手部署一個具有資料庫、快取、前端與後端的整合應用,並嘗試進行壓力測試、滾動更新與容錯演練,才是讓你技能昇華的關鍵。2026 年的容器生態正以驚人的速度進化,建議你持續關注 CNCF 的專案動態,並在社群中互相交流。

    感謝各位閱讀雅寶社區・頂客論壇的這篇教學,我們期待你的實踐經驗分享!

    💬 留言討論

    歡迎在下方留言,分享您的想法、心得或疑問。所有留言都會透過 GitHub 帳號 進行驗證。

    🏠 返回首頁