VMとDocker
VMとDockerはどちらも隔離された環境を提供するための技術です。
結論から言うと、VMは コンピュータ自体 を抽象化(仮想化)するのに対して、Dockerは プロセス の自体の抽象化(コンテナ化)を行います。
この2つは競合する技術ではなく、むしろ共存することが多いです。
また、VMが適しているユースケースもあるのでプロダクトの要件に応じてDockerとVMを選定する必要があるでしょう。
VirtualMachine¶
VirtualMachine(以下VM)はハードウェアから上、ハードウェア・カーネル(OS)・ユーザースペースの低レイヤーから仮想化を行うための技術です。
例えばmacOS上でWindowsを動かすこと、x86環境でARMを動かすことが可能で 非常に自由度が高い です。
そのため当然ながらOS(やハードウェア)が対象になり、仮想化をする領域が広いためオーバーヘッドが大きくなります。
Docker¶
Dockerはコンテナという技術です。
コンテナはLinuxカーネルの機能を用いた技術で、cgroup・namespace・Capabilityのような機能を組み合わせて実現しています。
そのためVMとは異なりホストOSとリソースを共有し、効率的にホストOSのリソースを使用することができ、高速かつ軽量な仮想化を実現しています。
複雑ですが、厳密にはDockerは仮想化技術とは異なり、プロセスレベルの抽象化を行う コンテナ技術 になります。
コンテナで使用される技術
Linuxの機能を用いてコンテナは実現されています。
cgroup¶
メモリ・CPUのような計算リソースを隔離するための機能で、コンテナへリソースの割り当てと制限を行います。
コンテナはそれぞれ専用の計算リソースを割り当て、他のコンテナにはお互いにアクセスできないようにします。
そして割り当てられたリソースを消費しても他のコンテナに影響を及ぼさないように制限を行ってくれます。
namespace¶
同じく隔離のための技術です。
namespaceはプロセスやネットワーク、ファイルアクセスなど複数の種類があり、それぞれが異なるリソースの隔離を行います。
Capability¶
スーパーユーザーとしての権限を制限するための機能です。
HostOSのrootユーザーの権限を制限し、最小限の権限を付与/管理を行います。