Danh sách bài viết trong series Sử dụng Docker từ cơ bản đến nâng cao
- Bài 1. Cơ Bản Docker: Hiểu Container và Vai Trò trong DevOps
- Bài 2. Docker Image: cách xây Dựng và tối Ưu
- Bài 3. Docker Networking: Kết Nối Container Hiệu Quả
- Bài 4. Docker Volume: Quản Lý Dữ Liệu Hiệu Quả cho Container
- Bài 5. Docker Compose: Điều Phối Multi-Container Hiệu Quả
- Bài 6. Docker Swarm: Orchestration Cơ Bản để Scale Container
- Bài 7. Docker Security: Bảo Mật Container Hiệu Quả
- Bài 8. Docker CI/CD: Tích Hợp Container vào Pipeline DevOps
- Bài 9. Docker Monitoring: Theo Dõi và Logging Container Hiệu Quả
- Bài 10. Docker resources: Tối Ưu và Debug Container Hiệu Quả
- Bài 11. Docker và Microservices: Thiết Kế Ứng Dụng Phân Tán
- Bài 12. Docker Registry: Tự Host và Quản Lý Image Hiệu Quả
- Bài 13. Docker với Cloud: Tích Hợp Container trên AWS ECS và GCP Cloud Run
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
-
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
-
-
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
- Commit code lên GitLab.
- Xem pipeline:
- Build: Image push lên registry.
- Test: Pytest chạy trong container.
- Deploy: Container chạy trên runner.
- 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.