イントロダクション
VM と Docker はどちらも現代のソフトウェア開発で重要な働きを持つ技術です。
最近は Docker が使われることが多いですが、VM も利点がありこれらはトレードオフの関係です。
意外と僕もこれら2つが具体的にどう違うのか説明してと言われたらできなかったので、記事にしてまとめてみました。
VM とは
VMは仮想マシンの略で、単一のベアメタルハードウェアの上で実行されます。
ベアメタルハードウェアの上には OS (Host Operating System) があり、OS 上で動作するのはハイパーバイザーと呼ばれるソフトウェアです。
ハイパーバイザーはベアメタルハードウェア上に抽象化レイヤーを作成して、複数の VM を同時に実行するためのソフトウェアのことを指します。
ハイパーバイザーは仮想マシンモニターとも呼ばれます。
各 VM 上ではそれぞれゲスト OS を持ち、そこでアプリケーションが動作します。

VM の利点
ベアメタルハードウェアと比べたときの利点として、VM は安価に使うことができることがが挙げられます。
ハードウェアを共有できるので、リソースの利用率が向上します。
また、スケーリングも簡単に行うことができます。スケールアップのためのハードウェアの移行をシャットダウンなしに行うこともできます。
VM の欠点
ノイジーネイバーズ (noisy neighbors) に対して弱いことが挙げられます。
ノイジーネイバーズとは、VM のように複数のテナントが共存する際に一部のテナントがリソースを過剰に使用することで、他のテナントのパフォーマンスに悪影響を与えることをいいます。
この問題が起きるのは VM が同じハードウェア上で実行されていて CPU コアを共有しているため起こります。
Docker とは
Docker はライブラリライブラリ、フレームワーク、ランタイムなどのすべての依存関係を含むアプリケーションの軽量でスタンドアロンのパッケージです。
コンテナにおけるスタンドアロンとは、他のコンテナや外部の依存関係に依存しないことを指します。このため、異なる環境やプラットフォームでも用意にデプロイすることができ、開発者はアプリケーションを開発する際の環境の際を気にする必要がなくなります。
コンテナはハイパーバイザーではなくコンテナエンジンと呼ばれるソフトウェアがあり、これでコンテナを実行します。
コンテナエンジン上では複数の独立したアプリケーションを動作させることができます。

コンテナの利点
コンテナは VM に比べて軽量で、VM よりも実行に必要なハードウェアリソースが少なくて済みます。
理由としては VM は仮想ハードウェア上に完全なオペレーティングシステム (OS) を実行するため、ハードウェアリソースのオーバーヘッドが大きくなるからです。
一方、コンテナはホスト OS のカーネルを共有してネイティブプロセスとして実行されるので、起動が VM と比べて非常に高速になります。
この特徴により、大規模なスケールが容易になります。
コンテナの欠点
コンテナのセキュリティーが問題になることがしばしばあります。コンテナは OS を共有しているため、コンテナ間の分離はOS レベルのプリミティブ(※)に依存して実現されます。
これはOS カーネルに存在する脆弱性が、コンテナにも影響を及ぼすことを意味します。
VM を用意することで、ゲストOS とホストOSの間に明確な境界線を設定できるので、ホストOSに影響を与えるマルウェアや攻撃から守ることができます。
そのような理由から、VM 上でコンテナを実行することがあるほどです。これは柔軟性とセキュリティーのトレードオフです。
※ OSレベルのプリミティブ(Operating System level primitive)とは、オペレーティングシステムが提供する基本的な機能や仕組みのことを指します。具体的には、プロセス管理、メモリ管理、ファイルシステム、ネットワーク、ユーザーアカウント管理などが含まれます。
さいごに
VM と Docker の違いについてまとめてみました。
普段使っている Docker の利点が知れてよかったです。
Twitter もやっているのでよかったらフォローいただけるとうれしいです。
参考
この記事はこちらのYoutube の動画を参考に書きました。
すごく分かりやすかったのでぜひ!