container runtime とは?コンテナを実行するソフトウェア
container runtime とは、イメージからコンテナを実際に起動・実行するソフトウェアであり、Docker や Kubernetes のような高レベルなツールの下にある層です。
コンテナを実行するとき、何かが namespace と cgroup を設定し、イメージを展開し、プロセスを起動しなければなりません。その「何か」が container runtime です。2つのレベルがあります - イメージと lifecycle を管理する高レベル runtime と、カーネルレベルの作業を行う低レベル runtime です - そしてこの区分を知ると、多くの混乱が解けます。
高レベルと低レベルの runtime
containerd や CRI-O のような高レベル runtime は、イメージ、storage、コンテナの lifecycle を管理します。その後、隔離されたプロセスを実際に作る syscall を行うために、runc のような低レベル runtime を呼び出します。Docker は内部で containerd を使います。
Docker の位置づけ
Docker は厳密な意味では runtime そのものではありません - それは containerd に委任する高レベルなプラットフォームであり、containerd はさらに runc に委任します。この階層化こそが、同じ containerd が Docker と Kubernetes の両方に対応できる理由です。
Kubernetes における CRI
Kubernetes は Container Runtime Interface(CRI)を通じて runtime と対話します。だからこそ Kubernetes は組み込みの Docker shim を廃止しました - node に Docker を必要とせず、containerd や CRI-O と直接 CRI で対話します。
代替の runtime
- runc - 標準の OCI 低レベル runtime。
- gVisor と Kata - sandbox や microVM によるより強力な隔離。
- CRI-O - Kubernetes 向けに作られた軽量な CRI runtime。
runtime と CI
CI runner は container runtime を使って job を実行し、イメージを build します。直接それと関わることはめったにありませんが、それこそが作業を行うエンジンであり - よく管理された runner はそれを健全に保ち、job が確実に開始できるようにします。
重要なポイント
- container runtime は、イメージからコンテナを起動・実行します。
- 高レベル runtime(containerd、CRI-O)が、カーネル作業のために低レベルの runtime(runc)を呼び出します。
- Kubernetes は CRI を介して runtime と対話します - node に Docker は不要です。