Bài 8. Docker CI/CD: Tích Hợp Container vào Pipeline DevOps

Nếu bạn làm DevOps, chắc chắn đã thấy sức mạnh của Docker trong việc xây dựng và triển khai ứng dụng. Nhưng làm sao để đưa nó vào pipeline CI/CD một cách trơn tru? Trong bài thứ tám của series, tôi sẽ dẫn bạn qua cách tích hợp Docker trong CI/CD, từ build image CI, chạy test container, đến deploy – tất cả đều thực tế và hiệu quả. Đây là những gì tôi đúc kết từ việc setup pipeline cho team, không chỉ là lý thuyết đâu nhé!

Tại Sao Docker Là Tâm Điểm của CI/CD?

Vai Trò trong DevOps

CI/CD yêu cầu tốc độ, nhất quán, và khả năng tái tạo – Docker đáp ứng tất cả:

  • Build: Container hóa môi trường build.
  • Test: Chạy test trong container cô lập.
  • Deploy: Push image lên registry, deploy nhanh.

Ví dụ thực tế: Một team từng mất 10 phút setup môi trường test thủ công. Dùng Docker, thời gian giảm còn 2 phút, mọi thứ giống hệt từ dev đến prod.

Lợi Ích của Pipeline Container

  • Consistency: Không còn “works on my machine”.
  • Speed: Build/test song song trong container.
  • Isolation: Test không ảnh hưởng host.

DevOps: Docker biến pipeline thành cỗ máy tự động, đáng tin cậy.

Cách Tích Hợp Docker vào CI/CD

Build Image trong CI

  • Mục tiêu: Build image từ code, push lên registry.
  • Công cụ: Docker CLI, GitLab CI, Jenkins.

Ví dụ: Build image Flask app trong GitLab CI:

build:
  image: docker:20.10
  services:
    - docker:dind
  variables:
    DOCKER_HOST: tcp://docker:2375
    DOCKER_TLS_CERTDIR: ""
  script:
    - docker build -t myapp:$CI_COMMIT_SHA .
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD
    - docker push myapp:$CI_COMMIT_SHA

Test trong Container

  • Mục tiêu: Chạy test trong môi trường cô lập.
  • Cách làm: Dùng image vừa build hoặc image test riêng.

Ví dụ: Test với pytest:

test:
  image: myapp:$CI_COMMIT_SHA
  script:
    - pip install pytest
    - pytest tests/

Deploy từ CI/CD

  • Mục tiêu: Cập nhật service hoặc chạy container production.
  • Ví dụ: Deploy lên Swarm (bài 6):
    deploy:
    image: docker:20.10
    services:
    - docker:dind
    script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD
    - docker service update --image myapp:$CI_COMMIT_SHA web

DevOps: Pipeline tự động từ commit đến deploy, không cần can thiệp tay.

Thực Hành: Pipeline GitLab CI với Docker

Chuẩn Bị Ứng Dụng

  1. Dockerfile:

    FROM python:3.9-slim
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install -r requirements.txt
    COPY app.py .
    CMD ["python", "app.py"]
    • app.py:

      from flask import Flask
      app = Flask(__name__)
      
      @app.route('/')
      def hello():
       return "Hello CI/CD!"
      
      if __name__ == "__main__":
       app.run(host="0.0.0.0", port=5000)
    • requirements.txt:
      flask==2.0.1
  2. tests/test_app.py:

    import requests
    
    def test_hello():
       response = requests.get("http://localhost:5000")
       assert response.text == "Hello CI/CD!"

File .gitlab-ci.yml

stages:
  - build
  - test
  - deploy

build:
  stage: build
  image: docker:20.10
  services:
    - docker:dind
  variables:
    DOCKER_HOST: tcp://docker:2375
    DOCKER_TLS_CERTDIR: ""
  script:
    - docker build -t registry.gitlab.com/user/myapp:$CI_COMMIT_SHA .
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD registry.gitlab.com
    - docker push registry.gitlab.com/user/myapp:$CI_COMMIT_SHA

test:
  stage: test
  image: registry.gitlab.com/user/myapp:$CI_COMMIT_SHA
  services:
    - name: registry.gitlab.com/user/myapp:$CI_COMMIT_SHA
      alias: app
  script:
    - pip install pytest requests
    - pytest tests/

deploy:
  stage: deploy
  image: docker:20.10
  services:
    - docker:dind
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD registry.gitlab.com
    - docker pull registry.gitlab.com/user/myapp:$CI_COMMIT_SHA
    - docker run -d -p 5000:5000 registry.gitlab.com/user/myapp:$CI_COMMIT_SHA

Chạy và Kiểm Tra

  1. Commit code lên GitLab.
  2. Xem pipeline:
    • Build: Image push lên registry.
    • Test: Pytest chạy trong container.
    • Deploy: Container chạy trên runner.
  3. Test:
    curl localhost:5000
    • Kết quả: “Hello CI/CD!”.

Debug tip:

  • Build lỗi: Check log CI, đảm bảo Dockerfile đúng.
  • Test fail: Xem pytest output trong CI.

Ứng Dụng Thực Tế

Tăng Tốc Pipeline

  • Song song: Chạy test DB, API cùng lúc trong container riêng.
  • Caching: Dùng layer cache (bài 2) để build nhanh hơn.

Case study: Một team giảm thời gian pipeline từ 15 phút xuống 4 phút nhờ Docker và job song song.

Deploy Production

  • Tích hợp Swarm/Kubernetes:
    deploy:
    script:
      - docker service update --image myapp:$CI_COMMIT_SHA web

Thực tế: Tôi từng setup pipeline tương tự, deploy 10 commit/ngày mà không lỗi môi trường – Docker làm mọi thứ mượt mà.

Kết Luận

Docker trong CI/CD là cách để tự động hóa pipeline từ build image CI, test container, đến deploy – nhanh, nhất quán, và đáng tin cậy. Thực hành với GitLab CI cho thấy bạn có thể áp dụng ngay vào dự án thực tế. Bài tiếp theo, chúng ta sẽ khám phá Docker Monitoring và Logging – cách theo dõi container trong DevOps.

Điều hướng chuỗi bài viết<< Bài 7. Docker Security: Bảo Mật Container Hiệu Quả
>> Bài 9. Docker Monitoring: Theo Dõi và Logging Container Hiệu Quả
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Có thể bạn quan tâm