Buildah là gì? Hướng dẫn cài đặt và sử dụng Buildah thay thế Docker trong CI/CD
Tìm hiểu Buildah là gì, các ưu điểm vượt trội so với Docker (đặc biệt là không cần Daemon và hỗ trợ Rootless) và hướng dẫn chi tiết cách cài đặt, sử dụng Buildah trong môi trường CI/CD.
Trong quá trình triển khai CI/CD (Continuous Integration / Continuous Deployment), việc xây dựng container image là một bước không thể thiếu. Docker đã từng là lựa chọn duy nhất, nhưng việc sử dụng Docker-in-Docker (DinD) lại mang đến nhiều rủi ro về bảo mật và tiêu tốn tài nguyên. Buildah ra đời như một giải pháp thay thế hoàn hảo. Vậy Buildah là gì và làm cách nào để sử dụng công cụ này thay thế Docker trong CI/CD? Hãy cùng tìm hiểu chi tiết qua bài viết dưới đây.
1. Buildah là gì?
Buildah là một công cụ mã nguồn mở được phát triển bởi Red Hat, chuyên dùng để xây dựng (build) container image theo chuẩn OCI (Open Container Initiative) mà không cần sử dụng Docker Daemon.
Điều này có nghĩa là bạn có thể tạo ra các container image tương thích hoàn toàn với Docker, Podman hay Kubernetes mà không cần phải cài đặt một dịch vụ nền (daemon) nặng nề và phức tạp.
Trong hệ sinh thái container hiện đại, Buildah thường được sử dụng kết hợp với các công cụ khác như:
- Buildah: Chuyên dùng để build container image.
- Podman: Chuyên dùng để quản lý và chạy container.
- Skopeo: Dùng để kiểm tra, di chuyển và sao chép image giữa các container registry.
2. Tại sao nên sử dụng Buildah thay thế Docker?
Việc chuyển đổi từ Docker sang Buildah mang lại nhiều lợi ích vượt trội, đặc biệt là trong môi trường CI/CD và Kubernetes:
2.1. Không yêu cầu Docker Daemon (Daemonless)
Với Docker, dịch vụ dockerd phải luôn chạy ngầm để có thể build image, gây lãng phí tài nguyên. Buildah hoạt động độc lập (daemonless), trực tiếp thực thi các lệnh build mà không cần dịch vụ nền.
- Lợi ích: Tiết kiệm CPU, RAM và giảm bớt bề mặt tấn công bảo mật (attack surface).
2.2. Hỗ trợ Rootless (Không cần quyền Root)
Buildah có thể chạy dưới quyền của một người dùng thông thường (non-root) thay vì bắt buộc phải có đặc quyền root như Docker.
- Lợi ích: Giúp tăng cường độ an toàn tối đa cho các hệ thống như GitLab CI, Jenkins, Kubernetes và OpenShift.
2.3. Giải quyết rủi ro bảo mật của Docker-in-Docker (DinD)
Trong CI/CD, để dùng Docker build image, chúng ta thường phải chạy container ở chế độ privileged: true (đặc quyền cao nhất). Điều này cực kỳ nguy hiểm vì nếu hacker xâm nhập được container, họ có thể kiểm soát toàn bộ máy chủ vật lý (host).
Buildah không yêu cầu đặc quyền privileged, giúp triệt tiêu hoàn toàn rủi ro leo thang đặc quyền này.
2.4. Tương thích 100% với chuẩn OCI
Image do Buildah tạo ra tuân thủ chuẩn OCI, đảm bảo tương thích hoàn hảo với:
- Docker
- Podman
- Kubernetes, containerd, CRI-O
3. Hướng dẫn cài đặt Buildah trên hệ điều hành Ubuntu
Việc cài đặt Buildah trên Ubuntu rất đơn giản. Bạn chỉ cần thực hiện các lệnh sau trên terminal:
Bước 1: Cập nhật hệ thống
sudo apt update
Bước 2: Cài đặt Buildah
sudo apt install buildah -y
Bước 3: Kiểm tra phiên bản Buildah đã cài đặt
buildah version
Kết quả ví dụ:
Version: 1.34.0
Go Version: go1.22
Image Spec: 1.1.0
Runtime Spec: 1.1.0
4. Cách sử dụng Buildah để Build Container Image
Buildah hỗ trợ build image trực tiếp từ Dockerfile hiện có, giúp bạn chuyển đổi từ Docker sang Buildah mà không cần sửa đổi mã nguồn.
4.1. Build image bằng Dockerfile
Giả sử bạn có một Dockerfile cơ bản để chạy web tĩnh với Nginx:
# Dockerfile
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/
Để build image với Buildah, bạn dùng lệnh buildah bud (bud = Build Using Dockerfile):
buildah bud -t my-nginx-app:v1 .
4.2. Kiểm tra danh sách Image
Sau khi build xong, bạn kiểm tra các image đang có bằng lệnh:
buildah images
Kết quả ví dụ:
REPOSITORY TAG IMAGE ID CREATED SIZE
my-nginx-app v1 abc123456789 1 minute ago 42.5 MB
4.3. Đăng nhập vào Container Registry
Để đẩy (push) image lên kho lưu trữ (ví dụ GitLab Container Registry), bạn cần đăng nhập trước:
buildah login registry.gitlab.com
Hoặc sử dụng token an toàn trong CI/CD:
buildah login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.gitlab.com
4.4. Đẩy (Push) Image lên Registry
Tag lại image theo định dạng của registry:
buildah tag my-nginx-app:v1 registry.gitlab.com/username/project/my-nginx-app:v1
Thực hiện lệnh push:
buildah push registry.gitlab.com/username/project/my-nginx-app:v1
(Lưu ý: Buildah hỗ trợ push lên mọi registry phổ biến như Docker Hub, AWS ECR, Harbor, GitLab Registry…)
5. Ứng dụng Buildah vào GitLab CI/CD Pipeline
Đây là lúc Buildah tỏa sáng nhất. Dưới đây là một ví dụ mẫu file .gitlab-ci.yml sử dụng Buildah để build và push image một cách tối ưu và an toàn:
stages:
- build
build_image:
stage: build
image: quay.io/buildah/stable:latest
variables:
# Cấu hình không sử dụng VFS để tăng tốc build trên CI
STORAGE_DRIVER: vfs
script:
- echo "Đăng nhập vào GitLab Registry..."
- buildah login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
- echo "Đang tiến hành Build Image..."
- buildah bud -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- echo "Push Image lên Registry..."
- buildah push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
Ưu điểm của pipeline này:
- Không cần chạy dịch vụ Docker (Daemonless).
- Tránh được rủi ro bảo mật từ Docker-in-Docker.
- Mức tiêu thụ tài nguyên (RAM, CPU) ít hơn hẳn so với Docker.
6. Lời kết: Khi nào nên chuyển sang Buildah?
Buildah là một công cụ xuất sắc và đặc biệt phù hợp trong các kịch bản:
- Xây dựng hệ thống CI/CD với GitLab CI, Jenkins Kubernetes Agent, GitHub Actions.
- Môi trường vận hành bằng OpenShift, Kubernetes (EKS, RKE2, K3s).
- Các hệ thống yêu cầu bảo mật khắt khe (Zero Trust, không cho phép chạy root).
Với sự phát triển mạnh mẽ của kiến trúc GitOps và DevSecOps hiện đại, việc sử dụng Buildah thay thế Docker trong quá trình đóng gói ứng dụng là một cải tiến đáng giá để mang lại một pipeline nhanh gọn, tối ưu và an toàn tuyệt đối.
Bình luận
Bài viết liên quan
Hướng Dẫn Chuyển Đổi Từ Ingress NGINX Sang HAProxy Ingress Controller
Hướng dẫn chi tiết cách migration (chuyển đổi) từ Ingress NGINX sang HAProxy Kubernetes Ingress Controller cho hệ thống production. So sánh ưu nhược điểm và best practices.
MiniStack Là Gì? Giải Pháp Giả Lập AWS Hoàn Hảo Cực Nhẹ Chạy Trên Local
MiniStack là gì? Tìm hiểu công cụ mã nguồn mở giả lập các dịch vụ AWS ngay trên máy tính của bạn. So sánh chi tiết MiniStack và LocalStack dành cho DevOps.
Homelab: Hướng dẫn cài đặt Cluster Kubernetes siêu nhẹ với K3s
K3s là gì? Hướng dẫn chi tiết cách cài đặt một cụm Cluster Kubernetes siêu nhẹ (K3s) dành cho hệ thống Homelab, Raspberry Pi hoặc các thiết bị IoT.