Docker - containerd - runc - CRI/OCI
Khi nói "chạy container", thật ra có nhiều lớp phối hợp với nhau. Bài này tách từng lớp ra: mỗi lớp là gì, làm gì, và Kubernetes dùng lớp nào.
1. Overview
| Lớp | Thành phần | Mức độ | Một câu |
|---|---|---|---|
| Giao diện người dùng | Docker (CLI + dockerd) | Cao | Bộ công cụ đầy đủ cho người dùng: build, run, network, volume |
| Quản lý container | containerd | Trung | Quản lý image và vòng đời container |
| Giữ container chạy | containerd-shim | Trung | Tiến trình trung gian, giữ container sống độc lập với containerd |
| Tạo container | runc | Thấp | Gọi nhân Linux để thật sự tạo container |
| Chuẩn giao tiếp | CRI | Chuẩn | API để kubelet nói chuyện với runtime |
| Chuẩn container | OCI | Chuẩn | Quy định định dạng image và cách chạy container |
2. Docker
Docker là bộ công cụ hoàn chỉnh để làm việc với container, gồm nhiều phần:
| Thành phần | Việc làm |
|---|---|
docker CLI | Lệnh người dùng gõ: docker build, docker run, docker ps |
dockerd (Docker Engine) | Daemon nhận lệnh từ CLI, quản lý network, volume, build image |
| BuildKit | Build image từ Dockerfile |
| containerd | Docker Engine giao việc chạy container xuống containerd |
docker CLI → dockerd → containerd → containerd-shim → runc → container
- Docker rất tiện cho máy dev: build image, chạy thử, có docker compose.
- Nhưng với Kubernetes, phần lớn tính năng của Docker là thừa: Kubernetes đã tự lo network (CNI), volume (CSI), lập lịch (scheduler). Kubernetes chỉ cần phần chạy container, tức là containerd.
- Image build bằng
docker buildvẫn chạy bình thường trên Kubernetes, vì nó theo chuẩn OCI image. - Docker vẫn là công cụ tốt để build và test image trên máy dev. Chỉ là Kubernetes không dùng Docker Engine làm runtime nữa.
3. containerd
containerd là runtime chuyên quản lý vòng đời container. Ban đầu là một phần của Docker, sau được tách ra thành dự án độc lập.
| containerd làm | containerd không làm |
|---|---|
| Tải image từ registry, lưu và giải nén image | Build image từ Dockerfile |
| Tạo, chạy, dừng, xóa container | Quản lý network nâng cao (giao cho CNI) |
| Quản lý snapshot (lớp file system) | Lập lịch container lên máy (việc của scheduler) |
| Cung cấp CRI plugin cho kubelet |
4. runc
runc là công cụ cấp thấp nhất: chương trình thật sự tạo container bằng các tính năng của nhân Linux (namespaces để cô lập, cgroups để giới hạn CPU/RAM). runc không tự chạy, nó được containerd gọi qua shim.
Flow tạo container
| Bước | Ai làm | Việc |
|---|---|---|
| 1 | containerd | Tải image nginx từ registry |
| 2 | containerd | Tạo OCI bundle từ image: thư mục rootfs (file của container) + file config.json (cách chạy) |
| 3 | containerd | Khởi động containerd-shim cho Pod |
| 4 | shim | Gọi runc create với bundle |
| 5 | runc | Tạo container, chạy tiến trình nginx, rồi thoát |
| 6 | shim | Ở lại làm "cha" của container: giữ log, báo khi container dừng |
- OCI bundle do containerd tạo từ image, theo chuẩn OCI nên runc đọc được.
- Shim ("miếng chêm") đứng giữa containerd và container, để restart containerd không làm chết container.
5. CRI – Container Runtime Interface
CRI là bộ API do Kubernetes định nghĩa (dùng gRPC), để kubelet ra lệnh cho container runtime mà không cần biết runtime đó là gì.
CRI gồm hai nhóm API:
| Nhóm | Ví dụ thao tác | Dùng khi |
|---|---|---|
| RuntimeService | RunPodSandbox, CreateContainer, StartContainer, StopContainer, ListContainers | Tạo Pod và container |
| ImageService | PullImage, ListImages, RemoveImage | Tải và quản lý image |
Các runtime theo CRI thường gặp:
| Runtime | Ghi chú |
|---|---|
| containerd | Phổ biến nhất: kubeadm, EKS, GKE, AKS đều dùng |
| CRI-O | Viết riêng cho Kubernetes, dùng nhiều trên OpenShift |
6. OCI – Open Container Initiative
OCI là một bộ luật chung cho container, để các công cụ của nhiều hãng khác nhau hiểu được nhau.
Nếu không có OCI: image build bằng Docker chỉ chạy được trên Docker. Kubernetes muốn dùng containerd thì bạn phải build lại image theo kiểu khác.
Nhờ có OCI: bạn build image bằng docker build trên laptop, đẩy lên Docker Hub hoặc ECR, rồi containerd trên cluster vẫn tải về và chạy bình thường.
Ba chuẩn, theo hành trình của một image
| Chuẩn | Trả lời câu hỏi | Ví dụ dễ hiểu |
|---|---|---|
| Image | Một image gồm những gì, xếp ra sao? | Image Docker build ra thì containerd cũng mở được |
| Distribution | Đẩy image lên kho và tải về bằng cách nào? | Docker Hub hay ECR đều push/pull giống nhau |
| Runtime | Có image rồi thì chạy container thế nào? | containerd đưa cho runc đúng "công thức" để tạo container |
- CRI: luật để kubelet nói chuyện với containerd (do Kubernetes đặt ra).
- OCI: luật về image và cách chạy container (do tổ chức OCI đặt ra).
7. Công cụ dòng lệnh: ctr, nerdctl, crictl
| Công cụ | Nói chuyện với | Dùng để | Dùng khi thi? |
|---|---|---|---|
ctr | containerd trực tiếp | Debug containerd mức thấp, ít tính năng | Hiếm |
nerdctl | containerd trực tiếp | Cú pháp giống Docker (nerdctl run -p 8080:80 nginx) | Không |
crictl | Bất kỳ runtime theo CRI | Kiểm tra, debug container và Pod sandbox trên node | ✅ Có |
kubectl | kube-apiserver | Quản lý tài nguyên cluster | ✅ Có |
crictl
sudo crictl pods # liệt kê Pod sandbox trên node
sudo crictl ps -a # liệt kê container, kể cả container đã chết
sudo crictl images # liệt kê image
sudo crictl logs <container-id> # xem log
sudo crictl exec -it <container-id> sh
sudo crictl inspect <container-id>
- Cấu hình endpoint nằm ở
/etc/crictl.yaml; nếu chưa có, chỉ định bằng--runtime-endpoint unix:///run/containerd/containerd.sock.
ctr
sudo ctr namespaces ls # default, k8s.io, moby...
sudo ctr -n k8s.io containers ls # container do kubelet tạo
sudo ctr -n k8s.io images ls
- Phải thêm
-n k8s.io, nếu khôngctrchỉ xem namespacedefaultvà sẽ thấy trống.
8. Tóm tắt
| Thành phần | Là gì | Ai dùng nó |
|---|---|---|
| Docker | Bộ công cụ đầy đủ cho người dùng | Developer trên máy dev |
| containerd | Runtime quản lý image và container | kubelet (qua CRI), Docker Engine |
| containerd-shim | Tiến trình giữ container sống | containerd |
| runc | Công cụ cấp thấp tạo container | containerd (qua shim) |
| CRI | API giữa kubelet và runtime | kubelet |
| OCI | Chuẩn image, runtime, registry | Mọi công cụ build, registry, runtime |
| crictl | CLI debug runtime trên node | Admin khi debug, kỳ thi CKA |