Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Linux カーネルが支えるコンテナの仕組み / LF Japan Community Day...

Avatar for tenforward tenforward
October 21, 2025

Linux カーネルが支えるコンテナの仕組み / LF Japan Community Days 2025 Osaka

2025-10-22 LF Japan Community Days の発表資料です。
参考となる情報にはPDF中からリンクをしていますが、資料中のリンクは Speaker Deck 上ではクリックできないので PDF をダウンロードしてご覧ください。

Avatar for tenforward

tenforward

October 21, 2025
Tweet

More Decks by tenforward

Other Decks in Technology

Transcript

  1. 自己紹介(1)   加藤泰文(かとうやすふみ) • X: @ten_forward • Bluesky: tenforward.bsky.social •

    https://github.com/tenforward/ • これがなかったら、ここまで続けてなかった (Findy Engineer Lab モチベの泉) • 仕事はセキュリティやってます 2/26
  2. 自己紹介(2)〜 趣味 今日は趣味のお話をします。 • 推し活(K-POP 方面) • コンテナ ← 今日はコレ!!

    • 古墳 • WRC • 韓国ドラマ • Plamo Linux(メンテナ) • プログレ • ジャズ 3/26
  3. 自己紹介(5)〜 OSS 活動 • コンテナ関連 • LXC • Incus •

    linuxcontainers.org サイト翻訳 • Plamo Linux LXC へのコントリビュート内容については連載に。LXC へのコミット [1]、LXC へのコミット [2] 6/26
  4. コンテナ コンテナとは? • プロセス • 他のプロセスから隔離された仮想的な空間で動くプ ロセス • カーネルのセキュリティ機能により完全武装したプ ロセス

    • プロセスなので起動は速い(通常のプロセスと同等) • さまざまなカーネル内の機能を組み合わせて起動 する • Linux には「コンテナ」という単一の機能はありま せん 8/26
  5. Linux におけるコンテナ Linux でのコンテナ主要 2 大機能 • Namespace 隔離空間を作る(リソースごとに存在) 。対象のリソースがホストや他のコンテナから隔

    離される • cgroup プロセスのグループ(コンテナ)に対して CPU、memory などのリソース制限をかけ る。リソースごとにコントローラーとして実装(例: CPU コントローラー) 。グループは ツリー構造を取る。cgroupfs というファイルシステムをマウントして使用する これだけではなく、他にカーネル内のさまざまな機能を使ってコンテナを作ります。 (必要な 機能だけを使ったコンテナが作れる) 9/26
  6. 太古の昔 軽量な「仮想環境」としてのコンテナは古くから存在している • chroot: プロセスに対して任意のディレクトリをルートとして指定する • 1979 年 UNIX Version

    7 で、1982 年 BSD へ導入 • 今では、代表的なコンテナエンジンでは chroot は使いません • 2000 年代初期に FreeBSD jail, Virtuozzo/OpenVZ(Linux 向け商用コンテナソフトと その OSS 版) 、Linux VServer • ホスティング業者などで軽量な「仮想マシン」として利用(リソース消費が少なく集積度を上 げられるという視点) • システムとしてコンテナを動かすいわゆる「システムコンテナ」 10/26
  7. ファイルシステム系の機能の実装期 かなり古くからコンテナ関連の機能の実装は始まり ます。まずはファイルシステム方面の機能から。 • pivot_root(2.3.41/2000 年)→ root ファイ ルシステムを取り替える。コンテナ専用の独立 したファイルシステム

    • chroot はセキュリティ上の問題があるので汎 用的なコンテナマネージャーでは使えない • bind mount(2.4.0/2001 年)→任意のディレ クトリを mount point に。pivot_root するの に必要 • Mount Namespace(2.4.19/2002 年)→コ ンテナ間でマウント操作を分離できる pivot_root 11/26
  8. Linux コンテナ機能充実期 〜 Namespace 2006〜2008 年にかけてかなりの機能が追加され、Namespace は主要なものが揃った: • コンテナごとに: •

    独自のホスト名が付けられるようになった → UTS Namespace(2.6.19/2006 年) • プロセス間通信を隔離できるようになった → IPC Namespace(2.6.19/2006 年) • 独立した PID が付けられるようになった → PID Namespace(2.6.24/2008 年) • 独立したネットワーク I/F、アドレス、ポート、 ルーティング、フィルタリングが持てるように なった → Network Namespace(2.6.24/2008 年) PID Namespace 13/26
  9. Linux コンテナ機能充実期 〜 cgroup cgroup の新たなコントローラーの実装が進む。 • コンテナごとに: • CPU

    のリソース制限 → cgroup cpu, cpuacct, cpuset コントローラー(2.6.24/2008 年) • デバイスへのアクセス制限 → devices コントローラー(2.6.26/2008 年) • グループ内のタスクを同時に一時停止・再開 → freezer コントローラー(2.6.28/2008 年) • メモリー制限 → memory コントローラー(2.6.29/2009 年) • I/O 制限 → cgroup blkio コントローラー(2.6.33/2010 年) • ネットワーク系の制御 → net_cls(2.6.29/2009 年) 、net_prio コントローラー(3.3/2012 年) 14/26
  10. Linux コンテナ機能充実期 〜 ネットワーク • コンテナ用の仮想インターフェースが持てるよ うになった • veth(2.6.24/2008 年)

    • Virtuozzo/OpenVZ 由来 • 作成すると対となるインターフェースが生成さ れる。その対となるインターフェース間で通信 を行う= L2 のトンネル • 対の片方をホスト、片方をコンテナの Namespace に所属させる(デフォルトでは異 なる Namespace 間でないと通信不可) • macvlan(2.6.23/2007 年) • ホストのインターフェースに異なる MAC アド レスを持つ仮想インターフェースを作成 • ホストのインターフェースと同じネットワーク に接続 veth 15/26
  11. LXC の誕生 コンテナエンジン LXC の誕生(2008 年) • カーネルにコンテナ関連機能が充実してきたもののそれを開発者が試す環境がないので 誕生 •

    0.8 くらいまでは C、シェル、Python プログラムの寄せ集め(イマイチ使いづらい) • 2013 年に Docker が登場した時点では、Docker はコンテナを作る機能を持っていな かった。裏で lxc-start コマンドなどを呼んで、コンテナを起動していた 16/26
  12. コンテナ機能の充実 2009〜2013 年ごろ • 任意のシステムコールのフィルタリングができるようになった(3.5/2012 年、 seccomp、後述) • コンテナ外からコンテナ内に入ってコマンド実行できるようになった→ setns

    システム コール(3.0/2011 年) • ただし、すべての Namespace に対して setns できるようになったのは 3.8 カーネル (2013 年) • User Namespace(3.8/2013 年) • コンテナ内外の UID/GID をマッピングする。コンテナ内では root、ホスト上では一般ユー ザーということが可能→コンテナ内で root 権限が必要であっても安全にコンテナを実行可能 • rootless コンテナ コンテナでシステムやアプリケーションを動かす主要な機能が一通りそろった 17/26
  13. Docker の登場 • Docker の登場(初期 Docker は裏側で LXC を使用) (2013

    年) • ユニオンファイルシステム使用でコンテナイメージを効率的に管理 • ネットワーク経由のコンテナ管理 • Docker 登場後は「コンテナ」≒ 「アプリケーションコンテナ」 • コンテナ内ではアプリケーションのみが起動 • LXC/LXD/Incus などのシステムコンテナ向けランタイムも開発は継続しています 一躍「コンテナ」が話題の技術に!! コンテナ時代の到来 2014 年以降、Docker の登場による「コンテナ」の盛り上がりで、カーネルにコンテナ関連 機能が入りやすい環境になった。 18/26
  14. コンテナ向けファイルシステム 3.18/2014 年、OverlayFS の登場。今や コンテナになくてはならないファイルシ ステム。 (OverlayFS 以前は aufs や

    LVM などを使用) • コンテナイメージの標準(OCI Image Format Specification)で定 められたレイヤー構造を実現するた めに必要なファイルシステム • 複数のディレクトリーの内容を重ね 合わせて 1 つのファイルシステムに 見せるユニオンファイルシステム • (ただし、レイヤー構造はコンテナ に必ず必要な要件ではない) 19/26
  15. cgroup v1 • 機能(制限をかけたいリソースなど。=コントローラー)ごとに徐々に実装が進む • コントローラーごとに個別実装 → 一貫性の欠如 • 汎用性の考慮。高い自由度(しかし制約があり、自由度高く利用されることはなかった)

    • 複数階層構造(システム上にいくつでも cgroup ツリーを作成可能) • 階層構造のどこの cgroup にもタスクが所属できた(親子 cgroup 間の内部タスクの 競合) • システムやコンテナでの利用が拡大するとともに問題点が明らかに • 詳しくは LXC で学ぶコンテナ入門 第 37 回をご覧ください 20/26
  16. cgroup v2 4.5(2016 年)に Stable。 • v1 とのインターフェースの互換性をある程度保って、cgroup をあるべき姿に実装しな おした

    • 規約の整備 • 単一階層構造 • コントローラー間の連携(現実的な I/O 制御が可能に)← v1 の blkio コントローラーは ダイレクト I/O • プロセス単位の管理(スレッド単位で管理できるコントローラーのみスレッド単位で管 理可能) • v1 にあったコントローラーのうち v2 へ移行されなかったコントローラーが存在(主に ネットワーク系) • netfilter では直接 cgroup パスを指定可能(単一階層構造により実現) • eBPF との連携 • コントローラーが有効になっている場合、リーフノードにしかプロセスが所属できない • 制限だけでなくリソースの保証が可能に(例:メモリ保証値の設定) 21/26
  17. セキュリティ機能 ホスト上でカーネルを共有して起動するプロセスであるコンテナを安全に使うには様々なセキュリティ 機能の助けが必要 • seccomp • システムコールがフィルタリングできる機能(最初は特定のシステムコールだけが呼べる 機能) • 任意のシステムコールのフィルタリングができるようになった(3.5/2012

    年、seccomp) • seccomp notify(5.0/2019 年)→システムコールの実行可否をユーザー空間のプログラム 側で判断できる • capability(2.2/1999 年) • root が持つ特権を細分化して必要に応じてプロセスに権限を付与できる • コンテナごとに権限を細かく与えたり剥奪したりできる • User Namespace(3.8/2013 年) • LSM(SELinux, AppArmor,...) 22/26
  18. その後の新機能、改良 最近(2018 年以降くらい?)は、直接コンテナに関連する新機能の実装は少ない。コンテナ とは直接関係なさそうな機能だが、コンテナにとっては重要な機能の実装が進む。 • PSI(4.20/2018 年) • CPU, Memory,

    IO の負荷が増大しリソースが不足している状況を観測可能。cgroup 単位で も観測可能 • pidfd(5.3/2019 年) • PID の循環問題の解決(目的と違うプロセスにシグナル送ってしまう危険性) • Time Namespace(5.6/2020 年) • 独立した uptime(CLOCK_MONOTONIC/CLOCK_BOOTTIME) • clone3 システムコールを使ったコンテナプロセス生成のコスト低減(5.7/2020 年) • 親プロセスと異なる cgroup にプロセスを生成できる • ID mapped Mount(5.12/2021 年) • コンテナイメージをマウントする際、コンテナイメージ内のファイルの所有権を変更 • User Namespace を使った rootless コンテナに重要な機能 • cgroup の misc コントローラー(5.13/2021 年) • 汎用コントローラー。ホスト上の有限個のリソースを cgroup で制限できる 23/26
  19. eBPF 今一番ホットな機能(?)である eBPF。コンテナでの活用も進みます。 • eBPF プログラムを cgroup にアタッチできるようになった(4.10/2017 年) •

    BPF_PROG_TYPE_CGROUP_SKB の導入(2016 年)← eBPF+cgroup の初期コミット • cgroup 内のタスクに対してのみ eBPF プログラムを実行できるようになった • フィルタリング、アカウンティング、ルーティングなど • cgroup v1 の net_cls や net_prio コントローラー以上に柔軟な処理が可能 • cgroup v2 でのデバイスコントローラー(コンテナからデバイスへのアクセス制御) (4.15/2018 年) • 表面的にはデバイスコントローラーは cgroup v2 のツリー内にはでてこなくなった 24/26