📦

【2026年1月】コンテナランタイム周辺の調査メモ:Docker以外に何があるのか、今どうなっているのか

に公開

この記事について

コンテナランタイムについて調べ直したのでメモを残します。

「コンテナランタイム」という言葉は文脈によって指すものが異なります。低レベルのOCI Runtime、高レベルのCRI Runtime、Docker/Podmanのようなエンジン全体。このあたりを整理しつつ、2026年1月時点の状況をまとめました。


目次

  1. コンテナ技術のレイヤー構造
  2. 低レベルランタイム(OCI Runtime)
  3. 高レベルランタイム(CRI Runtime)
  4. コンテナエンジン / CLI
  5. イメージビルドツール
  6. ここ数年の流れ
  7. 今後について

コンテナ技術のレイヤー構造

コンテナ技術は大きく3層に分かれている。

ユーザー向けレイヤー

ユーザーが直接操作するツール群。docker runpodman build などのコマンドを提供する。

高レベルランタイム(CRI Runtime)

CRI(Container Runtime Interface)はKubernetesがコンテナランタイムと通信するための標準インターフェース。containerdやCRI-Oがこれを実装している。

低レベルランタイム(OCI Runtime)

OCI(Open Container Initiative)はコンテナの標準仕様を策定する団体。OCI Runtime Specに準拠したランタイムが実際にコンテナを起動する。

Linuxカーネル

  • namespaces: プロセス、ネットワーク、ファイルシステムなどを隔離するLinuxカーネルの機能
  • cgroups: CPU、メモリなどのリソース使用量を制限するLinuxカーネルの機能
  • seccomp: システムコール(カーネルへの命令)を制限するセキュリティ機構
  • SELinux: アクセス制御を強制するセキュリティモジュール

各レイヤーの役割

レイヤー 役割 具体例
コンテナエンジン / CLI ユーザーインターフェース、イメージのpull/push/build、ネットワーク設定、ボリューム管理 Docker, Podman, nerdctl
高レベルランタイム (CRI) コンテナのライフサイクル管理、イメージ取得、Kubernetes連携 containerd, CRI-O
低レベルランタイム (OCI) コンテナの起動・停止、namespace/cgroups操作 runc, crun, gVisor, Kata

低レベルランタイム(OCI Runtime)

OCI標準

2015年にDocker社がOpen Container Initiative (OCI) を設立。コンテナ技術の標準化が目的。

  • OCI Runtime Specification: コンテナの起動・停止・管理の仕様
  • OCI Image Specification: コンテナイメージのフォーマット仕様

これにより、異なるランタイム間でもイメージやコンテナの互換性が保たれる。

主要なOCI Runtime:標準実装

runc

  • OCIのリファレンス実装(公式の参照実装)
  • 多くの環境でデフォルトとして使われる代表的なOCI Runtime
  • Go言語で記述

主要なOCI Runtime:パフォーマンス重視

crun

  • Red Hat開発、C言語実装
  • runcより起動が速い傾向があり、リソース効率の観点で選ばれることがある

youki

  • Rust製、日本人開発者が主導
  • メモリ安全性重視(Rustの特性を活かしてメモリ関連のバグを防ぐ)
  • Podmanで利用可能
  • 実験段階

主要なOCI Runtime:セキュリティ重視

gVisor (runsc)

  • Google開発
  • ユーザー空間でLinuxカーネルを再実装し、システムコール(アプリがカーネルに送る命令)を傍受・処理
  • カーネル脆弱性の影響を受けにくい
  • 一部システムコール未実装など互換性の制約があり、ワークロードによってはオーバーヘッドが出る
  • Google Cloud Run、GKE Sandboxで使用されている

gVisorのアーキテクチャ

  • Sentry: ユーザー空間で動作する擬似カーネル。アプリからのシステムコールを受け取り、大部分を自前で処理する
  • Gofer: ファイルシステムへのアクセスを代理で行うプロセス

Kata Containers

  • 各コンテナが独自カーネルを持つ軽量VM(microVM)として動作
  • ハードウェアレベルの隔離(VMと同等のセキュリティ)
  • 強い分離が必要なワークロードでの選択肢になる
  • AWS Firecracker(Lambda基盤)も同様の思想
  • Confidential Computing(後述)と組み合わせる構成もある

通常のコンテナとKata Containersの違い

通常のコンテナ(runc):

Kata Containers:

通常のコンテナは1つのカーネルを共有するが、Kata Containersは各コンテナが独自のカーネルを持つ。

選択基準

要件 選択肢
特になし runc
起動速度・リソース効率 crun
マルチテナント・セキュリティ強化 gVisor
最高レベルの分離 Kata Containers
Rust・特定のエコシステム youki

高レベルランタイム(CRI Runtime)

KubernetesとCRIの経緯

Kubernetesは当初Dockerに直接依存していたが、柔軟性のためCRI(Container Runtime Interface)を導入した。

dockershim: KubernetesがDockerと通信するためのアダプター。CRI導入後は不要になり削除された。

dockershim削除前のアーキテクチャ

kubelet(Kubernetesのノードエージェント)がdockershimを経由してDockerを呼び出し、さらにcontainerdを経由するという冗長な構成だった。

dockershim削除後のアーキテクチャ

kubeletがcontainerdまたはCRI-Oと直接通信する構成になった。

containerd

  • 元Dockerの内部コンポーネント、CNCF(Cloud Native Computing Foundation)に寄贈
  • v2.0でメジャーアップデート(設定フォーマットの見直し等)
  • GKE、EKS、AKS等のマネージドKubernetesで使用
  • Kubernetesで広く使われているCRI Runtimeの一つ
  • gRPC: Googleが開発した高速なRPC(リモートプロシージャコール)フレームワーク
  • CNI: Container Network Interface。コンテナのネットワーク設定を行う標準インターフェース
  • スナップショット: ファイルシステムの差分を効率的に管理する仕組み

containerd 2.x(設定まわりの要点)

containerdは設定ファイルにバージョンがあり、2.xではversion = 3が推奨。

  • Version 3(containerd 2.xで推奨): containerd 2.0で導入。プラグインIDなどが一部変更
  • Version 2(containerd 1.xで推奨): containerd 1.3で導入。2.xでもサポート
  • Version 1(デフォルト): containerd 1.0で導入。containerd 2.0で削除

また、NRI(Node Resource Interface)などの機能は「利用できる機能」として把握し、実際に有効化されるか・既定値がどうかは導入環境と設定で確認するのが安全。

CRI-O

  • Red Hat主導
  • Kubernetes専用設計、最小限の機能
  • Kubernetesリリースサイクルと同期
  • OpenShift(Red HatのKubernetesディストリビューション)で標準使用

containerdとCRI-Oの比較

観点 containerd CRI-O
汎用性 Kubernetes以外でも使用可 Kubernetes専用
機能 多機能 最小限
採用 マネージドK8sの大半 OpenShift中心
アタックサーフェス 標準的 小さい(機能が少ない分、攻撃対象も少ない)

RuntimeClass

Kubernetes 1.14で導入。Pod単位でランタイムを選択可能。

apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: gvisor
handler: runsc
---
apiVersion: v1
kind: Pod
metadata:
  name: untrusted-workload
spec:
  runtimeClassName: gvisor
  containers:
    - name: app
      image: nginx

用途別のランタイム選択例


コンテナエンジン / CLI

Docker Desktop有料化

2021年8月にライセンス変更。従業員250人以上または年間売上1,000万ドル以上の企業は有料。個人・小規模企業・教育・OSSは無料継続。

主要なコンテナエンジン

デスクトップ向けGUI

CLI

バックエンド

Docker Engine / Docker Desktop

  • dockerd: Docker Daemon。常駐プロセスとしてコンテナを管理する
  • BuildKit: 次世代のイメージビルドエンジン
  • エコシステムが充実、ドキュメントが豊富
  • Docker EngineはApache 2.0ライセンスのOSS

Podman

デーモンレスアーキテクチャ。各コンテナが独立したプロセスとして動作。

Dockerの場合

Podmanの場合

  • デーモンレス: 常駐プロセスが不要。dockerdのような単一障害点がない
  • conmon: Container Monitor。各コンテナの監視プロセス

コンポーネント

コンポーネント 役割
podman メインCLI、Docker互換コマンド
conmon コンテナごとの監視プロセス
crun デフォルトOCIランタイム
Buildah イメージビルドツール
Skopeo イメージ転送・検査ツール
Podman Desktop GUIツール

Pod機能

KubernetesのPod(複数コンテナをグループ化する単位)と同じ概念をローカルで再現できる。

# Podを作成
podman pod create --name myapp -p 8080:80

# Podにコンテナを追加
podman run -d --pod myapp nginx
podman run -d --pod myapp redis

# Kubernetes用YAMLを生成
podman generate kube myapp > myapp.yaml

# YAMLからPodを起動
podman play kube myapp.yaml

Rootless

設計段階からRootless前提。コンテナ内rootはホスト上の非特権ユーザーにマッピング。

コンテナ内でrootとして動作しても、ホスト上では一般ユーザー権限。万が一コンテナから脱出されてもホストのroot権限は奪われない。

Quadlet

Podman 4.4以降。systemd(Linuxのサービス管理システム)のユニットファイルとしてコンテナを管理。

# ~/.config/containers/systemd/nginx.container
[Container]
Image=docker.io/nginx:latest
PublishPort=8080:80

[Service]
Restart=always

[Install]
WantedBy=default.target

採用状況

  • RHEL系を中心に標準ツールとして採用されることが多い
  • Podman Desktopのプロジェクト区分(CNCF等)は都度公式発表を要確認

nerdctl

containerd用Docker互換CLI。

機能 説明
Docker CLIと同じコマンド体系 学習コストが低い
Compose対応 docker-compose.ymlがそのまま使える
lazy-pulling eStargz形式によりイメージ全体をダウンロードせずにコンテナを起動可能
暗号化イメージ OCICryptによるイメージの暗号化に対応
Wasmネイティブサポート WebAssemblyをコンテナとして実行可能

Rancher Desktop、Lima、Finchで使用されている。

Colima

macOS向け軽量ツール。Lima(Linux virtual machine)ベース。

brew install colima docker
colima start
colima start --runtime containerd
colima start --cpu 4 --memory 8 --disk 100
colima start --kubernetes

OrbStack

macOS専用、パフォーマンス特化。

特徴 説明
起動約2秒 Docker Desktopより高速
動的メモリ管理 使用量に応じてメモリを確保・解放
ドメインアクセス container-name.orb.local でコンテナにアクセス可能
Docker互換 Docker CLI、Composeがそのまま動作
価格 有料(個人は無料)

Rancher Desktop

特徴 説明
ランタイム選択 containerd/dockerdを切り替え可能
Kubernetes統合 k3s(軽量Kubernetes)によるローカルK8s環境

LXC / LXD (Incus)

システムコンテナ。Docker/Podmanの「アプリケーションコンテナ」とは異なる。

観点 アプリケーションコンテナ システムコンテナ
起動対象 単一プロセス 完全なOS(init含む)
用途 マイクロサービス VM代替、開発環境
ライフサイクル 短命(使い捨て) 長寿命(アップデートして使い続ける)

2023年にCanonicalの方針変更によりIncusがフォーク。

機能比較

機能 Docker Podman nerdctl LXD
Rootless 後付け対応 設計時から対応 対応 限定的
デーモンレス × ×
Pod × ×
Compose ×
K8s YAML生成 × ×
systemd統合 限定的 Quadlet 限定的

選択基準:macOS

選択基準:Linux

選択基準:Windows


イメージビルドツール

統合型

スタンドアロン

転送・検査

BuildKit

Docker 18.09以降に搭載された次世代ビルドエンジン。

機能 説明
並列ビルド DAG(有向非巡回グラフ)に基づいて依存関係のないステップを並列実行
効率的なキャッシュ レイヤー単位でキャッシュを再利用
シークレットマウント 秘密情報をビルド時のみ利用可能にし、イメージには含めない
SSHエージェント転送 SSH鍵をイメージに残さずにプライベートリポジトリからクローン可能
マルチプラットフォーム 複数アーキテクチャ(amd64、arm64等)向けに同時ビルド
# syntax=docker/dockerfile:1
FROM golang:1.21

# シークレットマウント:ビルド時のみ利用可能
RUN --mount=type=secret,id=github_token \
    GITHUB_TOKEN=$(cat /run/secrets/github_token) \
    go get private-repo.com/pkg

# キャッシュマウント:ビルドキャッシュを永続化
RUN --mount=type=cache,target=/root/.cache/go-build \
    go build -o /app

Buildah

Red Hat製のイメージビルド専用ツール。

特徴 説明
デーモン不要 dockerdなしでビルド可能
Dockerfileなし シェルスクリプト的にイメージを構築可能
中間イメージなし ディスク効率が良い
container=$(buildah from fedora)
buildah run $container dnf install -y nginx
buildah config --cmd "/usr/sbin/nginx -g 'daemon off;'" $container
buildah commit $container my-nginx

Kaniko

Kubernetes環境向けビルドツール。Googleがメンテナンスしているが、近年はBuildKitやkoの利用が拡大している。ただし、特権を持たない特定のCI環境では依然として重要な選択肢である。

特徴 説明
特権不要 Docker daemonやroot権限なしでビルド
K8sネイティブ Kubernetesのジョブとして実行可能
apiVersion: v1
kind: Pod
metadata:
  name: kaniko-build
spec:
  containers:
  - name: kaniko
    image: gcr.io/kaniko-project/executor:latest
    args:
    - "--dockerfile=Dockerfile"
    - "--context=git://github.com/myrepo/myapp"
    - "--destination=myregistry.com/myapp:latest"

ko

Go専用ビルドツール。

# Dockerfileなしでビルド&プッシュ
ko build ./cmd/myapp

# Kubernetesマニフェストに直接埋め込んでデプロイ
ko apply -f deployment.yaml

GoのソースコードからDockerfileを書かずに直接コンテナイメージを生成できる。

Skopeo

イメージの転送・検査専用ツール。

# レジストリ間でイメージをコピー(ローカルにpull不要)
skopeo copy docker://docker.io/nginx docker://myregistry.com/nginx

# イメージのメタデータを確認(pull不要)
skopeo inspect docker://docker.io/nginx

# マルチアーキテクチャのマニフェストを確認
skopeo inspect --raw docker://nginx | jq

ここ数年の流れ

時系列

現在の市場

※利用状況の割合は出典により大きく変動するため、本記事では断定的な割合は置かない。

領域 主な選択肢 理由
本番Kubernetes containerd 軽量・高速、CNCF標準
開発環境 Docker エコシステム、ドキュメント
セキュリティ重視 Podman Rootless・デーモンレス
OpenShift CRI-O Red Hat標準

セキュリティランタイムのレベル

レベル ランタイム ユースケース
標準 runc 一般ワークロード
強化 gVisor マルチテナント
最強 Kata 金融・医療
機密 Confidential Containers AI/ML機密データ

Confidential Computing: ハードウェアレベルでメモリを暗号化し、クラウド事業者でさえもデータにアクセスできないようにする技術。Intel SGX、AMD SEV、ARM CCAなどが対応。NVIDIAがKata Containers + Confidential ContainersでGPUワークロード保護を進めている。

WebAssembly(Wasm)

コンテナの次世代技術として注目されている。

観点 コンテナ WebAssembly
サイズ 数百MB〜GB KB〜数MB
起動時間 数百ms 数ms
隔離方式 OS namespace サンドボックスVM
ポータビリティ OS/アーキテクチャ依存 完全ポータブル
言語 制限なし Rust, Go, C/C++等
  • WASI: WebAssembly System Interface。ファイルやネットワークなどのシステムリソースにアクセスするための標準API
  • WASI 0.2(Component Model/WIT 系)などの動きが進んでいる
プロジェクト 状況
wasmCloud 継続的に開発が進む(プロジェクト区分は要確認)
containerd Wasmサポート追加(実験的)

eBPF

eBPF(extended Berkeley Packet Filter)がコンテナのネットワーキング・可観測性で標準化。

  • eBPF: カーネル内でプログラムを実行できる技術。ネットワーク処理やセキュリティ監視を高速に行える
  • iptables: 従来のLinuxファイアウォール/パケット処理機構。ルールが複雑になると性能が低下

Cilium、CalicoなどのCNIプラグインがiptablesの代替としてeBPFを使用。


今後について

トレンド

トレンド 内容
マルチランタイム runc/gVisor/Kata/Wasmの併用が標準化
Confidential Computing AI/MLでハードウェア暗号化が標準化
WebAssembly エッジ・サーバーレスでコンテナの代替
サプライチェーンセキュリティ イメージ署名、SBOM、attestationが必須化
  • SBOM: Software Bill of Materials。ソフトウェアの部品表。含まれるライブラリやその依存関係を一覧化したもの
  • attestation: 証明。ビルド環境やプロセスが改ざんされていないことを検証可能にする仕組み

開発環境

本番K8s

エッジ/サーバーレス

OCI Runtime


まとめ

  1. 標準化完了: OCI/CRIでコンポーネント交換可能
  2. 棲み分け: 開発はDocker、本番はcontainerd、セキュリティはPodman
  3. セキュリティ選択肢: Rootless → gVisor → Kata → Confidential Computing
  4. 次世代移行: Wasmがエッジ・サーバーレスから浸透
  5. 可観測性進化: eBPFによるカーネルレベル監視が標準化
ユースケース 構成
スタートアップ・個人 Docker Desktop / Colima
エンタープライズ開発 Podman + Podman Desktop
本番Kubernetes containerd
マルチテナントSaaS containerd + gVisor
金融・医療 containerd + Kata Containers
エッジ・IoT WebAssembly
AI/ML機密処理 Kata + Confidential Containers

参考リンク


Discussion