

Khi tìm hiểu về Docker hoặc Kubernetes, bên cạnh khái niệm container, bạn có thể thường xuyên bắt gặp containerd. Đây là một thành phần quan trọng giúp hệ thống tạo, chạy và quản lý vòng đời của container.
Vậy containerd là gì, hoạt động như thế nào và khác Docker hay runc ở điểm nào? Bài viết dưới đây sẽ giải thích những nội dung cơ bản nhất để bạn dễ hình dung vai trò của containerd trong môi trường container hiện nay.
Containerd là một container runtime mã nguồn mở, chịu trách nhiệm quản lý vòng đời của container trên một máy chủ. Nó có thể thực hiện nhiều công việc như quản lý container image, tạo và chạy container, dừng container cũng như giám sát quá trình thực thi.
Containerd được thiết kế với mục tiêu đơn giản, ổn định và có khả năng hoạt động trên nhiều môi trường khác nhau. Hiện nay, containerd có thể chạy trên cả Linux và Windows và được sử dụng trong nhiều nền tảng container phổ biến.
Một điểm cần lưu ý là containerd chủ yếu được thiết kế để tích hợp vào các hệ thống lớn hơn, thay vì cung cấp đầy đủ trải nghiệm quản lý container trực tiếp cho developer giống như Docker.
Docker Engine là một ví dụ điển hình. Khi người dùng yêu cầu Docker khởi động một container, Docker có thể sử dụng containerd ở phía dưới để thực hiện các tác vụ quản lý vòng đời container.

Để hiểu containerd, trước tiên cần hiểu khái niệm container runtime.
Container runtime là phần mềm chịu trách nhiệm giúp container thực sự chạy trên hệ điều hành. Khi một ứng dụng đã được đóng gói thành container image, runtime sẽ đảm nhiệm các công việc cần thiết để tạo và duy trì container từ image đó.
Có thể hiểu đơn giản:
Trong Kubernetes, container runtime là thành phần cơ bản chịu trách nhiệm quản lý quá trình thực thi và vòng đời container trên các node. Kubernetes hiện hỗ trợ những runtime tương thích với Container Runtime Interface (CRI), trong đó containerd là một lựa chọn phổ biến.
Containerd đảm nhiệm nhiều công việc liên quan đến vòng đời của container. Một số chức năng chính gồm:
Trước khi container có thể chạy, hệ thống cần có container image.
Containerd hỗ trợ các hoạt động liên quan đến image như tải image từ registry, lưu trữ image trên máy chủ và cung cấp dữ liệu image để tạo container.
Ví dụ, khi một hệ thống cần chạy ứng dụng từ một image, containerd có thể lấy image cần thiết từ container registry và chuẩn bị image đó cho quá trình khởi chạy container.
Containerd có thể quản lý các hoạt động quan trọng trong vòng đời container như:
Nhờ đó, các nền tảng phía trên như Docker hay Kubernetes không cần tự xử lý toàn bộ những công việc ở tầng runtime.
Container image thường được chia thành nhiều layer. Containerd hỗ trợ quản lý dữ liệu và filesystem cần thiết để container có thể sử dụng các layer này khi chạy.
Trong các phiên bản hiện đại, containerd sử dụng cơ chế snapshotter để quản lý cách dữ liệu image và container được lưu trữ, truy cập trên filesystem.
Tuy nhiên, với người mới tìm hiểu containerd, chỉ cần hiểu rằng đây là thành phần giúp chuẩn bị và quản lý dữ liệu cần thiết để container có thể hoạt động.
Containerd quản lý container nhưng vẫn có thể sử dụng một runtime cấp thấp hơn để thực hiện quá trình tạo container ở cấp hệ điều hành.
Một runtime rất phổ biến trong trường hợp này là runc.
Có thể hình dung đơn giản:
containerd → runc → hệ điều hành
Containerd quản lý vòng đời tổng thể, còn runc thực hiện công việc ở tầng thấp hơn để tạo và chạy container theo các tiêu chuẩn OCI.
Quá trình hoạt động thực tế của containerd có nhiều thành phần kỹ thuật. Tuy nhiên, nếu chỉ cần hiểu ở mức cơ bản, có thể chia thành một số bước sau.
Yêu cầu có thể xuất phát từ một nền tảng phía trên như Docker Engine hoặc Kubernetes.
Ví dụ, Kubernetes xác định rằng một Pod cần được chạy trên một node. Hệ thống sau đó gửi yêu cầu tới container runtime trên node đó.
Nếu máy chủ chưa có image cần thiết, containerd có thể tải image từ container registry.
Image sau đó được lưu trữ và chuẩn bị filesystem để sử dụng cho container.
Containerd chuẩn bị những thông tin cần thiết để container có thể được khởi tạo, chẳng hạn như filesystem và cấu hình runtime.
Containerd có thể gọi một runtime cấp thấp như runc để thực hiện quá trình tạo và khởi chạy container.
Sau khi container đã được tạo, containerd tiếp tục quản lý và theo dõi vòng đời của container.
Nhờ việc tách các chức năng thành nhiều lớp, những nền tảng như Docker và Kubernetes có thể tập trung vào các chức năng ở cấp cao hơn thay vì tự xử lý toàn bộ công việc liên quan đến hệ điều hành.
Containerd và Docker thường bị nhầm là hai công nghệ cạnh tranh trực tiếp, nhưng thực tế chúng hoạt động ở những lớp khác nhau.
Docker cung cấp một hệ sinh thái và bộ công cụ hoàn chỉnh hơn cho việc xây dựng, đóng gói và chạy container. Trong khi đó, containerd tập trung chủ yếu vào việc quản lý image và vòng đời container.
Docker Engine sử dụng containerd ở phía dưới để thực hiện các công việc như tạo, khởi động và dừng container.
Có thể hình dung đơn giản:
Người dùng → Docker → containerd → runtime → hệ điều hành
Do đó, khi bạn chạy:
docker run
người dùng không cần trực tiếp làm việc với containerd. Docker xử lý giao diện và những chức năng cấp cao hơn, còn containerd đảm nhiệm một phần công việc phía dưới.
Tiêu chí | Docker | Containerd |
| Mục đích | Nền tảng và công cụ làm việc với container | Container runtime |
| Đối tượng | Developer, DevOps | Nền tảng container, Kubernetes, hạ tầng |
| Build image | Có công cụ hỗ trợ | Không phải chức năng trọng tâm |
| Quản lý container | Có | Có |
| Quản lý image | Có | Có |
| Trải nghiệm người dùng | Đầy đủ, dễ sử dụng hơn | Chủ yếu tích hợp vào hệ thống khác |
| Quan hệ | Có thể sử dụng containerd bên dưới | Là thành phần runtime |
Vì vậy, câu hỏi “Docker hay containerd tốt hơn?” không hoàn toàn chính xác. Hai công nghệ phục vụ những mục đích khác nhau và có thể cùng tồn tại trong một hệ thống.
Một cặp khái niệm khác cũng thường gây nhầm lẫn là containerd và runc.
Cả hai đều tham gia vào quá trình chạy container nhưng đảm nhiệm những vai trò khác nhau.
Containerd quản lý các tác vụ ở cấp cao hơn như:
runc là runtime cấp thấp, chịu trách nhiệm trực tiếp hơn trong việc tạo và chạy container dựa trên tiêu chuẩn OCI.
Có thể hiểu:
containerd là người quản lý, còn runc là thành phần thực hiện công việc tạo container ở tầng thấp hơn.
Trong sử dụng thông thường, developer không cần tương tác trực tiếp với runc.
Containerd được sử dụng rộng rãi làm container runtime cho Kubernetes.
Mỗi node trong Kubernetes cần có một container runtime để những container thuộc các Pod có thể chạy. Kubernetes giao tiếp với runtime thông qua tiêu chuẩn Container Runtime Interface – CRI.
Có thể hình dung quá trình theo cách đơn giản:
Kubernetes → CRI → containerd → runtime → container
Kubelet trên Kubernetes node gửi yêu cầu tới runtime. Containerd sau đó thực hiện những tác vụ cần thiết để chuẩn bị và chạy container.
Từ Kubernetes 1.24, thành phần dockershim từng cung cấp tích hợp trực tiếp với Docker Engine đã được loại bỏ khỏi Kubernetes. Điều này không có nghĩa Kubernetes “không chạy container Docker”, mà Kubernetes chuyển sang làm việc với các container runtime thông qua CRI.
Containerd được sử dụng rộng rãi trong các nền tảng cloud native nhờ một số đặc điểm đáng chú ý.
Containerd không cố gắng cung cấp quá nhiều chức năng ở tầng developer. Thay vào đó, nó tập trung vào quản lý image, thực thi và vòng đời container.
Thiết kế này giúp containerd phù hợp để tích hợp vào các nền tảng container lớn hơn.
Containerd hỗ trợ các tiêu chuẩn của Open Container Initiative (OCI), giúp tăng khả năng tương thích trong hệ sinh thái container.
Điều này cho phép các nền tảng và công cụ container sử dụng những chuẩn chung thay vì phụ thuộc hoàn toàn vào một công nghệ riêng biệt.
Containerd có thể hoạt động như CRI runtime cho Kubernetes nên được sử dụng phổ biến trong môi trường Kubernetes cluster.
Containerd là dự án mã nguồn mở và hiện thuộc Cloud Native Computing Foundation (CNCF) với trạng thái Graduated.
Điều này cho thấy containerd đã trở thành một thành phần trưởng thành trong hệ sinh thái cloud native.

Người dùng thông thường không nhất thiết phải trực tiếp lựa chọn containerd.
Nếu bạn chỉ muốn phát triển ứng dụng và chạy container trên máy tính cá nhân, Docker thường cung cấp trải nghiệm thuận tiện hơn.
Containerd đặc biệt phù hợp trong những trường hợp như:
Bản thân containerd cũng được thiết kế chủ yếu để trở thành thành phần bên trong một hệ thống lớn hơn thay vì một công cụ trực tiếp dành cho end user.
Không. Containerd là một container runtime, còn Docker cung cấp một nền tảng và bộ công cụ rộng hơn để xây dựng, đóng gói và chạy container.
Docker Engine có thể sử dụng containerd ở phía dưới để thực hiện các tác vụ quản lý container.
Có. Docker Engine sử dụng containerd để thực hiện những hoạt động liên quan đến vòng đời container như tạo, khởi động và dừng container.
Có. Containerd là một dự án độc lập và không cần Docker để hoạt động.
Đây cũng là lý do containerd có thể được sử dụng trực tiếp làm container runtime cho Kubernetes.
Không. Containerd quản lý vòng đời container ở cấp cao hơn, trong khi runc là runtime cấp thấp chịu trách nhiệm thực thi container.
Trong nhiều hệ thống, containerd có thể sử dụng runc ở lớp phía dưới.
Có. Containerd là một trong những container runtime được Kubernetes hỗ trợ thông qua Container Runtime Interface (CRI).
Containerd là container runtime mã nguồn mở có nhiệm vụ quản lý image và vòng đời container, bao gồm những hoạt động như tạo, chạy, dừng và giám sát container. Nó đóng vai trò quan trọng trong hệ sinh thái container và được sử dụng phía dưới nhiều nền tảng như Docker cũng như trong các hệ thống Kubernetes.
Nếu mới tiếp cận container, bạn chỉ cần ghi nhớ mối quan hệ cơ bản: Docker cung cấp bộ công cụ làm việc với container, containerd quản lý vòng đời container, còn runtime cấp thấp như runc thực hiện quá trình tạo và chạy container ở tầng hệ điều hành.
Với các hệ thống doanh nghiệp triển khai ứng dụng container, Kubernetes hoặc kiến trúc cloud native, một nền tảng hạ tầng ổn định sẽ giúp việc mở rộng tài nguyên và vận hành workload thuận tiện hơn. VNPT Cloud cung cấp các dịch vụ hạ tầng Cloud và Kubernetes, hỗ trợ doanh nghiệp xây dựng môi trường triển khai ứng dụng linh hoạt, an toàn và dễ dàng mở rộng theo nhu cầu.
