Giới Thiệu
Triển khai không thất bại không còn là một điều xa xỉ; nó đã trở thành một yêu cầu cơ bản cho các dịch vụ hiện đại. Là một người dẫn dắt DevOps, bạn có thể đang phải xử lý các container Docker, cấu hình reverse proxy Nginx và một pipeline CI/CD phải luôn hoạt động ổn định ngay cả khi bạn triển khai mã mới. Danh sách kiểm tra này sẽ hướng dẫn bạn qua các bước thực tế để đạt được việc triển khai liền mạch mà không làm giảm khả năng quan sát hoặc bảo mật.
1. Chuẩn Bị Hình Ảnh Docker
a. Hình Ảnh Cơ Sở Bất Biến
- Sử dụng hình ảnh cơ sở tối thiểu, có phiên bản cố định (ví dụ:
python:3.11-slimhoặcnode:20-alpine). - Chạy lệnh
docker history <image>để xác minh không có lớp không cần thiết nào.
b. Xây Dựng Đa Giai Đoạn
dockerfile
# Giai đoạn 1 – Xây dựng
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci && npm run build
# Giai đoạn 2 – Thời gian chạy
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
- Giữ cho hình ảnh cuối cùng gọn nhẹ, giảm bề mặt tấn công và tăng tốc độ tải xuống.
c. Chiến Lược Gán Nhãn
- Gán nhãn phiên bản ngữ nghĩa:
myapp:1.4.2. latestchỉ trỏ đến phiên bản ổn định gần nhất.- Lưu nhãn
git SHAđể dễ truy nguyên:LABEL commit="$(git rev-parse --short HEAD)".
2. Nginx như một Bộ Định Tuyến Thông Minh
a. Khối Upstream cho Blue-Green
nginx
upstream myapp_blue {
server 10.0.1.10:80;
server 10.0.1.11:80;
}
upstream myapp_green {
server 10.0.2.10:80;
server 10.0.2.11:80;
}
map $http_x_deploy_stage $upstream {
default myapp_blue;
"green" myapp_green;
}
server {
listen 80;
location / {
proxy_pass http://$upstream;
proxy_set_header Host $host;
}
}
- Tiêu đề
$http_x_deploy_stagecho phép bạn chuyển đổi lưu lượng với một lệnh curl đơn giản.
b. Kiểm Tra Sức Khỏe
nginx
location /health {
proxy_pass http://myapp_blue/health;
proxy_next_upstream error timeout invalid_header http_500;
proxy_connect_timeout 2s;
proxy_read_timeout 2s;
}
- Nginx sẽ tự động ngừng gửi lưu lượng đến các container không khỏe mạnh.
3. Rào Cản Pipeline CI/CD
| Giai đoạn | Công cụ | Cài đặt Chính |
|---|---|---|
| Xây dựng | GitHub Actions / GitLab CI | Lưu cache node_modules hoặc pip wheels, thất bại nếu có lỗi lint |
| Kiểm tra | Jest / PyTest | Chạy trong các container song song, buộc ≥80% độ phủ |
| Xuất bản | Docker Hub / ECR | Sử dụng docker push $IMAGE:$TAG, ký hình ảnh với Notary |
| Triển khai | Argo CD / Spinnaker | Triển khai vào blue trước, chạy kiểm tra khói, sau đó chuyển lưu lượng |
a. Kiểm Tra Khói Tự Động
yaml
- name: Kiểm tra khói blue
run: |
curl -sSf http://myapp.example.com/health || exit 1
- Nếu kiểm tra khói thất bại, dừng việc chuyển đổi lưu lượng.
b. Tự Động Hoá Quá Trình Rollback
- Lưu nhãn hình ảnh trước đó trong một kho KV (ví dụ: Consul).
- Một script rollback đơn giản:
bash
PREV=$(consul kv get myapp/prev_tag)
docker pull myrepo/myapp:$PREV
docker tag myrepo/myapp:$PREV myrepo/myapp:current
# Kích hoạt triển khai lại vào blue
curl -X POST -H "X-Deploy-Stage: blue" https://ci.example.com/deploy
4. Quy Trình Chuyển Đổi Blue-Green
- Triển khai vào Green – Đẩy hình ảnh mới, cập nhật upstream green và chạy kiểm tra khói.
- Xác thực – Kiểm tra nhật ký, số liệu và quy trình end-to-end trong một tên miền staging.
- Chuyển lưu lượng – Thêm tiêu đề
X-Deploy-Stage: greenvào tất cả các yêu cầu đến (hoặc thay đổi mặc định bản đồ Nginx). - Giám sát – Theo dõi tỷ lệ lỗi, độ trễ và mức sử dụng tài nguyên trong ít nhất 5 phút.
- Ngừng hoạt động Blue – Giảm kết nối, dừng các container và tùy chọn xóa hình ảnh cũ.
Chuyển Đổi CLI Nhanh
bash
# Chuyển toàn bộ lưu lượng sang green
curl -X POST -H "X-Deploy-Stage: green" https://myapp.example.com/__internal__/toggle
- Điểm cuối nội bộ cập nhật bản đồ Nginx mà không cần tải lại toàn bộ.
5. Quan Sát & Ghi Nhật Ký
a. Nhật Ký Tập Trung
- Gửi stdout/stderr của Docker đến Loki hoặc Elastic qua Fluent Bit.
- Bao gồm nhãn
committrong mỗi dòng nhật ký để dễ dàng liên kết.
b. Số Liệu
- Xuất số liệu Prometheus từ Nginx (
nginx-prometheus-exporter). - Theo dõi
http_requests_total,http_request_duration_seconds, vànginx_upstream_response_time.
c. Cảnh Báo
- Cảnh báo khi có sự gia tăng > 5% trong các phản hồi 5xx sau khi chuyển lưu lượng.
- Sử dụng PagerDuty hoặc Opsgenie để leo thang cho nhân viên trực.
6. Danh Sách Kiểm Tra Bảo Mật
- Quét Hình Ảnh – Chạy Trivy hoặc Clair trên mỗi build; thất bại nếu có CVE > 7.
- Container Quyền Tối Thiểu – Bỏ
CAP_NET_RAW, chạy không phải root (USER 1001). - Kết Thúc TLS – Để Nginx xử lý TLS; buộc sử dụng
TLSv1.3và các cipher mạnh. - Củng Cố Tiêu Đề – Thêm
Content-Security-Policy,X-Content-Type-Options,Strict-Transport-Security.
7. Vệ Sinh Sau Triển Khai
- Di Chuyển Cơ Sở Dữ Liệu – Chạy chúng trước khi triển khai green, sử dụng chiến lược không thất bại (thêm cột, điền lại, sau đó chuyển đổi truy vấn).
- Xóa Cache – Nếu bạn sử dụng Redis, phiên bản khóa (
v2:user:123) để tránh đọc dữ liệu cũ. - Tài Liệu – Giữ một
deploy.mdtrong repo ghi lại các bước chính xác và kế hoạch rollback.
Kết Luận
Đạt được việc triển khai không thất bại với Docker và Nginx là một quy trình kỷ luật: hình ảnh bất biến, định tuyến Nginx thông minh, pipeline CI/CD được bảo vệ, khả năng quan sát đầy đủ và một kế hoạch rollback vững chắc. Hãy làm theo danh sách kiểm tra này cho mỗi phiên bản, và bạn sẽ giảm thiểu rủi ro trong khi giữ cho người dùng của bạn không nhận thấy bất kỳ thay đổi bên dưới nào.
Nếu bạn cần trợ giúp trong việc triển khai này, đội ngũ tại Ramer Labs có thể giúp bạn.