Docker 和 Kubernetes (K8s) 是一對強大的組合,能幫你高效地管理容器化應用。下面我通過一個具體示例,帶你瞭解從構建鏡像到部署應用的完整流程。

為了讓你快速把握全局,下表概括了使用 Docker 和 Kubernetes 的核心步驟:

階段

核心任務

關鍵命令/文件

説明

1. 應用容器化

編寫 Dockerfile,構建鏡像

Dockerfile, docker build -t my-app .

將應用代碼和依賴打包成可移植的 Docker 鏡像。

2. 運行測試

本地運行容器

docker run -p 3000:3000 my-app

在本地驗證鏡像能否正常工作。

3. 定義編排

創建 K8s Deployment 配置文件

deployment.yaml

聲明應用的期望狀態,如副本數、鏡像版本等。

4. 部署應用

應用配置到 K8s 集羣

kubectl apply -f deployment.yaml

K8s 會根據配置自動創建並管理 Pod(一個或多個容器)。

5. 暴露服務

創建 K8s Service

service.yaml, kubectl apply -f service.yaml

為 Pod 提供固定的訪問入口,實現負載均衡和服務發現。

6. 運維管理

監控、擴縮容、更新

kubectl get pods, kubectl scale deployment

查看應用狀態,調整副本數量,或滾動更新到新版本。

🐳 第一步:使用 Docker 打包應用

首先,我們需要將應用程序及其環境打包成一個 Docker 鏡像。

  1. 編寫 Dockerfile:創建一個名為 Dockerfile的文件(無後綴名),它定義瞭如何構建鏡像。
# 使用官方Node.js運行時作為基礎鏡像
FROM node:14-alpine
# 在容器內設置工作目錄
WORKDIR /app
# 將package.json和package-lock.json複製到工作目錄
COPY package*.json ./
# 安裝應用依賴
RUN npm install
# 將應用源代碼複製到工作目錄
COPY . .
# 應用運行端口
EXPOSE 3000
# 定義啓動命令
CMD ["npm", "start"]
  • FROM:指定基礎鏡像,這裏是輕量版的 Node.js 14 環境。
  • COPY:分兩次複製文件,先複製依賴列表文件(package.json),安裝依賴。這能利用 Docker 的緩存機制,避免源代碼變動時重複安裝依賴。
  • EXPOSE:告知容器運行時將監聽 3000 端口,但這並不會自動映射到主機。
  1. 構建 Docker 鏡像:在 Dockerfile所在目錄執行以下命令,-t參數為鏡像打上標籤。
docker build -t my-node-app:1.0 .
  1. 本地測試鏡像:運行容器,將本地的 3000 端口映射到容器的 3000 端口。
docker run -d -p 3000:3000 my-node-app:1.0

訪問 http://localhost:3000,確認應用運行正常。

☸️ 第二步:使用 Kubernetes 部署應用

接下來,我們使用 Kubernetes 來編排和管理這個容器。

  1. 創建 Deployment 配置:創建一個名為 my-app-deployment.yaml的文件。Deployment 是 K8s 中管理應用部署的核心對象。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-node-app
spec:
  replicas: 3  # 指定希望運行的Pod副本數量
  selector:
    matchLabels:
      app: my-node-app
  template:
    metadata:
      labels:
        app: my-node-app
    spec:
      containers:
      - name: my-node-app
        image: my-node-app:1.0  # 使用我們剛才構建的鏡像
        ports:
        - containerPort: 3000  # 容器暴露的端口
  • replicas: 3:K8s 會確保始終有 3 個 Pod 實例在運行,提供了基本的容錯能力。
  • template:定義了每個 Pod 的藍圖,Pod 是 K8s 中最小的可部署單元。
  1. 創建 Service 配置:再創建一個名為 my-app-service.yaml的文件。Service 為一組 Pod 提供統一的訪問入口。
apiVersion: v1
kind: Service
metadata:
  name: my-node-app-service
spec:
  selector:
    app: my-node-app  # 選擇標籤為app: my-node-app的Pod
  ports:
    - protocol: TCP
      port: 80        # Service對外暴露的端口
      targetPort: 3000 # 將請求轉發到Pod的3000端口
  type: LoadBalancer  # 如果是雲服務商,會創建一個外部負載均衡器
  1. 部署到 Kubernetes 集羣
  • 確保你有一個可用的 K8s 集羣(如使用 Minikube 本地搭建,或在雲服務商創建)。
  • 使用 kubectl命令應用配置:
# 部署Deployment
kubectl apply -f my-app-deployment.yaml
# 部署Service
kubectl apply -f my-app-service.yaml

🔍 第三步:檢查與管理應用

部署完成後,你需要一些命令來與你的應用和 K8s 集羣交互。

  • 查看 Pod 狀態:檢查 Pod 是否已成功創建並處於 Running狀態。
kubectl get pods
  • 查看 Deployment:檢查 Deployment 是否創建了期望數量的 Pod 副本。
kubectl get deployments
  • 查看 Service 並訪問應用:獲取 Service 的外部訪問地址。
# 如果使用Minikube,可能需要運行以下命令來獲取訪問URL
    minikube service my-node-app-service --url

訪問返回的 URL 即可看到應用。

  • 擴展應用實例:如果需要處理更多流量,可以輕鬆地將 Pod 副本數從 3 個擴展到 5 個。
kubectl scale deployment my-node-app --replicas=5
  • 查看應用日誌:當需要排查問題時,查看 Pod 的日誌非常有用。
kubectl logs <pod-name>
  • 滾動更新應用:當你修改了應用代碼並構建了新鏡像(如 my-node-app:2.0)後,可以更新 Deployment 的鏡像版本,K8s 會以滾動方式逐步更新 Pod,確保服務不中斷。
kubectl set image deployment/my-node-app my-node-app=my-node-app:2.0

💡 進階學習建議

要更深入地掌握 Docker 和 Kubernetes,你可以:

  • 學習 Docker Compose:用於在本地定義和運行多容器應用,非常適合開發環境的服務編排。
  • 理解 K8s 持久化存儲:學習如何使用 PersistentVolume(PV) 和 PersistentVolumeClaim(PVC) 來管理有狀態應用的數據。
  • 關注安全和配置:瞭解 ConfigMapSecret來管理應用配置和敏感信息,並學習 RBAC(基於角色的訪問控制)來加強集羣安全。
  • 利用官方文檔:Docker 和 Kubernetes 的官方文檔是最好、最權威的學習資源。