コンテナ
プロセスを隔離して、独立した環境のように見せる技術。
仮想マシンとの違い#
[VM] [コンテナ]
アプリ / ゲスト OS アプリ
ハイパーバイザ コンテナランタイム
ホスト OS **ホスト OS(カーネルを共有)**
ハードウェア ハードウェア| VM | コンテナ | |
|---|---|---|
| カーネル | それぞれ持つ | 共有する |
| 起動 | 数十秒 | 1 秒未満 |
| 大きさ | GB | MB |
| 隔離の強さ | 強い | 弱い |
カーネルを共有することが、 軽さの理由であり隔離が弱い理由でもある。
実現する仕組み#
Linux カーネルの機能の組み合わせでできている。
| 機能 | 役割 |
|---|---|
| 名前空間 (namespaces) | 見えるものを分ける(PID、ネットワーク、マウント、UTS、IPC、ユーザ) |
| cgroups | 使える資源を制限する(CPU、メモリ、I/O) |
| ケーパビリティ | root 権限を細分化する |
| seccomp | 使えるシステムコールを制限する |
| OverlayFS | レイヤを重ねたファイルシステム |
「コンテナ」という単一の機能は存在しない。 これらを組み合わせた結果を、そう呼んでいる。
隔離の限界#
カーネルを共有するので、 カーネルの脆弱性はホスト全体に及ぶ。
信頼できないコードを動かす用途では
- gVisor(システムコールを中間層で処理)
- Kata Containers(軽量 VM でくるむ)
- Firecracker(AWS Lambda が使う軽量 VM)
といった、VM との中間的な技術が使われる。
オーケストレーション#
多数のコンテナを管理する仕組み。
| 機能 | 内容 |
|---|---|
| 配置 | どのノードで動かすか |
| 自己修復 | 落ちたら再起動する |
| スケール | 負荷に応じて増減する |
| ローリング更新 | 無停止で入れ替える |
| サービス発見 | 相互の場所を解決する |
Kubernetes が事実上の標準だが、 複雑さも大きい。 小規模なら単純な仕組みで十分なことが多い。
参考文献#
- Docker Documentation. https://docs.docker.com/
- Linux man-pages. namespaces(7). https://man7.org/linux/man-pages/man7/namespaces.7.html
- Alexandru Agache et al. Firecracker: Lightweight Virtualization for Serverless Applications. NSDI, 2020. https://www.usenix.org/conference/nsdi20/presentation/agache