Giới thiệu #
Việc tạo Docker image có lẽ đã không còn quá xa lạ đối với mọi người trong thời buổi hiện nay. Với Docker image, người dùng có thể triển khai phần mềm của mình ở bất cứ nơi đâu, miễn là nơi đó đã được cài đặt Docker. Người dùng có thể sử dụng Gitlab-CI để tự động hóa quá trình tạo và lưu trữ Docker image của mình một cách dễ dàng.
Để thao tác với Docker trên Gitlab-CI, người dùng có 3 sự lựa chọn như sau:
- Shell executor
- Docker-in-Docker (dind)
- “Bind” Docker socket
Trong trường hợp bạn không muốn runner sử dụng chế độ đặc quyền (privileged mode), nhưng vẫn muốn sử dụng cậu lệnh “docker build” thì có thể sử dụng kaniko hoặc buildah.
Các bước thực hiện #
Để sử dụng cách câu lệnh của Docker cho các job “CI/CD”, người dùng có thể cấu hình runner của mình sử dụng “docker executor” trên các server đã được cài đặt Docker và cấp quyền cho “gitlab-runner” có thể sử dụng Docker để tạo Docker image. Các bước chi tiết bao gồm:
- Cài đặt Docker trên server
- Cài đặt Gitlab runner (Ubuntu, Centos, Windows, macOS)
- Đăng ký runner với executor là “docker”. Ví dụ:
sudo gitlab-runner register -n \ --url <Gitlab Domain> \ --registration-token <Token> \ --executor docker \ --docker-privileged \ --docker-image "docker:20.10.16" \ --description "Tel4vn Docker executor"
Câu lệnh này sẽ đăng ký runner mới và sử dụng image “docker:20.10.16″, bạn nên chọn 1 phiên bản cố định để đảm bảo tính ổn định của service mình. Để có thể sử dụng “Docker-in-Docker” thì cần phải sử “privileged mode” bằng cách cấu hình privileged = true bên trong cấu hình của Docker container, hoặc thêm option –docker-privileged khi đăng ký runner.
- Thêm “gitlab-runner” vào group được sử dụng Docker:
sudo usermod -aG docker gitlab-runner
- Kiểm tra “gitlab-runner” đã có thể sử dụng Docker hay chưa bằng câu lệnh sau:
sudo -u gitlab-runner -H docker info
- Khởi tạo job tạo Docker image trong file “.gitlab-ci.yml”:
services: - docker:20.10.16-dind build_image: stage: build // Khai báo job này thuộc stage "build" (có thể xóa nếu muốn) before_script: // Câu lệnh dùng để đăng nhập vào Container Registry trên Gitlab - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: // Tạo và lưu Docker image trên Container Registry - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -t $CI_REGISTRY_IMAGE:latest . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest after_script: // Xóa các Docker image đã tạo sau khi đã thực thi các câu lệnh trong "script" (có thể xóa nếu muốn) - docker rmi -f $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest
Trong đó:
- $CI_COMMIT_SHA: mã băm SHA-1 của commit kích hoạt CI/CD job
- $CI_REGISTRY: Domain của Container Registry trên Gitlab
- $CI_REGISTRY_IMAGE: Domain của Container Registry của repository/project trên Gitlab
- $CI_REGISTRY_PASSWORD: mật khật dùng để đăng nhập vào Container Registry của Runner. Giá trị này tương đương với CI_JOB_TOKEN, và có thể sử dụng khi “job” vẫn còn đang xử lý. Nếu như job đã dừng vì bất kỳ lý do nào thì “mật khẩu” này sẽ không còn sử dụng được nữa
- $CI_REGISTRY_USER: user mặc định của gitlab-runner sử dụng để đăng nhập vào Gitlab Registry
Các giá trị này được lấy từ biến môi trường của Gitlab runner, người dùng có thể thay đổi các thông tin nếu không muốn sử dụng Container registry của Gitlab.
Hạn chế #
- Mặc định sẽ không sử dụng được câu lệnh “docker-compose” nếu chưa cài đặt.
- Thời gian thực thi sẽ chậm hơn đôi chút vì các “job” sẽ “không cache layer”.
- Container “docker:20.10.16-dind” và runner container không chia sẻ cho nhau “root file system”.
Xem thêm #
- Phần 1: Giới thiệu tổng quan về Gitlab Runner
- Phần 2: Các loại Runner Executor trong Gitlab CI
- Phần 3: Hướng dẫn cài đặt Gitlab Runner trên Ubuntu / Centos / Windows / macOS
- Phần 4: Các thành phần cơ bản trong file “.gitlab-ci.yml”
- Phần 5: Tạo Docker Image với Gitlab runner – Shell Executor
- Phần 5: Tạo Docker Image với Gitlab runner – Bind Docker socket
- Phần 6: Deploy AWS Lambda với Gitlab-CI và Serverless Framework
- Phần 7: Lưu trữ Terraform state trên Gitlab
Nguồn tham khảo: Gitlab
Trung tâm đào tạo Viễn thông và Công nghệ thông tin TEL4VN (TEL4VN) chuyên đào tạo các khóa học về DevOps như: Docker, Kubernetes, Ansible, Jenkins, Linux…….Ngoài ra, TEL4VN còn là Trung tâm đào tạo duy nhất về VoIP mã nguồn mở. 🌐Website: https://tel4vn.edu.vn/ |