TL;DR
アプリケーションの部品を動かすのに必要なものをすべて含んだ、隔離されたプロセス。ホストの OS カーネルを共有するので、仮想マシンより軽い。
なぜ必要か
Docker のドキュメントによると、コンテナは次の性質を持つ。
- 自己完結している: ホストにあらかじめ入っているソフトウェアに頼らず、動くのに必要なものを含む
- 隔離されている: ホストや他のコンテナへの影響が限られるので、セキュリティが高まる
- 独立している: コンテナごとに管理でき、1 つを消しても他に影響しない
- 可搬性がある: 開発者のマシンでも、データセンターやクラウドでも同じように動く
仕組み
仮想マシンは、独自のカーネル、ハードウェアドライバ、プログラムを含む OS をまるごと持つので、1 つのアプリケーションのために使うとオーバーヘッドが大きい。一方、コンテナは隔離されたプロセスで、複数のコンテナがホストのカーネルを共有する。そのため、同じインフラでより多くのアプリケーションを動かせる。両者は組み合わせて使うことも多く、仮想マシンの上でコンテナランタイムを動かし、複数のコンテナを実行できる。
コンテナのランタイムとイメージの標準は OCI が定めている。多数のコンテナをまとめて管理するにはコンテナオーケストレーションを使う。