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
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
- Cache Docker layers — Giảm thời gian build đáng kể
- Multi-stage builds — Build trong CI, chỉ copy artifacts cần thiết
- Tag với git commit SHA — Dễ track version
- Scan vulnerabilities — Dùng Trivy hoặc Clair trong pipeline
- Secrets management — KHÔNG hardcode secrets trong Dockerfile
- Fail fast — Dừng pipeline ngay nếu test fail
- 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!