نسخه آنلاین در حال بارگذاری زمان... تهران: ۲۶°C
۲۸ کاربر آنلاین

PNo.30Light

نشریه تخصصی هوش مصنوعی، سیستم‌های سرور و مهندسی داده

تازه ترین‌ها
زیرساخت و سرور
زمان مطالعه: ۲۱ دقیقه ۰ بازدید

containerd: Runtime استاندارد صنعت کانتینر — راهنمای کامل

نویسنده: تحریریه فنی P30Light
containerd: Runtime استاندارد صنعت کانتینر — راهنمای کامل
✦ خلاصه نکات کلیدی مقاله
  • containerd daemon CNCF Graduated — lifecycle کامل container: image، snapshot، runtime، CNI؛ زیر Docker/K8s.
  • CRI plugin built-in از v1.1 — kubelet مستقیم با containerd؛ namespace k8s.io برای Podها.
  • Plugin architecture: content store، snapshotter (overlayfs/stargz)، runc v2 shim — ساده، portable، robust.

هر Pod در Kubernetes، هر docker run، هر serverless container — در نهایت به یک runtime می‌رسد که process را spawn، filesystem mount، و lifecycle را manage می‌کند.

سال‌ها Docker face بود — اما Docker Engine یک monolith بزرگ بود: CLI + API + image build + swarm + …

containerd همان engine هسته است — جدا شده، ساده، embeddable:

An industry-standard container runtime with an emphasis on simplicity, robustness and portability.

یعنی daemon که کل lifecycle container را manage می‌کند: image transfer/storage، execution، snapshot، network attachment — بدون UX developer-facing.

Docker امروز containerd را embed می‌کند. Kubernetes از CRI plugin containerd استفاده می‌کند. GKE، EKS، AKS، Bottlerocket، Fargate — همه روی containerd یا fork آن.

پروژه ۲۸ فوریه ۲۰۱۹ CNCF Graduated شد — بعد از Kubernetes، Prometheus، Envoy. containerd 2.0 اکنون stable است.


مشکل runtime monolithic

Docker Engine (قدیم):
CLI → API Server → containerd → runc
         + build + swarm + volumes + networks + ...
         
Kubernetes فقط به CRI نیاز داشت — نه build، نه swarm
نیازDocker monolithcontainerd
Kubernetes CRIshim اضافهnative plugin
Embed در productسنگین✅ designed for embed
Attack surfaceبزرگminimal daemon
Windows + Linux
OCI compliance✅ first-class
Direct dev UX✅ docker CLInerdctl / ctr

containerd برای platform engineer و distro builder است — نه end-user مستقیم (هرچند nerdctl شبیه Docker CLI است).


containerd چیست؟

containerd یک daemon برای Linux و Windows است که:

  • Image pull/push — OCI Distribution Spec
  • Content store — layer deduplication (CAS)
  • Snapshotter — filesystem layers (overlayfs، stargz، …)
  • Container execution — via OCI runtime (runc)
  • Supervision — shim process per container group
  • CRI plugin — Kubernetes kubelet interface
  • Events — lifecycle notifications
  • Namespaces — multi-tenant isolation در یک daemon

Repo: github.com/containerd/containerd

Docs: containerd.io/docs

License: Apache 2.0


تاریخچه و CNCF

تاریخرویداد
۲۰۱۵استخراج از Docker به پروژه مستقل
۲۰۱۷donate به CNCF
مارس ۲۰۱۹CRI plugin GA — built into release
فوریه ۲۰۱۹CNCF Graduated
۲۰۱۹CloudEvents v1.0 — unrelated but same era
۲۰۲۴+containerd 2.x — API و plugin model بهبود

Docker Inc. containerd را ساخت تا runtime را از developer tool جدا کند — Kubernetes SIG-Node هم‌راستا شد.


معماری

نمای کلی

┌─────────────────────────────────────────────────────────┐
│                    containerd daemon                     │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐  │
│  │ Content  │ │Snapshotter│ │ Metadata │ │  Events  │  │
│  │  Store   │ │ overlayfs │ │   DB     │ │  Bus     │  │
│  └────┬─────┘ └────┬─────┘ └────┬─────┘ └──────────┘  │
│       │            │            │                      │
│  ┌────┴────────────┴────────────┴─────────────────┐   │
│  │              gRPC API (unix socket)              │   │
│  └────┬────────────┬────────────┬─────────────────┘   │
│       │            │            │                      │
│  ┌────▼────┐  ┌────▼────┐  ┌────▼────┐               │
│  │   CRI   │  │  ctr    │  │ nerdctl │  ← clients    │
│  │ plugin  │  │         │  │         │               │
│  └────┬────┘  └─────────┘  └─────────┘               │
└───────┼────────────────────────────────────────────────┘


┌───────────────────┐     ┌──────────────┐
│ containerd-shim   │────►│    runc      │  (OCI runtime)
│ runc v2           │     │  (or kata,   │
└───────────────────┘     │   gVisor)    │
        │                 └──────────────┘

   container process(es)


      CNI (network namespace)

Plugin model

containerd یک plugin graph است — همه چیز plugin:

Pluginکاربرد
contentblob storage — image layers
snapshotterwritable rootfs از layers
metadatacontainer/image metadata DB
runtime v2task service → shim
CRIKubernetes API translation
transferimage import/export
eventspub/sub lifecycle

Clients (CRI، ctr، nerdctl، Docker) همه از همان gRPC API استفاده می‌کنند — daemon تفاوت client را نمی‌بیند.


Kubernetes: CRI Plugin

از CRI Architecture docs:

CRI (Container Runtime Interface) — API بین kubelet و runtime.

containerd از v1.1 CRI plugin را built-in و enabled by default دارد.

Flow: Pod با یک container

1. Kubelet → CRI RunPodSandbox
2. CRI → CNI: create pod network namespace
3. CRI → containerd: create pause container (sandbox)
4. Kubelet → CRI PullImage
5. CRI → containerd: pull OCI image (if missing)
6. Kubelet → CRI CreateContainer + StartContainer
7. CRI → containerd: create app container in pod cgroups/namespace
8. containerd-shim → runc → process running

Pause container (registry.k8s.io/pause) — pod sandbox holder؛ app containers در namespace آن share می‌کنند.

Namespace: k8s.io

CRI همه objectها را در namespace k8s.io می‌سازد — جدا از ctr default namespace.

# لیست containerهای Kubernetes-managed
ctr -n k8s.io containers list

OCI Standards

containerd OCI-native است:

Specنقش
OCI Image Specimage manifest، layers، config
OCI Runtime Specconfig.json — process، mounts، namespaces
OCI Distribution Specregistry push/pull

Runtime default: runc — reference OCI runtime. جایگزین: Kata Containers، gVisor، youki.


Snapshotters

Snapshotter writable rootfs از immutable layers می‌سازد:

Snapshotterتوضیح
overlayfsdefault — مثل Docker overlay2
stargzlazy pull — start قبل از full download
devmapperblock-device thin provisioning
btrfs / zfscopy-on-write native
nativeبدون overlay — testing

config.toml:

[plugins."io.containerd.grpc.v1.cri".containerd]
  snapshotter = "overlayfs"

  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
    runtime_type = "io.containerd.runc.v2"

    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
      SystemdCgroup = true

RuntimeClass می‌تواند snapshotter یا runtime per-Pod تعیین کند — مثلاً stargz برای image بزرگ.


Runtime v2 و Shim

Runtime v2 — boundary بین containerd و process supervision:

containerd → Task Service → containerd-shim-runc-v2 → runc → container
  • Shim — parent process container؛ containerd می‌تواند restart شود بدون kill container
  • runc v2io.containerd.runc.v2 — standard Linux path
  • Kataio.containerd.kata.v2 — VM isolation

CLI Tools

Toolمخاطبکاربرد
ctroperator/debuglow-level containerd CLI
crictlKubernetesCRI-compatible debug (pods، images)
nerdctldeveloperDocker-compatible CLI روی containerd

ctr — low-level

# pull image
ctr images pull docker.io/library/nginx:alpine

# run container
ctr run --rm docker.io/library/nginx:alpine nginx-test

# list (default namespace)
ctr containers list
ctr -n k8s.io containers list

crictl — Kubernetes debug

# pods on node
crictl pods
crictl ps
crictl images
crictl logs <container-id>
crictl exec -it <container-id> sh

# pull via kubelet config
crictl pull nginx:alpine

nerdctl — Docker-like UX

# شبیه docker
nerdctl run -d --name web nginx:alpine
nerdctl ps
nerdctl build -t myapp .
nerdctl compose up

nerdctl — rootless، buildkit، compose — جایگزین Docker CLI روی containerd خالص.


نصب

Linux (systemd)

# Ubuntu/Debian — often pre-installed with Docker/K8s
sudo apt-get update
sudo apt-get install containerd

# یا binary از GitHub releases
wget https://github.com/containerd/containerd/releases/download/v2.0.4/containerd-2.0.4-linux-amd64.tar.gz
sudo tar Cxzvf /usr/local containerd-2.0.4-linux-amd64.tar.gz

# systemd unit
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl enable --now containerd

Kubernetes با kubeadm

# containerd pre-installed — configure for systemd cgroup
containerd config default | tee /etc/containerd/config.toml
# set SystemdCgroup = true under runc.options
sudo systemctl restart containerd

kubeadm init --cri-socket unix:///run/containerd/containerd.sock

Windows

containerd daemon روی Windows — hcsshim برای Windows containers.


config.toml Essentials

version = 3

[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.k8s.io/pause:3.10"

  [plugins."io.containerd.grpc.v1.cri".containerd]
    snapshotter = "overlayfs"
    default_runtime_name = "runc"

    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
      runtime_type = "io.containerd.runc.v2"
      [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
        SystemdCgroup = true

  [plugins."io.containerd.grpc.v1.cri".registry]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
      endpoint = ["https://mirror.example.com"]
Settingچرا
SystemdCgroup = truekubelet با systemd driver — الزامی روی modern K8s
sandbox_imagepause container version
registry.mirrorspull از mirror داخلی
snapshotteroverlayfs default؛ stargz برای lazy pull

containerd vs Docker vs CRI-O vs Podman

containerdDocker (Moby)CRI-OPodman
Primary useembed / K8s CRIdev CLI + engineK8s CRI onlyrootless dev
K8s CRI✅ nativevia cri-dockerd✅ native❌ (CRI-O separate)
Dev CLInerdctldockerpodman
Build imagesnerdctl+buildkit✅ built-in✅ buildah
Rootlessnerdctlrootless mode✅ default
Daemonoptional (无daemon)
Windows❌ Linux only

Docker = containerd + dockerd + CLI + buildkit wrapper.

CRI-O — فقط CRI، سبک‌تر از containerd برای K8s-only node — Red Hat/OpenShift path.

Podman — daemonless، rootless-first — dev workstation.

containerdindustry standard embed — GKE/EKS/AKS node OS.


Adopters

از containerd.io:

Adopterنقش
Google GKEnode runtime
AWS EKS / Bottlerocketcontainer OS
Azure AKSnode runtime
AWS Fargateserverless containers
Alibaba PouchContainerfork/extend
Kata ContainersVM runtime via shim
FirecrackermicroVM integration
LinuxKitminimal OS
Dockerunderlying runtime

Features پیشرفته

Checkpoint / Restore

با CRIU — freeze container state و migrate:

# experimental — Linux
ctr tasks checkpoint --image-path /tmp/checkpoint web
ctr tasks restore web /tmp/checkpoint

Use case: live migration، debug، fast restart.

Live Restore

containerd restart بدون kill running containers — shim process نگه می‌دارد.

Events

ctr events
# subscribe lifecycle: create, start, exit, delete

Integration با monitoring و CloudEvents downstream.

Transfer Plugin

OCI image import/export بدون registry — air-gapped environments.

containerd 2.0

  • API cleanup
  • plugin registration بهبود
  • performance و stability
  • docs: docs/containerd-2.0.md

Security

از containerd.io — Security:

  • Minimal attack surface — no build، no swarm در core
  • Rootless via nerdctl
  • AppArmor/SELinux — OCI spec labels
  • Seccomp — default profiles
  • Audit — published security audits
  • CVE processcontainerd/project
Layerhardening
RuntimeKata برای untrusted workload
NetworkCilium policy
Imagesigned images، digest pin
HostBottlerocket — immutable OS + containerd

Troubleshooting

# daemon status
systemctl status containerd
journalctl -u containerd -f

# CRI debug
crictl info
crictl pods --name my-pod -n production

# containerd low-level
ctr plugins ls
ctr -n k8s.io containers list
ctr -n k8s.io tasks list

# common: ImagePullBackOff
crictl pull <image>   # test pull manually
crictl images | grep <name>
علامتعلتfix
Pod SandboxChangedpause container restartcheck cgroup driver
SystemdCgroup mismatchconfig.tomlSystemdCgroup = true
CNI errornetwork pluginCNI config in /etc/cni/net.d
shim not foundruntime not installedinstall runc، restart
disk fullimage layerscrictl rmi --prune
namespace confusionwrong ctr namespaceuse -n k8s.io

containerd در stack P30Light

Host OS (Bottlerocket / Ubuntu)


containerd daemon
    ├── CRI → kubelet → Pods
    ├── [Cilium](/blog/cilium-ebpf-kubernetes-networking/) CNI
    ├── [Kata](/blog/kata-containers-secure-container-runtime/) RuntimeClass (optional)
    └── nerdctl / crictl (ops)


    [Cloud Native Buildpacks](/blog/cloud-native-buildpacks-cnb-guide/) → OCI image → containerd pull

Image build با CNB → push registry → containerd pull → run — pipeline استاندارد.


چه زمانی containerd؟

✅ مناسب

  • Kubernetes node — default runtime (با kubeadm، k3s، RKE2)
  • Cloud managed K8s — GKE/EKS/AKS underlying
  • Embed در product — custom platform
  • Minimal container OS — Bottlerocket، Flatcar
  • Docker replacement در production — nerdctl + containerd
  • Multi-runtime — runc + Kata via RuntimeClass

❌ کمتر مناسب

وضعیتجایگزین
Developer laptop «فقط docker compose»Docker Desktop / Podman
OpenShift strictCRI-O (CRIO)
Daemonless rootless devPodman
VM orchestrationKubeVirt — layer بالاتر

عملیات روزمره

# prune unused images (Kubernetes node)
crictl rmi --prune

# disk usage
ctr -n k8s.io content ls
du -sh /var/lib/containerd/

# after upgrade
systemctl restart containerd
# running containers survive via shim

# validate CRI
critest --runtime-endpoint=unix:///run/containerd/containerd.sock

جمع‌بندی

Docker monolithcontainerd
همه‌کاره dev toolfocused runtime
embed سختdesigned to embed
CRI via shimnative CRI plugin
vendor-tied narrativeCNCF Graduated standard

containerd موتور واقعی behind modern containers است — ساده، robust، portable. Kubernetes، Docker، Fargate، Bottlerocket — همه روی این daemon یا fork آن.

Platform engineer که node Kubernetes را می‌شناسد، containerd را باید بشناسد — از CRI flow تا snapshotter و crictl debug.

قدم بعدی

  1. containerd روی Linux VM نصب — ctr run hello-world
  2. config.tomlSystemdCgroup = true برای kubeadm
  3. cluster با --cri-socket unix:///run/containerd/containerd.sock
  4. crictl pods / crictl ps — debug Pod
  5. nerdctl نصب — Docker-like workflow بدون dockerd
  6. RuntimeClass با Kata — secure workload test

منابع:


منتشر شده در P30Light — بخش زیرساخت سرور و Cloud Native.

لینک گزارش با موفقیت کپی گردید!