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-image "docker:20.10.16" \ --docker-volumes /var/run/docker.sock:/var/run/docker.sock \ --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. Để runner có thể thực thi các câu lệnh của docker thì cần phải bind mount socker của docker với option “–docker-volumes …”.
- 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”:
image: docker:20.10.16 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ế #
- Giảm thiểu tính độc lập và an toàn đối với các container khác trên host. Ví dụ người dùng sử dụng câu lệnh `docker rm -f $(docker ps -a -q)` thì vô tình sẽ xóa luôn cả Gitlab runner container.
- Xử lý đồng thời có thể sẽ không hoạt động: Trong trường hợp người dùng gán tên cho container khi khởi tạo sẽ dẫn đến xung đột và lỗi nếu như job đó được xử lý song song bởi nhiều runner trên cùng host/server.
- Có thể sẽ gây khó khăn trong việc quản lý container và quy trình làm việc của người dùng nếu ngoài runner trên server còn có các container khác.
- Việc “bind mount” tập tin hoặc thư mục của repository vào trong cotnainer có thể sẽ hoạt động không chính xác.
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 – Docker in Docker
- 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/ |