Giới thiệu
Triển khai không gián đoạn là một yêu cầu không thể thương lượng cho các dịch vụ hiện đại. Là một trưởng nhóm DevOps, bạn có thể đã thấy các đợt tăng đột biến lưu lượng, các khiếu nại của người dùng và những lần khôi phục gấp rút khi một bản phát hành mới làm ngừng ứng dụng. Danh sách kiểm tra này sẽ hướng dẫn bạn qua một quy trình làm việc tập trung vào Docker, kết hợp với Nginx như một reverse-proxy để đạt được các bản cập nhật liền mạch mà không làm gián đoạn người dùng.
✅ Danh sách kiểm tra
| ✅ | Bước | Tại sao nó quan trọng |
|---|---|---|
| 1 | Phiên bản hóa hình ảnh Docker | Đảm bảo bạn có thể khôi phục ngay lập tức. |
| 2 | Sử dụng multi-stage builds | Giữ cho hình ảnh nhỏ và nhanh chóng để kéo. |
| 3 | Chạy Nginx trước các container ứng dụng | Cho phép định tuyến lưu lượng mà không cần chạm vào ứng dụng. |
| 4 | Thực hiện chiến lược triển khai blue-green | Đổi lưu lượng ở cấp độ proxy, không phải các container. |
| 5 | Kiểm tra tình trạng dịch vụ | Ngăn chặn các bản phát hành xấu không bao giờ thấy lưu lượng. |
| 6 | Tận dụng Docker Compose hoặc Swarm cho việc điều phối | Đơn giản hóa định nghĩa dịch vụ và mở rộng. |
| 7 | Ghi lại và theo dõi quá trình chuyển đổi | Mang lại sự tự tin và khôi phục nhanh chóng nếu cần. |
Dưới đây chúng ta sẽ mở rộng từng mục với các lệnh và đoạn cấu hình cụ thể.
1. Phiên bản Hóa Hình Ảnh Docker
Gán nhãn cho các bản build của bạn với cả phiên bản ngữ nghĩa và một SHA git ngắn. Điều này giúp việc khôi phục trở nên dễ dàng chỉ với một lệnh docker pull.
# Xây dựng và gán nhãn
DOCKER_REPO=myorg/api
VERSION=1.4.2
SHA=$(git rev-parse --short HEAD)
docker build -t $DOCKER_REPO:$VERSION-$SHA .
docker push $DOCKER_REPO:$VERSION-$SHA
Khi bạn cần quay lại, chỉ cần kéo nhãn trước đó và triển khai lại.
2. Dockerfile Nhiều Giai Đoạn
Một hình ảnh gọn nhẹ giảm thời gian kéo, điều này rất quan trọng cho các lần chuyển đổi không gián đoạn.
# ---- Giai đoạn xây dựng ----
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# ---- Giai đoạn chạy ----
FROM node:20-alpine AS runtime
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./
RUN npm ci --production
CMD ["node", "dist/index.js"]
Hình ảnh cuối cùng chỉ chứa mã đã biên dịch và các phụ thuộc sản xuất.
3. Nginx như một Reverse Proxy
Chạy Nginx trong một container riêng cho phép bạn thay đổi các máy chủ upstream mà không cần chạm vào các container ứng dụng.
# /etc/nginx/conf.d/upstream.conf
upstream api_backend {
# Placeholder – sẽ được thay thế bởi Docker compose tại thời điểm triển khai
server api_blue:3000;
server api_green:3000;
}
server {
listen 80;
location / {
proxy_pass http://api_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
api_backend có thể chỉ đến một trong hai cụm container blue hoặc green.
4. Quy Trình Triển Khai Blue-Green
- Triển khai phiên bản mới là
api_greentrong khiapi_bluetiếp tục phục vụ lưu lượng. - Chạy các kiểm tra sức khỏe đối với
api_green(ví dụ:/health). - Cập nhật Nginx upstream chỉ trỏ đến
api_green. - Tải lại Nginx (
docker exec nginx nginx -s reload). - Theo dõi lỗi. Nếu có gì sai, quay lại upstream về
api_blue.
Ví dụ về Docker-Compose
version: "3.8"
services:
nginx:
image: nginx:stable-alpine
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d:ro
depends_on:
- api_blue
- api_green
api_blue:
image: myorg/api:1.4.2-ab12cd
environment:
- NODE_ENV=production
deploy:
replicas: 2
api_green:
image: myorg/api:1.4.3-ef34gh
environment:
- NODE_ENV=production
deploy:
replicas: 2
Khi cụm xanh vượt qua các bài kiểm tra sức khỏe, bạn chỉ cần chỉnh sửa upstream.conf để thay thế api_blue bằng api_green và tải lại Nginx.
5. Kiểm Tra Tình Trạng
Docker Swarm và Compose hỗ trợ các chỉ thị healthcheck. Định nghĩa một cái mà truy cập một endpoint trả về 200 chỉ khi ứng dụng đã sẵn sàng.
api_green:
image: myorg/api:1.4.3-ef34gh
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 10s
timeout: 5s
retries: 3
Chỉ sau khi container báo cáo healthy, bạn mới nên nâng cấp nó trong Nginx.
6. Điều Phối với Docker Compose / Swarm
Sử dụng một tệp docker-compose.yml duy nhất giữ cho toàn bộ ngăn xếp được kiểm soát phiên bản. Đối với sản xuất, bạn có thể khởi động nó bằng:
docker stack deploy -c docker-compose.yml prod
Swarm sẽ xử lý các bản cập nhật cuộn, nhưng bạn vẫn giữ quyền kiểm soát thủ công đối với việc chuyển đổi proxy, mang lại cho bạn mạng lưới an toàn của một bản phát hành blue-green thực sự.
7. Ghi Chép & Quan Sát
Kết nối các nhật ký truy cập của Nginx và stdout của container vào một hệ thống tập trung (ví dụ: Loki, Datadog hoặc CloudWatch). Một lệnh docker logs nhanh chóng rất hữu ích cho việc gỡ lỗi, nhưng đối với sản xuất, bạn muốn có các nhật ký có cấu trúc.
# Ví dụ: theo dõi cả nhật ký Nginx và API xanh trong một pane
docker-compose logs -f nginx api_green
Thiết lập cảnh báo về tỷ lệ lỗi tăng vọt sau mỗi lần chuyển đổi. Nếu tỷ lệ lỗi vượt quá ngưỡng trong năm phút đầu tiên, tự động quay lại upstream.
Thưởng: Di Chuyển Cơ Sở Dữ Liệu Không Gián Đoạn
Trong khi Docker xử lý lớp ứng dụng, các thay đổi lược đồ vẫn có thể gây ra sự cố. Sử dụng một công cụ di chuyển chạy ngoài băng (ví dụ: Flyway hoặc Prisma) trước khi các container xanh bắt đầu phục vụ lưu lượng. Bằng cách này, cơ sở dữ liệu đã ở trạng thái mong đợi khi chuyển đổi xảy ra.
Kết luận
Đạt được triển khai không gián đoạn với Docker và Nginx phụ thuộc vào việc phiên bản hóa hình ảnh một cách có kỷ luật, một reverse-proxy sạch sẽ và một việc chuyển đổi blue-green được kiểm soát. Hãy làm theo danh sách kiểm tra, tự động hóa các kiểm tra sức khỏe và giữ cho quan sát chặt chẽ, bạn sẽ hiếm khi thấy sự gián đoạn có thể nhìn thấy từ người dùng.
Nếu bạn cần trợ giúp trong việc triển khai điều này, đội ngũ tại RamerLabs có thể giúp bạn.