Docker trong CI/CD Pipeline

Photo of author

Văn Ngọc Tân

Bạn có biết? Mỗi lần commit code, bạn phải build, test, rồi deploy thủ công? Ngày mai deploy 10 lần, mỗi lần phải làm same steps: build → test → push image → pull → restart container. Công việc này nhanh chóng trở nên nhàm chán và dễ sai sót!

Đây chính là lý do Docker trong CI/CD Pipeline ra đời — tự động hóa toàn bộ quy trình từ code commit đến production deployment.

Tại sao dùng Docker trong CI/CD?

  • Môi trường nhất quán — Same environment từ dev đến prod
  • Isolation — Mỗi pipeline run chạy trong container riêng
  • Reproduction — Dễ dàng tái tạo lỗi
  • Tốc độ — Cache Docker layers, build nhanh
CI/CD Pipeline workflow diagram — code commit, build, test, deploy stages
CI/CD Pipeline với Docker: từ commit đến production hoàn toàn tự động

GitHub Actions với Docker

GitHub Actions là cách phổ biến nhất để tích hợp Docker vào CI/CD pipeline.

name: Build and Test
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build Docker image
        run: docker build -t myapp:${{ github.sha }} .
      - name: Run tests
        run: docker run myapp:${{ github.sha }} npm test

Docker-in-Docker (DinD)

Để build Docker images trong CI/CD runner, bạn cần Docker-in-Docker hoặc mount Docker socket.

steps:
  - name: Set up Docker Buildx
    uses: docker/setup-buildx-action@v3
  - name: Build
    uses: docker/build-push-action@v5
    with:
      context: .
      push: true
      tags: myapp:${{ github.sha }}

Build với Caching

Cache Docker layers để build nhanh hơn.

- uses: docker/build-push-action@v5
  with:
    cache-from: myapp:build-cache
    cache-to: myapp:build-cache

Ví dụ: Full CI/CD Pipeline

Ví dụ workflow hoàn chỉnh với GitHub Actions.

name: CI/CD Pipeline
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run tests
        run: docker-compose up --build -d
      - name: Wait for service
        run: sleep 10
      - name: Test API
        run: curl http://localhost:3000/health

  build-and-push:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: myapp:${{ github.sha }}

Best Practices cho CI/CD

  1. Cache Docker layers — Giảm thời gian build đáng kể
  2. Multi-stage builds — Build trong CI, chỉ copy artifacts cần thiết
  3. Tag với git commit SHA — Dễ track version
  4. Scan vulnerabilities — Dùng Trivy hoặc Clair trong pipeline
  5. Secrets management — KHÔNG hardcode secrets trong Dockerfile
  6. Fail fast — Dừng pipeline ngay nếu test fail
  7. Artifact retention — Cleanup images cũ thường xuyên

Bước tiếp theo

👉 Bài tiếp theo: Docker cho Microservices Architecture

Trong bài tiếp theo, chúng ta sẽ tìm hiểu cách triển khai kiến trúc Microservices với Docker: mỗi service là một container riêng, giao tiếp qua API Gateway và Message Queue. Hẹn gặp lại!

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận