Docker for Backend & AI Engineers
Trang chủ / Module 10
🔁 Module 10 / 12 · 1 tuần

Docker trong CI/CD

Build/test/push image tự động trong pipeline, tận dụng cache trong CI, build đa nền tảng (multi-platform) với Buildx.

CI/CDGitHub ActionsBuildx
📌 Vì sao module này quan trọng

Build image thủ công trên máy cá nhân rồi push không đáng tin cậy và không thể audit — CI/CD hoá quy trình build là điều kiện bắt buộc cho bất kỳ hệ thống production nào, nối tiếp trực tiếp CI/CD đã học ở Module 13 khoá AI Engineer, Module 13 khoá Databricks, và Module 10 khoá Fine-tuning.

🎯 Mục tiêu học tập

  • Viết pipeline GitHub Actions build/test/push image Docker tự động
  • Tận dụng cache layer trong môi trường CI (vốn không có state giữa các lần chạy)
  • Sử dụng Docker Buildx để build image đa nền tảng (multi-platform, ví dụ amd64 + arm64)
  • Thiết lập cổng chặn chất lượng: test + scan bảo mật (Module 8) trước khi cho phép push

Pipeline GitHub Actions cơ bản

# .github/workflows/docker-build.yml
name: Build and Push Docker Image
on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run tests
        run: docker build --target test -t my-app:test .
      - run: docker run --rm my-app:test pytest

      - name: Log in to registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push
        uses: docker/build-push-action@v6
        with:
          push: true
          tags: |
            ghcr.io/my-org/my-app:${{ github.sha }}
            ghcr.io/my-org/my-app:latest
          cache-from: type=gha
          cache-to: type=gha,mode=max

Cache Layer trong CI — vấn đề & giải pháp

Mỗi lần chạy CI thường là một máy (runner) hoàn toàn mới — không có build cache cục bộ từ lần build trước như trên máy dev cá nhân (Module 2), khiến mọi lần build trong CI đều "cache miss" hoàn toàn nếu không cấu hình gì thêm. cache-from/cache-to với backend type=gha (GitHub Actions cache) lưu trữ layer cache giữa các lần chạy workflow — tăng tốc build CI đáng kể, đặc biệt hữu ích khi dependency (Module 2, 6, 7) không đổi thường xuyên.

Docker Buildx — Build đa nền tảng (Multi-platform)

Máy Mac Apple Silicon (arm64) và server cloud phổ biến (amd64/x86_64) có kiến trúc CPU khác nhau — image build trên máy này không tự chạy được trên kiến trúc kia. Buildx (dùng QEMU giả lập kiến trúc khác) cho phép build 1 image chứa sẵn cả 2 kiến trúc trong cùng 1 manifest, Docker tự chọn đúng bản khi pull tuỳ theo máy đang chạy:

docker buildx build \
    --platform linux/amd64,linux/arm64 \
    -t my-org/my-app:1.0.0 \
    --push .
💡 Khi nào cần

Nếu team dev dùng Mac Apple Silicon nhưng server production chạy amd64 (phổ biến với instance cloud truyền thống), luôn build multi-platform hoặc build riêng cho đúng kiến trúc production — image build trên Mac M-series không tự chạy được trên server amd64 nếu build đơn kiến trúc mặc định.

Cổng chặn chất lượng trước khi Push

Kết hợp các bước đã học thành 1 pipeline hoàn chỉnh, đúng tinh thần "test là cổng chặn deploy" đã áp dụng xuyên suốt 3 khoá học trước: build → chạy unit test bên trong container test → quét lỗ hổng bảo mật (Module 8, dùng Trivy làm bước CI, chặn nếu có CVE mức CRITICAL) → chỉ push lên registry (Module 9) khi mọi bước trên đều pass. Không bao giờ push thẳng image chưa qua kiểm tra lên registry mà pipeline production sẽ pull về.

🏋️ Bài tập thực hành

Pipeline CI/CD hoàn chỉnh cho Docker image

Thiết lập GitHub Actions cho 1 project đã container hoá ở Module 6/7: build → test → scan bảo mật (Trivy, chặn nếu có CVE CRITICAL) → push lên GHCR với tag kết hợp git SHA + latest, bật cache GitHub Actions để tăng tốc build. Thử tạo 1 PR có lỗi (test fail hoặc dependency có lỗ hổng đã biết) để xác nhận pipeline chặn đúng cách, không cho push.

📚 Tài nguyên học tập

✅ Tự đánh giá hoàn thành

  • Viết được pipeline GitHub Actions build/test/push image tự động
  • Cấu hình cache layer hoạt động đúng trong môi trường CI
  • Build được image multi-platform bằng Buildx khi cần
  • Pipeline có cổng chặn test + security scan trước khi cho phép push