見出し画像

containerd と runC の違いとは?

コンテナ技術に触れると、「containerd」と「runC」という言葉をよく目にするはず。でも、違いを聞かれると「どちらもコンテナを動かすもの?」くらいの理解になりがちですよね。

実はこの2つ、役割が全然違う んです。ざっくり言うと、containerd は「管理者」runC は「作業者」 みたいな関係。どんな仕組みなのか、一緒に見ていきましょう!


containerd と runC の役割の違い

まず、それぞれの役割を整理するとこんな感じです。

  • containerd:コンテナのライフサイクル管理(作成・開始・停止・削除)を担当する

  • runC:コンテナを実際に起動・実行する

もう少し詳しく言うと…

🏗 containerd は「コンテナの管理者」

containerd はコンテナを管理するためのツールで、主に以下のようなことをしています。

(1) コンテナの作成・管理

  • 新しくコンテナを作ったり、動かしたり、消したりする
    (2) イメージ管理

  • コンテナの元となるイメージ(テンプレートみたいなもの)を取得・保存する
    (3) API を提供

  • Kubernetes などのシステムが containerd を使ってコンテナを操作できるようにする

イメージとしては、「現場の監督」のような存在ですね。
「このコンテナを作って!」とか「このコンテナを止めて!」みたいな指示を出す役割です。

⚙ runC は「コンテナの作業者」

runC はコンテナを実際に起動するツールです。

(1) コンテナのプロセスを起動

  • コンテナの内部でアプリケーションを実際に動かす
    (2) 低レベルな実装

  • Linux の機能(Namespaces や cgroups)を使ってコンテナを隔離

つまり、containerd から「このコンテナを動かして!」と指示を受けて、実際に作業するのが runC です。
まさに「現場の作業員」のような存在ですね。


containerd と runC の関係性をイメージで理解

containerd と runC はそれぞれ単独で動くものではなく、containerd が runC を利用してコンテナを実行 しています。

例えば、Docker や Kubernetes がコンテナを動かすときの流れを考えてみましょう。

🛠 Docker の場合

Docker CLI → Docker Engine → containerd → runC → Linux Namespaces & cgroups

Docker コマンドを実行すると、裏側では containerd がコンテナを管理し、runC がコンテナを起動します。

🏗 Kubernetes の場合

Kubernetes (kubelet) → containerd → runC → Linux Namespaces & cgroups

Kubernetes でも、containerd がコンテナ管理を担当し、実際のコンテナ実行は runC が行っています。

つまり、Docker でも Kubernetes でも、最終的には containerd と runC のコンビが動いている ということですね。


まとめ

最後に、もう一度整理すると…

  • containerd は「管理者」 → コンテナの作成・管理・API の提供を担当

  • runC は「作業者」 → 実際にコンテナを起動・実行する

  • containerd は runC を使ってコンテナを動かす

  • Docker も Kubernetes も containerd / runC を使ってコンテナを動かしている

イメージとしては、containerd が「現場監督」、runC が「作業員」 という関係です。

こう考えると、それぞれの役割がしっくりきますね!

いいなと思ったら応援しよう!