Docker 和 Kubernetes (K8s) 是一對強大的組合,能幫你高效地管理容器化應用。下面我通過一個具體示例,帶你瞭解從構建鏡像到部署應用的完整流程。
為了讓你快速把握全局,下表概括了使用 Docker 和 Kubernetes 的核心步驟:
|
階段 |
核心任務
|
關鍵命令/文件
|
説明
|
|
1. 應用容器化 |
編寫 Dockerfile,構建鏡像 |
|
將應用代碼和依賴打包成可移植的 Docker 鏡像。 |
|
2. 運行測試 |
本地運行容器 |
|
在本地驗證鏡像能否正常工作。 |
|
3. 定義編排 |
創建 K8s Deployment 配置文件 |
|
聲明應用的期望狀態,如副本數、鏡像版本等。 |
|
4. 部署應用 |
應用配置到 K8s 集羣 |
|
K8s 會根據配置自動創建並管理 Pod(一個或多個容器)。 |
|
5. 暴露服務 |
創建 K8s Service |
|
為 Pod 提供固定的訪問入口,實現負載均衡和服務發現。 |
|
6. 運維管理 |
監控、擴縮容、更新 |
|
查看應用狀態,調整副本數量,或滾動更新到新版本。 |
🐳 第一步:使用 Docker 打包應用
首先,我們需要將應用程序及其環境打包成一個 Docker 鏡像。
- 編寫 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 端口,但這並不會自動映射到主機。
- 構建 Docker 鏡像:在
Dockerfile所在目錄執行以下命令,-t參數為鏡像打上標籤。
docker build -t my-node-app:1.0 .
- 本地測試鏡像:運行容器,將本地的 3000 端口映射到容器的 3000 端口。
docker run -d -p 3000:3000 my-node-app:1.0
訪問 http://localhost:3000,確認應用運行正常。
☸️ 第二步:使用 Kubernetes 部署應用
接下來,我們使用 Kubernetes 來編排和管理這個容器。
- 創建 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 中最小的可部署單元。
- 創建 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 # 如果是雲服務商,會創建一個外部負載均衡器
- 部署到 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) 來管理有狀態應用的數據。 - 關注安全和配置:瞭解
ConfigMap和Secret來管理應用配置和敏感信息,並學習 RBAC(基於角色的訪問控制)來加強集羣安全。 - 利用官方文檔:Docker 和 Kubernetes 的官方文檔是最好、最權威的學習資源。