0
0
Lập trình
Sơn Tùng Lê
Sơn Tùng Lê103931498422911686980

Danh Sách Kiểm Tra Triển Khai Không Thất Bại với Docker & Nginx

Đăng vào 6 tháng trước

• 5 phút đọc

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-slim hoặc node: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 Copy
# 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.
  • latest chỉ 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 Copy
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_stage cho 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 Copy
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 Copy
- 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 Copy
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

  1. 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.
  2. 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.
  3. Chuyển lưu lượng – Thêm tiêu đề X-Deploy-Stage: green vào tất cả các yêu cầu đến (hoặc thay đổi mặc định bản đồ Nginx).
  4. 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.
  5. 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 Copy
# 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 commit trong 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.3 và 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.md trong 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.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào