コンテナ

コンテナ

執筆済 ソフトウェア開発インフラ

プロセスを隔離して、独立した環境のように見せる技術。

仮想マシンとの違い#

[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 が事実上の標準だが、 複雑さも大きい。 小規模なら単純な仕組みで十分なことが多い。

参考文献#

ノート一覧を閉じる