TL;DR

アプリケーションの部品を動かすのに必要なものをすべて含んだ、隔離されたプロセス。ホストの OS カーネルを共有するので、仮想マシンより軽い。

なぜ必要か

Docker のドキュメントによると、コンテナは次の性質を持つ。

  • 自己完結している: ホストにあらかじめ入っているソフトウェアに頼らず、動くのに必要なものを含む
  • 隔離されている: ホストや他のコンテナへの影響が限られるので、セキュリティが高まる
  • 独立している: コンテナごとに管理でき、1 つを消しても他に影響しない
  • 可搬性がある: 開発者のマシンでも、データセンターやクラウドでも同じように動く

仕組み

仮想マシンは、独自のカーネル、ハードウェアドライバ、プログラムを含む OS をまるごと持つので、1 つのアプリケーションのために使うとオーバーヘッドが大きい。一方、コンテナは隔離されたプロセスで、複数のコンテナがホストのカーネルを共有する。そのため、同じインフラでより多くのアプリケーションを動かせる。両者は組み合わせて使うことも多く、仮想マシンの上でコンテナランタイムを動かし、複数のコンテナを実行できる。

コンテナのランタイムとイメージの標準は OCI が定めている。多数のコンテナをまとめて管理するにはコンテナオーケストレーションを使う。

関連

出典