在現代軟體開發中,Docker 和 Kubernetes 經常被同時提及,但它們解決的問題卻截然不同。 Docker 可以輕鬆地將應用程式打包到容器中。 Kubernetes 則負責將這些容器在多台伺服器上大規模執行,確保可靠性和自動化。
雖然我之前關於 Docker 和 Kubernetes 的文章只是作業的一部分,但它引發了我對 DevOps 領域以及 Docker 和 Kubernetes 的思考和好奇。由於之前使用過 Docker,這次研究確實拓寬了我的理解。
在本教程中,我們將:
使用 Docker 建立一個簡單的應用程式。
將容器映像推送到 Docker Hub(一個註冊表)。
在 Kubernetes 上部署應用程式。
擴大規模並探索 Kubernetes 如何管理它。
在這個過程中,我會解釋每個步驟,這樣您不僅可以複製命令,還可以真正了解正在發生的事情(這是我從與客戶合作時得到的反饋,客戶說我的文章缺乏技術深度,只是充滿了複製<=>貼上程式碼)。
在開始之前,請確保您已安裝以下內容:
要驗證,請在終端機上執行:
node -v
要驗證,請執行:
docker --version
要驗證,請執行:
kubectl version --client
Kubernetes 集群
或直接在 Docker Desktop 中啟用 Kubernetes。
我喜歡將 Docker Hub 視為容器映像的 GitHub。
我們將建立一個返回簡單訊息的 Node.js 應用程式。
mkdir docker-k8s-demo
cd docker-k8s-demo
在資料夾中,建立一個名為app.js
的檔案:
const http = require('http');
const port = 3000;
const requestHandler = (req, res) => {
res.end('Hello from Docker and Kubernetes!');
};
const server = http.createServer(requestHandler);
server.listen(port, () => {
console.log(`Server running on port ${port}`);
});
package.json
檔案: {
"name": "docker-k8s-demo",
"version": "1.0.0",
"main": "app.js",
"dependencies": {}
}
此時,我們有一個簡單的 Node.js 應用程式。
Dockerfile只是一個純文字檔案(沒有副檔名,通常名為Dockerfile
),用來告訴 Docker 如何建構映像。它位於專案的根目錄中。
Dockerfile
的檔案:# Start from the Node.js base image
FROM node:18-alpine
# Set working directory inside container
WORKDIR /usr/src/app
# Copy project files into container
COPY package*.json ./
COPY app.js ./
# Install dependencies
RUN npm install
# Expose the app’s port
EXPOSE 3000
# Start the app
CMD ["node", "app.js"]
docker build -t myapp:1.0 .
-t myapp:1.0
→ 將映像命名為myapp
,版本為1.0
。
.
表示「使用此目錄中的 Dockerfile」。
如果執行正確且成功,您應該在終端上看到這樣的成功訊息。
docker run -p 3000:3000 myapp:1.0
請造訪http://localhost:3000 。你應該看到:
Hello from Docker and Kubernetes!
Kubernetes 不會知道您的本地映像——它需要從註冊表中提取它。
docker login
您的終端上應該會看到這樣的成功訊息
docker tag myapp:1.0 your-username/myapp:1.0
docker push your-username/myapp:1.0
現在您的映像已在 Docker Hub 中公開,可供 Kubernetes 使用。
您在此螢幕截圖中看到“圖層已存在”,因為我之前曾執行過此命令,但由於網路延遲而執行失敗。
Kubernetes 部署需要一個 YAML 檔案來描述要執行的內容。
deployment.yaml
檔:apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: your-username/myapp:1.0
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer
應用它(在您的終端上執行):
kubectl apply -f deployment.yaml
檢查 pod:
kubectl get pods
此範例腳本建立了三個副本。在上一篇文章中,我解釋了什麼是副本以及它們與擴展問題的關係。
執行後,您應該會在終端機視窗中看到三個正在執行的 pod。
在您的終端機上,您應該會看到三個處於活動狀態並正在執行的 pod。
檢查服務:
kubectl get service myapp-service
minikube service myapp-service
這將在您的瀏覽器中打開該應用程式。
在上面的範例中,我們擴展到了三個副本。隨著系統或應用程式的成長,需要更多的副本或實例才能有效地滿足需求。
透過執行此命令並輸入每次所需的副本數量,可以輕鬆完成此操作。
kubectl scale deployment myapp-deployment --replicas=5
Kubernetes 將自動啟動另外兩個 pod。
這個工作流程——使用 Docker 建置,使用 Kubernetes 部署——是雲端原生應用程式的基礎。 Docker 確保跨環境的一致性,而 Kubernetes 則確保生產環境中的可靠性。
💡喜歡這篇文章嗎?快來留言交流吧!
我很想聽聽您的想法和回饋。
我也願意就技術文章、文件或白皮書進行合作! 🚀
原文出處:https://dev.to/dumebii/from-docker-to-kubernetes-how-containers-go-from-local-to-cloud-37m1