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 提供了一個宣告式方式,用一份 YAML 檔案定義並管理多個容器。接下來我們將建立一個「Web + PostgreSQL」的範例。
假設你在開發一個待辦事項 API,它需要連接 PostgreSQL,你可能還要一個 Redis 作為快取。如果只用 docker run,你必須依序下達多條指令,還要設定網路、環境變數、volume,非常繁瑣。Compose 讓你可以把整個服務堆疊寫在一個 docker-compose.yml 檔案中,並用docker compose up 一條指令啟動所有服務。
在 2026 年,Compose 已不只是本機開發的工具,雲端環境如 AWS ECS 也支援 Compose 規格。因此熟練 Compose 對後續銜接 Kubernetes 非常有幫助,因為兩者都使用 YAML 描述基礎設施。
我們沿用上面的 Node.js 應用,但加入資料庫,並透過 Dockerfile 來建置 Web 服務。請先建立一個 docker-compose.yml:
db:
接著在 app.js 中讀取這些環境變數,建立 PostgreSQL 連線。這裡為了示範簡潔,可以只用環境變數列印出來,或使用 pg 套件存取。執行以下指令:
如此一來,資料庫的資料會保存在名為 db-data 的 volume 中,即使容器被刪除也不會流失。Compose 的常用指令還包括 docker-compose down(停止並移除網路與容器,但保留 volume)、docker-compose down -v(連同 volume 一起移除)等。
當你熟悉了 Docker 與 Compose,下一步自然是學習 Kubernetes。Kubernetes 是當今最成熟的容器編排平台,能夠自動處理容器調度、水平擴展、故障轉移與服務發現。本節將釐清 Kubernetes 的核心架構,並帶你在本機建立一個測試叢集。
Kubernetes 叢集由一組機器(節點)組成,主要分為 Control Plane(控制平面)與 Worker Node(工作節點)。Control Plane 負責叢集的管理與 API 對外服務,主要元件包含:
每個工作節點則執行 kubelet(管理 Pod 生命週期)以及容器執行時期(例如 containerd)。在 Kubernetes 中,最基本的部署單位是 Pod,它可能包含一個或多個容器。我們通常不會直接操作 Pod,而是透過更高層的資源:
在 2026 年,本機測試 Kubernetes 最熱門的兩種工具是 Minikube 與 kind(Kubernetes in Docker)。Minikube 會建立一個輕量虛擬機來執行單節點叢集,適合想要完整體驗 Kubernetes 而無需多台機器的教學場景。kind 則將整個 Kubernetes 叢集跑在 Docker 容器中,建置速度極快,特別適合 CI/CD 情境。
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
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 帳號 進行驗證。