containerd vs Docker: ランタイム vs フルエンジン
containerd は実際にコンテナを動かす低レベルのランタイムです。Docker はその上に構築されたフルエンジンと開発者体験です。
Docker は完全なコンテナプラットフォームで - CLI、build、ネットワーク、開発者向けの使いやすさ - 内部で containerd を使っています。containerd は CNCF を卒業した、イメージを pull しコンテナを動かすことに特化したランタイムです。nerdctl のようなツールが Docker に似た CLI を提供します。両者は異なるレイヤーで動作します。
| containerd | Docker | |
|---|---|---|
| レイヤー | コアランタイム | フルエンジン(containerd を使用) |
| CLI | ctr / nerdctl | docker |
| イメージのビルド | BuildKit/nerdctl 経由 | 組み込み |
| 最適な用途 | プラットフォーム、Kubernetes ノード | 開発者 + CI ワークフロー |
| 使いやすさ | より低レベル | 高い |
CI で
ほとんどの pipeline では、Docker が適切な抽象化レベルです - build、run、push を 1 つの CLI で行えます。containerd はプラットフォーム自体を運用する場合(Kubernetes ノードはこれをランタイムとして使います)や、Docker に似た体験のために nerdctl と最小限のランタイムが欲しい場合に重要になります。両者を比較することは、実はレイヤーを比較することです。Docker は開発者向けエンジン、containerd はコンテナを動かすものです。
高速化する
ランタイムに関わらず、イメージのレイヤーを cache します。どちらも CI runner 上で動作します。より高速な managed runner は pull と build を短縮します。
結論
CI と開発向けの完全で使いやすいエンジンが欲しい場合: Docker。プラットフォームを運用する、または最小限のランタイム(多くの場合 nerdctl と併用)が欲しい場合: containerd。多くのチームにとって、これらは厳密な二者択一ではなく補完的なレイヤーです。