中レイヤのランタイム - containerd
Docker Engine の内部で使われ、Kubernetes でも主流となった中レイヤのコンテナランタイム。イメージ管理・実行・スナップショットなどを担う。
概念図
構文
containerd の立ち位置
containerd は Docker 社がコアコンポーネントを切り出して CNCF に寄贈したランタイムで、現在は Graduated プロジェクトです。
役割は「コンテナのライフサイクル管理」と「イメージとスナップショットの管理」に絞られており、ユーザー向け CLI や高レイヤの機能は持ちません。
Kubernetes では CRI(Container Runtime Interface)を介して kubelet から呼び出されます。
2022 年の Kubernetes v1.24 で dockershim が削除されて以降、多くのマネージド Kubernetes(EKS、GKE、AKS)が containerd をデフォルトに採用し、事実上の標準となっています。
Docker との関係(dockerd は内部で containerd を使う)
Docker Engine(dockerd)は、自身ですべてを実装しているわけではなく、実際のコンテナ起動や停止は内部で containerd に委譲しています。
さらに containerd は実行本体を低レイヤランタイム(通常は runc)に引き渡します。
つまり docker run は「dockerd → containerd → runc」という 3 層を経由してコンテナを起動します。
このため Kubernetes が「Docker ではなく containerd を直接使う」選択をしても、ユーザーが扱うイメージ形式や動作は本質的に変わりません。
CLI の有無と API 境界がどこに引かれているかが主な違いです。
ctr / nerdctl コマンド
ctr は containerd に同梱される低レベル CLI で、デバッグや動作確認を目的としています。
イメージの pull、タスクの起動などはできますが、ユーザー体験は docker や podman と比べてかなり素朴です。
日常的な操作には nerdctl が推奨されます。
nerdctl は docker 互換の CLI を持ちつつ containerd と直接通信し、BuildKit・Compose・rootless・暗号化・lazypull など新しい機能を積極的に取り込んでいます。
Kubernetes ノード上でのトラブルシュートでは crictl が CRI 経由でコンテナを一覧・操作するための標準ツールとなります。
sudo ctr images pull docker.io/library/alpine:3.19
sudo nerdctl run --rm -it alpine:3.19 sh
sudo crictl ps関連トピック
runc / CRI-O- runc は OCI Runtime Spec の参照実装、CRI-O は Kubernetes 向けに CRI を最小実装したランタイム。コンテナスタックの最下層と Kubernetes 向け層を担う。 podman- Docker 互換の CLI を持ちながら、常駐デーモンを必要としない(daemonless)コンテナエンジン。rootless 実行がデフォルトで、セキュリティ面で Docker と差別化される。 buildah- Dockerfile を書かずにシェルスクリプトでイメージを組み立てられるビルドツール。OCI 準拠のイメージを daemonless で生成する。 