Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
コンテナランタイムはじめの一歩 / Container Runtime 101
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kohei Ota
August 22, 2020
Technology
6k
16
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
コンテナランタイムはじめの一歩 / Container Runtime 101
Kohei Ota
August 22, 2020
More Decks by Kohei Ota
See All by Kohei Ota
CloudNative Meets WebAssembly: Exploring Wasm's Potential to Replace Containers
inductor
4
3.7k
The Cloud Native Chronicles: 10 Years of Community Growth Inside and Outside Japan
inductor
0
210
Cracking the KubeCon CfP
inductor
2
950
KubeCon Recap -Platform migration at Scale-
inductor
1
1.1k
コンテナビルド最新事情 2022年度版 / Container Build 2022
inductor
3
610
データベースとストレージのレプリケーション入門 / Intro-of-database-and-storage-replication
inductor
28
6.7k
KubeConのケーススタディから振り返る、Platform for Platforms のあり方と その実践 / Lessons from KubeCon case studies: Platform for Platforms and its practice
inductor
3
1.1k
オンラインの技術カンファレンスを安定稼働させるための取り組み / SRE activity for online conference platform
inductor
1
1.4k
Kubernetesネットワーキング初級者脱出ガイド / Kubernetes networking beginner's guide
inductor
23
8k
Other Decks in Technology
See All in Technology
Browser Spec: Testing Hotwire with Ruby
takahashim
1
160
DevelopersIO2026 -バックアップは“消されないこと”が9割-
yoshida0129
0
350
AWSDirectConnectの構築の進め方を整理してみた
masa_my
1
150
Let's Change Our World—Again
snoozer05
PRO
5
380
Claude for Google Workspaces ポン出し/claude-for-google-workspace-slide-conversion
emiki
0
350
Claude Code をローカルとサーバー上で利用した際の Bedrock 利用料をユーザー単位で一本化してみる
ohorig
0
120
2026-10-24 JAWS JAWS-UG 茨城 #18 IAM Policy Autopilotってなにさ。terraform planからIAM Policyつくれるの? / What's IAM Policy Autopilot
masasuzu
0
110
sue445's proposals 2026
sue445
0
130
野蛮なアジャイル [サイボウズ発!]組織の常識を覆した反骨のスクラム実践記 / Barbaric Agile - Enterprise Agile Study Group
ama_ch
0
130
オントロジーって 結局なにもの? AI エージェントに「意味」を渡す知識設計の話
greenmidori
0
260
Turning Repos into the Product Second Brain with an LLM Wiki
linedevth
0
140
AI × アーキテクト 第1・2章|生成AIの課題とアーキテクトの素養
daidaidai
1
230
Featured
See All Featured
Six Lessons from altMBA
skipperchong
29
4.5k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Designing for Performance
lara
612
70k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
1k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
400
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.3k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Faster Mobile Websites
deanohume
310
32k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
540
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
67k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
590
Transcript
コンテナランタイム はじめの一歩 Container Runtime Meetup #2 Presented by @inductor
自己紹介
自己紹介 名前: 太田 航平 (@inductor) 所属: HPE (Hewlett Packard Enterprise)
役職: ソリューションアーキテクト (Cloud Native and DevOps) Docker MeetupとかCloud Native Daysの運営、謎のアンバサダー業 好きなこと: 無限にスケールする(無限にスケールするとは言ってない)インフラ
コンテナの仕組み
コンテナの仕組み 雑に言えばすごいchroot → 特定のディレクトリをルートディレクトリに見立てて仕切りを作る技術 例: ホスト上の /var/docker/container1 をルートにしてそれ以下で別のOSが動くため の環境を作るみたいなことができる 隔離したファイルシステムに対してnamespaceで分離したユーザー、プロセス、NWな
どを割り当て、cgroupsで利用できるリソース量を制限すると、まるでVMみたいなもの をプロセスの単位で作れるみたいなやつ
コンテナの仕組み / /home /var /tmp /var/a /var/b /var/c /tmp/d
コンテナの仕組み / /home /var /tmp /var/a /var/b /var/c /tmp/d /
/ / / pivot_root pivot_root pivot_root pivot_root あるディレクトリをルートに見せかける pivot_root
コンテナの仕組み / /home /var /tmp /var/a /var/b /var/c /tmp/d /
/ / / namespace namespace namespace namespace ユーザーIDやNW、プロセス空間などを分離する namespace root 10.0.0.1/24 root 10.0.0.2/24 root 10.0.0.3/24 root 10.0.0.3/24
コンテナの仕組み / /home /var /tmp /var/a /var/b /var/c /tmp/d /
/ / / アプリケーションが動作するために必要なファイルたちを tar.gz形式でパッケージングしてこいつらの上にのっけて ... root 10.0.0.1/24 root 10.0.0.2/24 root 10.0.0.3/24 root 10.0.0.3/24 1CPU 2GB 1CPU 2GB 1CPU 2GB 2CPU 4GB nginx on Ubuntu Node on Alpine Ruby on CentOS Debian
/var /tmp コンテナの仕組み / /home /var/a /var/b /var/c /tmp/d /
/ / / 展開したファイルシステムの実行ファイルをプロセスとして起動! 1CPU 2GB 1CPU 2GB 1CPU 2GB 2CPU 4GB nginx on Ubuntu Node on Alpine Ruby on CentOS Debian root 10.0.0.1/24 root 10.0.0.2/24 root 10.0.0.3/24 root 10.0.0.3/24 プロセス起動!
/var /tmp コンテナの仕組み / /home /var/a /var/b /var/c /tmp/d /
/ / / 展開したファイルシステムの実行ファイルをプロセスとして起動! 1CPU 2GB 1CPU 2GB 1CPU 2GB 2CPU 4GB nginx on Ubuntu Node on Alpine Ruby on CentOS Debian root 10.0.0.1/24 root 10.0.0.2/24 root 10.0.0.3/24 root 10.0.0.3/24 プロセス起動! これ1つ1つがコンテナ
/var /tmp コンテナの仕組み / /home /var/a /var/b /var/c /tmp/d /
/ / / 展開したファイルシステムの実行ファイルをプロセスとして起動! 1CPU 2GB 1CPU 2GB 1CPU 2GB 2CPU 4GB nginx on Ubuntu Node on Alpine Ruby on CentOS Debian root 10.0.0.1/24 root 10.0.0.2/24 root 10.0.0.3/24 root 10.0.0.3/24 プロセス起動! これ1つ1つがコンテナ これがコンテナイメージね
コンテナランタイムは何してる?
一連の作業を全部やってくれる
コンテナランタイムの役割 • 高レベルランタイム(containerd, CRI-Oなど) ◦ CRI(gRPC over Unix socket)でKubernetes/Dockerと会話するプロセス(Daemonとして常駐) ◦
コンテナイメージの管理 ◦ 低レベルランタイムのバイナリを実行してコンテナを生成させる • 低レベルランタイム(runC, runsc(gVisor), runnc(Nabla)など) ◦ Daemonではなくバイナリで、高レベルランタイムによって実行される ◦ OCI Specのconfig.jsonを高レベルランタイムから受け取ってコンテナを生成 ◦ Linux namespaceやcgroupの命令を実際に行う
コンテナランタイムの役割(Docker) dockerd docker pull docker run REST API containerd gRPC
runC OCI(containerd内でJSON のコンフィグを渡しながらバ イナリを直接実行) OCI High level runtime Low level runtime
コンテナランタイムの役割(Kubernetes) Kubernetes kubectl run kubectl apply REST API containerd CRI
(gRPC) kube-api-serverとかetcdとか kubeletとかいろいろ含む ※CRIは各ノード上のkubeletが喋る runC OCI(containerd内でJSON のコンフィグを渡しながらバ イナリを直接実行) OCI High level runtime Low level runtime
コンテナランタイムの役割(Kubernetes) Kubernetes kubectl run kubectl apply REST API containerd CRI
(gRPC) kube-api-serverとかetcdとか kubeletとかいろいろ含む ※CRIは各ノード上のkubeletが喋る runC OCI(containerd内でJSON のコンフィグを渡しながらバ イナリを直接実行) OCI High level runtime Low level runtime
Appendix: CRIとOCI Spec • CRI ◦ CNCF(というかKubernetes)が標準化したランタイム規格 ◦ Kubernetesと低レベルランタイムが通信するための API仕様(gRPCによるスキーマ定義
) ◦ CRIはOCI SpecのJSONを生成して低レベルランタイムにコンテナの作成等を依頼する • OCI ◦ OCI(Open Container Initiative)が標準化したコンテナの規格 ◦ CRIから受け取ったJSON Specでコンテナを生成(Linuxカーネルのシステムコールの実行含 ) ◦ runCなどの持つ機能を標準化 (OCI Runtime Spec) ◦ コンテナイメージ仕様の標準化 (OCI Image Spec)
Dockerが使う低レベルランタイム runCの仕組み
runCの仕組み ホストマシン Linuxカーネル コンテナ コンテナ コンテナ runC Docker & CRI
ファイルシステムの展開 プロセスの初期化 イメージの管理
runCの仕組み ホストOS、カーネルはマシンごとに共通 DockerまたはCRIから受けた命令をもとにカーネルに命令を送ってコンテナの実態で あるリソースの隔離を行い、アプリケーションを実行する 普通にやるとホストOSの特権が必要 → runCの脆弱性が見つかる=とても危ない
runCとは違うアプローチで 同じことが実現できないか
AWSが作ったFirecrackerと Googleが作ったgVisorの仕組み
microVMベースのFirecracker
microVMとは 軽量かつ起動が高速で、動的に生成削除されるVMのこと → マイクロ仮想化(Micro-Virtualization)技術で使われるVM Amazonが作っているFirecrackerはmicroVMの思想で作られたOSS → Rust製で125ms程度の速さで起動するのが特徴
microVMの仕組み ホストOS microVM microVM microVM Firecracker CLI or REST Client
ゲストOS ゲストOS ゲストOS ホストカーネルを利用して KVMベースのマシンを起動
コンテナでの利用例 Firecracker-containerd と組み合わせる → Firecracker上のrunCとcontainerdを組み合わせて動かすためのOSS 軽量なVM + Dockerよりも軽量なcontainerdの組み合わせによって Dockerイメージを動かすことができる Fargateと呼ばれるAWSの仮想化技術もこれに準拠したものが使われている
Ref. https://aws.amazon.com/jp/blogs/news/under-the-hood-fargate-data-plane/
コンテナでの利用例 ホストOS microVM microVM microVM Firecracker + runC + containerd
CLI or REST Client ゲストOS ゲストOS ゲストOS コンテナ コンテナ コンテナ ホストカーネルを利用して KVMベースのマシンを起動
microVMのメリット・デメリット 既存のVM技術と比べリソースの割当が柔軟で動的 → REST APIでVMの操作が可能、起動が高速なのでスケールも速い VMであることに変わりはないのでホスト環境との隔離性が高い VMレイヤの起動オーバーヘッドなどが無視できない要件の環境だと厳しい
「サンドボックス」のgVisor
gVisorとは Googleが作ったコンテナランタイム ptrace/KVM版があるが、今回はptraceに関してだけ紹介 Linux上でgVisorを動かすと、「ゲストカーネル」が展開される コンテナでシステムコールが呼ばれると、ptraceでそれをフックし、seccompで呼び出 せるシステムコールをフィルタして、gVisorがフックしたシステムコールを置換して代理 実行する(気になる人はSentryプロセスについて調べよう)
gVisorの仕組み ホストOS コンテナ コンテナ コンテナ gVisorのゲストカーネル
コンテナにカーネルのふりをする Linux上のプロセスがgVisor
他にはないの?
(時間があれば)Unikernelの紹介
Unikernelとは Library OSを用いて特定のアプリケーションに必要なコンポーネントだけを内包した空 間を分離する技術 → カーネルで使わない機能すら排除して、余計なものを入れないという考え方 Library OS、それすなわち、OSがライブラリとして機能する(必要なものだけを入れたも のになる)という本当に最低限の動作環境なのでセキュア・軽量・高速
コンテナでの利用例 IBMが作っているNabla ContainersプロジェクトではUnikernelを採用 低レベルコンテナランタイムとしてRunncを使う → Seccompで使えるシステムコールを制限 → Library OSを使って必要なコンポーネントのみを入れる Unikernelの特性上通常のDockerイメージが使えない
→ ランタイムが使うunikernelのバイナリをイメージに組み込む必要があるため ここからはRunnc(Nabla Containers)前提で話を進めます
Unikernelの仕組み ホストOS Runnc ホスト上のnabla run tender が専用にコンパイルされたア プリのバイナリを読み出して 実行
Unikernelのメリット・デメリット VMと違い環境の分離までは行わずにプロセスとしてコンテナが動くので軽量かつ高 速 不要なカーネルの機能は含まれないため、ホストとの接地点が少ない Unikernelの技術自体の知名度が低く、知見があまりない + Runncというものを導入するハードルの高さ イメージのビルド環境が特殊でフォーマットの互換性もない
Appendix: gVisorとの違い gVisor(Runsc)はユーザー領域にカーネルを再実装したものを展開し、 あたかもそれがシステム領域であるかのように動作する仕組み Unikernelと違ってDockerベースのイメージが動き、Containerdも動作するが、その 下にいるgVisorがLinuxカーネルのフリをして動くことによってホストとの環境を分離 している
まとめ Dockerで使われるrunCには特権を渡す必要がありコンテナ間の隔離性が低いなど の問題がある → 安全で高速な代替のランタイム開発のきっかけになった MicroVMでは隔離性は高いが起動時の遅延がシビアになりやすい gVisorではLinuxカーネルとの互換性が重要な場合の動作保証が難しい Unikernelでは高いパフォーマンスと隔離性の代わりに汎用性が低くなりやすい 要件に合わせていろいろなスタックを組み合わせて使うことで様々な問題を解決する アプローチが現在進行系で(アカデミックな場でも)提案されている
参考資料 KubeCon 報告:コンテナランタイムやFirecrackerの話題ひととおり 振り返ってみよう by 徳永航平さん https://www.slideshare.net/KoheiTokunaga/kubecon-firecracker makocchiさんのスライドいろいろ https://speakerdeck.com/makocchi/ A
Linux in Unikernel Clothing @ EuroSys '20 Firecracker: Lightweight Virtualization for Serverless Applications
では、ここからのセッションを お楽しみください!