概要

コンテナとは、アプリケーション本体と、それを動かすために必要なライブラリ・設定・依存関係をひとまとめにした、隔離されたプロセスである。アプリを「動かす環境ごと」梱包したパッケージ、と考えると近い。

  • 自己完結している(ホストに事前インストールされた依存に頼らない)
  • 隔離されている(他のコンテナやホストへの影響が小さい)
  • ポータブル(開発機で動いたものが、データセンターやクラウドでも同じように動く)

Dockerのドキュメントは「コンテナとはアプリの各コンポーネントごとの隔離されたプロセス」と説明している。


仮想マシン(VM)との違い

ここが一番混乱しやすいポイント。両者はどちらも「隔離された環境」を提供するが、隔離する対象が違う。

仮想マシン(VM)コンテナ
隔離するもの物理マシン(ハードウェア)OS(オペレーティングシステム)
ゲストOSそれぞれが完全なOSを持つ持たない(ホストのカーネルを共有)
サイズ大きい(GB単位)小さい(MB単位)
起動遅い(OSを起動する)速い(カーネルは既にある)
仕組みハイパーバイザコンテナランタイム(Docker等)
隔離の強さ強い十分だがVMより弱い面もある

比喩で言えば、VMは一軒家、コンテナはアパートである。一軒家は配管・暖房・電気をすべて自前で持つ(=ゲストOS丸ごと)。アパートは建物(=ホストのカーネル)の設備を共有し、部屋の広さを必要な分だけ借りる。だから軽く、素早く、たくさん並べられる。

両者は排他的ではない。実際にはクラウドで「VMの上でコンテナを動かす」構成が一般的である。


イメージ・コンテナ・ボリューム

  • イメージ (image): アプリと依存関係を固めた読み取り専用のテンプレート。
  • コンテナ (container): イメージから起動した実行中のインスタンス。同じイメージから何個でも立ち上げられる。
  • ボリューム (volume): コンテナの外に置くデータ。コンテナは使い捨て(イミュータブル)なので、データはボリュームに置き、コンテナ本体は消して作り直してよい。だから「コンテナのバックアップ」はせず、ボリュームをバックアップする。

「コンテナはアプリの配送技術であって、仮想化技術ではない」という指摘はこの点を突いている。抽象化の単位が「サーバー(VM)」ではなく「アプリ/サービス(コンテナ)」になっている。


Dockerとの関係

コンテナ自体はLinuxのカーネル機能(名前空間やcgroupsによる隔離)を利用している。それを扱いやすくしたコンテナエンジンの代表がDockerである。ほかにPodman、containerd、そしてWSL3の wslc などがある。

WSL3では、このコンテナ実行基盤がWindowsに内蔵された。詳細は WSLコンテナとはなにか。


なぜ必要なのか

コンテナが「軽い」こと自体よりも、**「環境差をなくす」**ことに価値がある。そこは別ノートで掘り下げる。

→ コンテナはなぜ必要なのか


関連ノート


参考資料