Skip to content

VMとDocker

VM Docker

VMとDockerはどちらも隔離された環境を提供するための 仮想化技術 です。
結論から言うと、VMは コンピュータ自体 を仮想化するのに対して、Dockerは プロセス の仮想化を行います。

この2つは競合する技術ではなく、むしろ共存することが多いです。
また、VMが適しているユースケースもあるのでプロダクトの要件に応じてDockerとVMを選定する必要があるでしょう。

VirtualMachine

VirtualMachine(以下VM)はハードウェアから上、ハードウェア・カーネル(OS)・ユーザースペースの低レイヤーから仮想化を行うための技術です。
例えばmacOS上でWindowsを動かしたり、x86環境でARMを動かすと言ったことが可能になります。
当然ながら仮想化をする領域が広いためオーバーヘッドが大きくなります。

Docker

Dockerはコンテナと呼ばれる仮想化技術です。
コンテナはLinuxカーネルの機能を用いた技術で、cgroup・namespace・Capabilityのような機能を組み合わせて実現しています。 そのためVMとは異なりホストOSとリソースを共有し、効率的にホストOSのリソースを使用することができ、高速かつ軽量な仮想化を実現しています。

cgroup

メモリ・CPUのような計算リソースを隔離するための機能で、コンテナへリソースの割り当てと制限を行います。
コンテナはそれぞれ専用の計算リソースを割り当て、他のコンテナにはお互いにアクセスできないようにします。
そして割り当てられたリソースを消費しても他のコンテナに影響を及ぼさないように制限を行ってくれます。

namespace

同じく隔離のための技術です。
namespaceはプロセスやネットワーク、ファイルアクセスなど復数の種類があり、それぞれが異なるリソースの隔離を行います。

Capability

スーパーユーザーとしての機能を制限するための機能です。
DockerコンテナへHostOSのrootユーザーの権限を制限し、最小限の権限を付与/管理を行います。