HN 日本語サマリー

← 一覧へ戻る
インフラ・DevOps

OCIイメージをコンテナまたはFirecrackerマイクロVMとして実行可能に

You can now run same OCI images as containers or Firecracker microVMs (github.com)

30 pointsby pullrun8 コメント

要約

Pullrunは、同じOCIイメージをコンテナ、FirecrackerマイクロVM、Apple Silicon VM、Kubernetesワークロード、AIエージェントタスクなど、多様な実行ターゲットで動作させる新しいツールです。デーモン不要で、コンテンツアドレス指定のDAGストアとP2Pイメージ配布により、インフラストラクチャの複雑さを解消し、ストレージの効率化とセキュリティ向上を実現します。

全文翻訳

Pullrun One OCIイメージ。あらゆる実行ターゲット。CLI + ランタイムは25MB未満。同じOCIイメージをコンテナ、FirecrackerマイクロVM、Apple Silicon VM、Kubernetesワークロード、またはAIエージェントタスクとして実行します。デーモン不要。オーバーレイFS不要。個別のVMイメージ不要。 ⚡ 30秒インストール • 🚀 クイックスタート • 🏗️ アーキテクチャ • 🎯 Pullrunを選ぶ理由 • 🗺️ 機能マップ • ☸️ Kubernetes • 🤖 AIエージェント ⚡ Pullrunとは? Pullrunは、同じOCIイメージをコンテナまたはVMとして実行します。レイヤーをコンテンツアドレス指定のDAG(オーバーレイFSなし)に格納し、ブロックをピアツーピアで同期し、約14MBのCLIと約6MBのランタイムデーモンとして提供します。 これが重要な理由: 現代のインフラストラクチャは、開発用のDocker、本番用のcontainerd、分離用のFirecracker、Kubernetes用のCRI、AI用のMCPエージェントなど、多くの実行エンジンを使用しています。これらはすべて同じOCIイメージを実行しているにもかかわらず、それぞれ独自のイメージフォーマット、ストレージ、運用モデルを持っています。Pullrunはこれらのレイヤーを1つのランタイムに統合します。 主な差別化要因: 同じイメージからのコンテナとVM — 個別のVMビルドステップやVMイメージフォーマットは不要 コンテンツアドレス指定のDAGストア — ゼロコピーmmap読み取り、コンテンツハッシュによる重複排除、すべてのノードでバイト単位で同一 P2Pイメージ配布 — クラスタあたり1回のレジストリプル、残りはLAN速度でのピアツーピア同期 約14MBのCLI + 約6MBのランタイムデーモン(ストリップ済み) — デフォルトではデーモン不要(CLIのみのpullrun run)、バックグラウンドサービスにはオプションのデーモン また、Kubernetes CRIシム(ベータ版)、Docker Composeサポート、AIエージェント用のMCPサーバー、ポリシーエンジン(Cosign、SBOM、seccomp)、P2P同期レイヤー、AES-256-GCM暗号化されたシークレット — これらすべてが同じバイナリに含まれています。 # Apple Silicon VM(macOSデフォルト) — 3秒 pullrun run alpine:3.18 --cmd "echo" --cmd "hello pullrun" --attach -t # FirecrackerマイクロVM(Linux) — 400ミリ秒 pullrun run alpine:3.18 --backend vm --cmd "echo" --cmd "hello pullrun" --attach -t # コンテナ(Linux) — 400ミリ秒 pullrun run alpine:3.18 --cmd "echo" --cmd "hello pullrun" # Windows WSL2 — 同じイメージ、同じコマンド、同じストア pullrun.exe run alpine:3.18 --cmd "echo" --cmd "hello pullrun" 📦 インストール # 1つのコマンド、あらゆるプラットフォーム curl -fsSL https://github.com/pullrun/pullrun/raw/main/install.sh | bash プラットフォーム macOS brew tap pullrun/tap && brew install pullrun → ネイティブバイナリ、Xcode不要 Linux APTパッケージまたは直接ダウンロード、systemdサービス(コンテナにはrunc、VMには/dev/kvmが必要) Windows pullrun.exe + WSL2自動プロビジョニング、runc + Firecracker 手動インストールオプション # macOS(Homebrew — 事前ビルド済み、ビルド依存なし) brew tap pullrun/tap && brew install pullrun # ソースから make build && export PATH="$PWD/bin:$PATH" # クロスコンパイル Windows CLI cd cli/pullrun && GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -o pullrun.exe . 🚀 クイックスタート # ── 任意のOCIイメージをプル ────────────────────────────────────────── pullrun pull alpine:3.18 # 968ミリ秒 — ベンチマークスクリプトはhack/bench.shにあります # ── コンテナとして実行(Linux) ───────────────────────────────── pullrun run alpine:3.18 --cmd "echo" --cmd "hello pullrun" # ── マイクロVMとして実行(macOS/Linux) ───────────────────────────── pullrun run alpine:3.18 --backend vm --cmd "echo" --cmd "hello" --attach -t # ── デタッチ可能なインタラクティブシェル ────────────────────────────── pullrun run alpine:3.18 --tty --attach --cmd /bin/sh # Ctrl-P Ctrl-Q → デタッチ(ワークロードは実行を継続) # pullrun exec <id> -t /bin/sh → 再アタッチ # ── バックグラウンドワークロード ──────────────────────────────────────── pullrun run alpine:3.18 --cmd /bin/sleep --cmd 3600 # ── ビルド&プッシュ(Dockerデーモン不要) ───────────────────── pullrun build ./Dockerfile . -t myapp:latest pullrun build ./Dockerfile . -t myapp:latest --platform linux/amd64,linux/arm64 pullrun push <root-digest> ghcr.io/myorg/myimg:latest # ── エアクールド環境用のエクスポート/インポート ─────────────────────────────── pullrun save <digest> -o myimage.tar pullrun load -i myimage.tar # ── Compose(別バイナリ) ──────────────────────────────── pullrun-compose up -f myapp/compose.yml # コンテナ(Linuxでデフォルト) pullrun-compose up -f myapp/compose.yml --backend vm # 同じコンポーズ、VM分離 pullrun-compose logs -f pullrun-compose down # ── ライフサイクル ────────────────────────────────────────────────── pullrun list # すべてのワークロード(保留中/実行中/終了) pullrun stop <id> pullrun exec <id> /bin/echo hello # デタッチされたワークロードに再アタッチ(新しいPTYを割り当て) pullrun exec <id> -t -- /bin/sh # または、新しいシェルなしで双方向I/Oストリーミングの場合: pullrun workload run <id> # ── イメージ管理 ────────────────────────────────────────── pullrun images # ローカルDAGストアでプルされたイメージをリスト pullrun rmi alpine:3.18 # イメージを削除、到達不能なレイヤーをカスケード削除 pullrun rmi sha256:abc... # ダイジェストでも機能します # ── GC(DAGストアガベージコレクション) ───────────────────────── pullrun gc # ドライラン — 削除されるものをレポート pullrun gc --apply # 実際に到達不能なノードを削除 pullrun gc --apply --force # 90%の安全ガードをバイパス # ── イベント&統計 ───────────────────────────────────────────── pullrun events --types=WORKLOAD_STARTED,POLICY_DENIED pullrun stats <id> # ── ネットワーク ──────────────────────────────────────────── pullrun network create my-net --subnet 10.43.1.0/24 pullrun run alpine:3.18 --net bridge # ── シークレット ──────────────────────────────────────────── pullrun secret create db_password - # 標準入力から pullrun run myapp:latest --secret db_password # ── 設定 ──────────────────────────────────────────────────── pullrun config create nginx.conf ./nginx.conf # ファイルから pullrun config create nginx.conf - # 標準入力から pullrun run nginx:latest --config nginx.conf # ── Diff & Inspect ───────────────────────────────────────────── pullrun diff <id> pullrun inspect <id> pullrun commit <id> myapp:snapshot # ── ログイン ────────────────────────────────────────────────────── pullrun login ghcr.io pullrun logout # ── MCP(AIエージェント) ──────────────────────────────────────────── pullrun mcp # stdioモード(opencode、Claude Code用) pullrun mcp --sse :8080 # SSEモード(リモートエージェント用) # ── P2P同期 ─────────────────────────────────────────────────── pullrun-runtime daemon --sync-addr 0.0.0.0:9500 🎯 Pullrunを選ぶ理由 🏗️ アーキテクチャがすべて DockerのオーバーレイFSストアはファイルシステムオーバーレイです — オーバーレイFSの脆弱性(CVE-2023-0386、CVE-2023-32629)により、コンテナがホストにエスケープする可能性があります。Pullrunのコンテンツアドレス指定DAGストアはレイヤーをそのまま格納し、コンテンツハッシュで検証します。オーバーレイFSはなく、エスケープもありません。 Pullrunは、ストレージバックエンドに関係なく、すべてのコンテナに影響する共有カーネルのクロスコンテナリスク(例: カーネルページキャッシュのバグであるCVE-2026-31431("Copy Fail"))も軽減します。FirecrackerやApple VirtualizationのようなVMごとのカーネル分離は、これらを完全に封じ込めます。DAGストアにより、VMパスはゼロコストになります:同じイメージ、個別のVMビルドステップなし。 Pullrunはデフォルトでルートレスでも動作します — sudo不要、TCPソケットでリッスンするデーモン不要、中央のdockerdからの攻撃対象領域がありません。 🔥 同じイメージからコンテナとVMを提供する唯一のランタイム バックエンド 分離 Pullrun Docker Podman Linuxコンテナ(runc) プロセス ✅ ✅ ✅ FirecrackerマイクロVMs VMごとのカーネル ✅ ❌ ❌ Apple Silicon VMs VMごとのカーネル ✅ ❌ ❌ Windows WSL2コンテナ プロセス ✅ ✅ ❌ Windows Firecracker VMs VMごとのカーネル ✅ ❌ ❌ 同じイメージ、あらゆる分離レベル。個別のVMイメージビルドステップなし。OCIマニフェストがVMルートFSです。 🧬 コンテンツアドレス指定DAGストア Pullrunのストアはrkyv + mmap上に構築されています。OCIレイヤーは一度だけ格納され、コンテンツハッシュによって重複排除され、直接mmap()されます — tar展開不要、オーバーレイFS不要、データを所有するdockerdプロセス不要。sha256: ダイジェストはグローバルに一貫しています。alpine:3.18をプルしたすべてのノードは、ディスク上にバイト単位で同一のファイルを格納します。これにより、P2P同期が容易になります:ブロックはコンテンツハッシュで検証され、差分のみが転送され、クラスタ全体で重複排除されます。 📊 数字で見る メトリック Pullrun Docker 最初のalpine:3.18プル 968ミリ秒 約2秒 コンテナ実行レイテンシ 約400ミリ秒 約800ミリ秒 Apple Virt VM起動 160ミリ秒 該当なし Firecracker VMコールド