0

[Open Source] #42 - nerdctl: Docker-compatible CLI cho containerd và kỷ nguyên Lazy Pulling

Trong thế giới DevOps, Docker đã trở thành tiêu chuẩn vàng. Tuy nhiên, khi Kubernetes chuyển sang sử dụng containerd làm runtime mặc định, giới lập trình viên bắt đầu tìm kiếm một công cụ có trải nghiệm mượt mà như Docker nhưng lại có khả năng can thiệp trực tiếp vào containerd. nerdctl (con cưng của dự án containerd) chính là câu trả lời.

Dưới góc độ kỹ thuật, nerdctl không chỉ là một trình bao (wrapper) cho Docker commands, mà là một bước tiến về bảo mật (Rootless) và hiệu suất (Lazy pulling).

Github: https://github.com/containerd/nerdctl


🛠️ 1. Nền tảng công nghệ: Sức mạnh của Go và Hệ sinh thái Cloud Native

nerdctl tận dụng tối đa các thư viện tiêu chuẩn của Cloud Native Computing Foundation (CNCF):

  • Golang (Lõi hệ thống): Tận dụng khả năng xử lý đồng thời và tính gọn nhẹ của Go để tương tác trực tiếp với các API hệ thống của Linux.
  • Cobra & Pflag: Bộ khung CLI mạnh mẽ giúp nerdctl đạt được sự tương thích gần như 100% với các flag và command của Docker.
  • containerd gRPC Client: Thay vì giao tiếp qua REST API như Docker, nerdctl sử dụng gRPC để nói chuyện trực tiếp với containerd daemon, giúp giảm độ trễ và tăng hiệu năng.
  • BuildKit: Tích hợp engine build hiện đại nhất hiện nay, cho phép build image song song và cache cực kỳ hiệu quả.
  • CNI (Container Network Interface): Sử dụng các plugin mạng tiêu chuẩn của Kubernetes, giúp việc quản lý mạng cho container trở nên linh hoạt hơn nhiều so với cơ chế bridge truyền thống.

🏗️ 2. Trụ cột kiến trúc: Daemonless-ish và Namespace Isolation

Kiến trúc của nerdctl mang tính đột phá ở khả năng "trong suốt" đối với hệ thống:

  • Kiến trúc Client-only: nerdctl không có daemon riêng. Nó hoạt động như một client thuần túy kết nối tới containerd. Điều này có nghĩa là nếu bạn gỡ bỏ nerdctl, các container đang chạy vẫn hoạt động bình thường trên containerd.
  • Hỗ trợ Namespace toàn diện: Đây là tính năng "sát thủ". nerdctl có thể tương tác với các namespace khác nhau của containerd. Bạn có thể dùng nerdctl --namespace k8s.io ps để xem và debug các container đang chạy bên trong một cụm Kubernetes — điều mà Docker CLI nguyên bản không làm được.
  • Triết lý Rootless-first: nerdctl được thiết kế để chạy mà không cần quyền root (thông qua RootlessKit), giúp giảm thiểu rủi ro bảo mật "container breakout" tấn công vào host hệ thống.

🔄 3. Các kỹ thuật "Pro-level" trong mã nguồn

  1. Lazy Pulling (Kéo ảnh lười): Sử dụng các snapshotter tiên tiến như Stargz hoặc Nydus. Thay vì đợi tải xong 1GB image mới khởi động, nerdctl cho phép container chạy ngay lập tức và chỉ tải những file cần thiết khi tiến trình bên trong container yêu cầu (on-demand).

  2. Native Compose Integration: nerdctl tích hợp trực tiếp thư viện compose-go. Bạn có thể chạy nerdctl compose up mà không cần cài đặt thêm bất kỳ công cụ nào khác như docker-compose.

  3. Image Encryption (ocicrypt): Hỗ trợ mã hóa các layer của image ngay khi build. Chỉ những server có khóa giải mã mới có thể pull và chạy được image, đảm bảo an toàn tuyệt đối cho các mã nguồn nhạy cảm trong môi trường untrusted.


📊 4. Workflow: Luồng thực thi từ CLI đến Runtime

Sơ đồ dưới đây mô tả cách nerdctl điều phối các thành phần để khởi chạy một container:

image.png


⚖️ 5. So sánh chiến lược: nerdctl vs Docker CLI

Tiêu chí nerdctl Docker CLI
Giao tiếp gRPC (Trực tiếp containerd) REST API (Qua Docker Daemon)
Namespace Hỗ trợ nhiều (Mặc định + K8s) Chỉ một namespace duy nhất
Lazy Pulling Có (Stargz/Nydus/SOCI) Không hỗ trợ mặc định
Rootless Native & Easy Phức tạp hơn để thiết lập
Phụ thuộc Chỉ cần containerd Cần toàn bộ Docker Engine

✅ Kết luận: Tại sao nerdctl là hình mẫu?

nerdctl là minh chứng cho việc kế thừa và phát triển. Nó giữ lại những gì tốt nhất của trải nghiệm Docker (UX) nhưng loại bỏ những rườm rà của kiến trúc cũ để tiến tới một hệ thống tinh gọn, bảo mật và tương thích tối đa với Kubernetes.

Đối với các lập trình viên Go, nerdctl là một "sách giáo khoa" thực chiến về:

  • Cách xây dựng CLI phức tạp với Cobra.
  • Cách làm việc với gRPC và các socket hệ thống.
  • Cách triển khai các tiêu chuẩn OCI (Open Container Initiative) vào sản phẩm thực tế.

Hy vọng bản phân tích này mang lại cho bạn cái nhìn sâu sắc về tương lai của quản lý container. Đừng quên Upvote và Follow mình để đón xem những "kỳ quan" mã nguồn tiếp theo nhé!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí