Giới thiệu
Trong phát triển phần mềm hiện đại, Docker và Kubernetes thường được nhắc đến cùng nhau. Tuy nhiên, chúng giải quyết những vấn đề khác nhau. Docker giúp đóng gói ứng dụng vào các container, trong khi Kubernetes quản lý và chạy các container đó một cách tự động và đáng tin cậy trên nhiều máy chủ. Bài viết này sẽ hướng dẫn bạn cách đưa ứng dụng từ môi trường phát triển cục bộ lên đám mây bằng Kubernetes.
Mục tiêu
Trong hướng dẫn này, chúng ta sẽ thực hiện các bước sau:
- Xây dựng một ứng dụng đơn giản bằng Docker.
- Đẩy hình ảnh container lên Docker Hub (một kho lưu trữ).
- Triển khai ứng dụng trên Kubernetes.
- Mở rộng nó và khám phá cách Kubernetes quản lý ứng dụng.
Các yêu cầu trước khi bắt đầu
Trước khi bắt đầu, bạn cần cài đặt những công cụ sau:
- Node.js phiên bản mới nhất.
- Để kiểm tra, hãy chạy lệnh sau trong terminal:
node -v - Docker Desktop (hoặc Docker Engine).
- Để kiểm tra, hãy chạy:
docker --version - Kubectl (CLI của Kubernetes).
- Để kiểm tra, hãy chạy:
kubectl version --client - Một cụm Kubernetes.
- Người mới có thể sử dụng Minikube (cụm cục bộ).
- Hoặc kích hoạt Kubernetes trực tiếp trong Docker Desktop.
- Tài khoản Docker Hub (miễn phí).
Tôi thích nghĩ rằng Docker Hub giống như GitHub cho các hình ảnh container.
Tạo một ứng dụng Node.js đơn giản
Chúng ta sẽ tạo một ứng dụng Node.js đơn giản trả về một thông điệp.
Tạo thư mục dự án:
bash
mkdir docker-k8s-demo
cd docker-k8s-demo
Tạo file app.js:
javascript
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}`);
});
Tạo file package.json:
json
{
"name": "docker-k8s-demo",
"version": "1.0.0",
"main": "app.js",
"dependencies": {}
}
Tại thời điểm này, chúng ta đã có một ứng dụng Node.js đơn giản.
Viết Dockerfile
Dockerfile là một tệp văn bản đơn giản (không có phần mở rộng, thường được đặt tên là Dockerfile) cho biết Docker cách xây dựng một hình ảnh. Nó nằm ở thư mục gốc của dự án.
Tạo file Dockerfile:
dockerfile
# Bắt đầu từ hình ảnh cơ bản Node.js
FROM node:18-alpine
# Đặt thư mục làm việc bên trong container
WORKDIR /usr/src/app
# Sao chép các tệp dự án vào container
COPY package*.json ./
COPY app.js ./
# Cài đặt các phụ thuộc
RUN npm install
# Mở cổng ứng dụng
EXPOSE 3000
# Khởi động ứng dụng
CMD ["node", "app.js"]
Xây dựng hình ảnh:
bash
docker build -t myapp:1.0 .
-t myapp:1.0→ đặt tên cho hình ảnh làmyappvới phiên bản1.0..có nghĩa là “sử dụng Dockerfile trong thư mục này.”
Nếu lệnh này chạy thành công, bạn sẽ thấy thông báo thành công trên terminal.
Chạy container Docker:
bash
docker run -p 3000:3000 myapp:1.0
Truy cập http://localhost:3000. Bạn sẽ thấy:
Hello from Docker and Kubernetes!
Đẩy hình ảnh lên Docker Hub
Kubernetes sẽ không biết về hình ảnh cục bộ của bạn—nó cần lấy nó từ một kho lưu trữ.
Đăng nhập vào Docker Hub:
bash
docker login
Bạn nên thấy thông báo thành công trên terminal.
Gán nhãn hình ảnh của bạn với tên người dùng Docker Hub:
bash
docker tag myapp:1.0 your-username/myapp:1.0
Đẩy hình ảnh lên:
bash
docker push your-username/myapp:1.0
Bây giờ hình ảnh của bạn đã công khai trên Docker Hub, sẵn sàng cho Kubernetes.
Triển khai trên Kubernetes
Một triển khai Kubernetes cần một tệp YAML mô tả những gì cần chạy.
Tạo deployment.yaml:
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
Áp dụng (chạy trên terminal):
bash
kubectl apply -f deployment.yaml
Kiểm tra các pod:
bash
kubectl get pods
Bạn sẽ thấy ba pod đang chạy trong cửa sổ terminal của bạn.
Kiểm tra dịch vụ:
bash
kubectl get service myapp-service
- Nếu sử dụng Docker Desktop hoặc Kubernetes trên đám mây, bạn sẽ nhận được một IP bên ngoài.
- Nếu sử dụng Minikube:
bash
minikube service myapp-service
Điều này sẽ mở ứng dụng trong trình duyệt của bạn.
Mở rộng ứng dụng với Kubernetes
Trong ví dụ trên, chúng ta đã mở rộng lên ba bản sao. Khi một hệ thống hoặc ứng dụng phát triển, cần nhiều bản sao hoặc phiên bản của nó hơn để có thể mở rộng hiệu quả với nhu cầu. Điều này có thể được thực hiện dễ dàng bằng cách chạy lệnh sau với số lượng bản sao bạn cần:
bash
kubectl scale deployment myapp-deployment --replicas=5
Kubernetes sẽ tự động tạo thêm hai pod nữa.
Kết luận
Quy trình này—xây dựng bằng Docker, triển khai bằng Kubernetes—là nền tảng của các ứng dụng cloud-native. Docker đảm bảo tính nhất quán giữa các môi trường, và Kubernetes đảm bảo độ tin cậy trong sản xuất.
💡 Thích bài viết này? Hãy kết nối với tôi!
- 🔗 Kết nối với tôi trên LinkedIn
- 📧 Gửi email cho tôi
Tôi rất muốn nghe ý kiến và phản hồi của bạn. Tôi cũng rất mở lòng cho các hợp tác về bài viết kỹ thuật, tài liệu hoặc các bài báo white paper!