Docker と VM はどのように異なりますか?
Docker と仮想マシン (VM) は、アプリケーションのデプロイに使用される 2 つのテクノロジーです。ソフトウェア開発ライフサイクルでは、エンドユーザーのために実行するアプリケーションコードがデプロイによって準備されます。Docker は、デベロッパーがソフトウェアをコンテナと呼ばれる標準化されたユニットにパッケージ化するために使用するオープンソースプラットフォームです。コンテナには、アプリケーションコードと、ライブラリ、システムツール、ランタイムなどの環境の両方が含まれています。Docker を使用すると、アプリケーションを任意のマシンにデプロイしてスケールし、コードを一貫して実行できます。一方、仮想マシンは物理マシンのデジタルコピーです。同じホストオペレーティングシステム上で実行されている独自の個別オペレーティングシステムを備えた複数の仮想マシンを持つことができます。デベロッパーは、仮想マシンを設定して、アプリケーションの環境を作成します。Docker コンテナを仮想マシン上で実行することもできます。
仮想化: Docker と仮想マシン
仮想化により、サーバーやネットワークなどの実際のリソースの仮想インスタンスを作成できます。コンピューティングでは、仮想化により、仮想化されたコンポーネントの複数の独立したインスタンスを実際のコンポーネントで動作させることができます。
例えば、複数の仮想サーバーを 1 台の物理サーバーで実行できます。複数の仮想インスタンス間で実際のリソースを共有することで、それらのリソースをより有効に活用し、運用コスト効率を高めることができます。仮想化は、大量のアプリケーション開発とデプロイの基礎です。
仮想マシン
名前が示すように、仮想マシン (VM) はマシン (サーバー) 全体を仮想化します。仮想マシンは、CPU、メモリ、ネットワークインターフェイスカード、USB コントローラ、サウンドカードなど、物理マシンのハードウェアコンポーネントをエミュレートします。仮想環境では、ゲスト OS と複数のアプリケーションを実行できます。
仮想マシンはクラウド技術を可能にしました。Amazon Web Services (AWS) では、仮想マシンはインスタンスと呼ばれます。これらのクラウドインスタンスは AWS が所有および管理し、API 経由で使用できます。
Docker
VM を使用すると、どのハードウェアでも仮想マシンを実行できます。Docker を使用すると、どのオペレーティングシステムでもアプリケーションを実行できます。コンテナと呼ばれる独立したユーザースペースインスタンスを使用します。
Docker コンテナには、独自のファイルシステム、依存関係構造、プロセス、ネットワーク機能があります。アプリケーションには必要なものがすべてコンテナ内にあり、どこでも実行できます。Docker コンテナテクノロジーは、基盤となるホストオペレーティングシステムのカーネルリソースを直接使用します。
Docker と仮想マシンの他の類似点は何か?
仮想化技術として、Docker と仮想マシン (VM) にはある程度の類似点があります。
イメージ
Docker コンテナと仮想マシンはどちらもイメージから作成されます。各イメージは、仮想環境のブループリントとして機能します。イメージにより、ユーザーは環境を毎回設定しなくても、一貫性のある環境を作成して共有できます。
イメージは、アプリケーションを実行するために必要なすべてのシステムリソースを指定します。例えば、VM イメージはオペレーティングシステムのバックアップを作成し、Docker コンテナイメージはアプリケーション環境のバックアップを作成します。
バージョニング
Docker コンテナイメージと仮想マシンイメージはどちらもバージョニングすることで、時間の経過とともに環境設定がどのように変更されたかを追跡できます。
Docker のバージョニングとは、Docker イメージへの変更を経時的に追跡および管理できることを指します。これにより、デベロッパーはアプリケーションのさまざまなバージョンを追跡し、必要に応じて以前のバージョンにロールバックし、異なるバージョンのアプリケーションを同時にデプロイできます。
同様に、仮想マシンのバージョニングとは、時間の経過に伴う仮想マシンイメージの変更を追跡および管理するプロセスを指します。仮想マシンのバージョニングでは、仮想ハードウェアまたはオペレーティングシステムの設定に対する変更 (更新やパッチなど) が追跡されます。
ポータビリティ
仮想マシンと Docker はどちらも、基盤となるアーキテクチャの種類ごとに異なるアプリケーション設定を開発しなければならないという困難に対処するように設計されています。課題に対するアプローチは異なりますが、Docker イメージと VM イメージはどちらも、オンプレミスかクラウドかを問わず、アーキテクチャ間で非常に高い移植性があります。
主な相違点: Docker と仮想マシン
仮想マシン (VM) と Docker はどちらも、異なる環境でアプリケーションを実行するという課題に対処します。しかし、そうする理由は少し異なり、アプローチも異なります。
目的
仮想マシンは元々、複数のオペレーティングシステムを 1 つの物理マシン上で実行できるように設計されました。目的は、ユーザーが基盤となるハードウェアから分離された仮想環境を作成できるようにすることです。VM はハードウェアの詳細を抽象化して、さまざまなハードウェアアーキテクチャでアプリケーションを実行しやすくし、ハードウェアリソースをより効率的に使用できるようにします。
一方、Docker は、独立した再現可能な環境でアプリケーションをパッケージ化して実行するための軽量でポータブルな方法を提供するように設計されています。Docker はオペレーティングシステムの詳細を抽象化して、開発、テスト、本番環境など、さまざまな環境にアプリケーションをデプロイするという課題に対処します。ソフトウェア環境の更新の有無を管理し、あらゆる場所で環境の一貫性を維持することは非常に難しい場合があります。これは、何百ものアプリケーションを実行したり、アプリケーションを数百のマイクロサービスに分解したりする組織に特に当てはまります。Docker はコンテナ化を通じてこの問題に対処します。
最終製品
Docker は、Docker 社が所有および運営するオープンソースのコンテナプラットフォームの名前です。Podman のような代替プラットフォームもありますが、それほど人気はありません。Docker はコンテナ化と同義です。コンテナはアーティファクトであり、エンドユーザーが使用できる部分です。
仮想マシンはそれ自体が、エンドユーザーが使用できる部分です。この技術は特定のブランドに関連するものではありません。VM はオンプレミスのデータセンターにデプロイすることも、マネージドクラウドサービスとして API 経由でアクセスすることもできます。
アーキテクチャ
仮想マシンは、独自のカーネルとホストオペレーティングシステム、およびアプリケーションとその依存関係 (ライブラリやその他のバイナリファイルなど) を実行します。ハイパーバイザーは、ハードウェア (ホストマシンまたはサーバー) と仮想マシンの間の調整を行います。インスタンス化の際に示された物理ハードウェアリソースを、その仮想マシン専用に割り当てます。1 台の強力なサーバーに複数の仮想マシンを配置し、1 台のハイパーバイザーで管理できます。各仮想マシンで数百のアプリケーションを実行できます。
Docker コンテナには依存関係のみが含まれます。ソフトウェア Docker Engine は Docker の仮想化を強化します。物理マシンか仮想マシンかを問わず、実行中のコンテナと基盤となるオペレーティングシステム間の調整を行います。
Docker によるより高度な仮想化管理を行うには、Kubernetes を使用してください。詳細については、「Kubernetes と Docker はどのように異なりますか?」をご覧ください。
リソースの共有
仮想マシンと Docker コンテナはどちらも、リソースの多重化、つまり仮想化されたインスタンス間のリソース共有を使用します。
仮想マシンは、事前に特定の量のリソースをハードウェアに要求し、仮想マシンが稼働している限り、その量を着実に占有し続けます。
一方、Docker コンテナはリソースをオンデマンドで使用します。仮想マシンのように特定の量の物理ハードウェアリソースを要求するのではなく、必要なものを 1 つのオペレーティングシステムカーネルに要求するだけです。複数のコンテナが同じオペレーティングシステムを共有します。Docker コンテナはカーネルリードと直接リソースを共有するため、VM に比べてシステムリソースの使用量が少なくなる可能性があります。
セキュリティ
Docker コンテナはホストオペレーティングシステムとカーネルを共有するため、リソースの消費量が抑えられますが、カーネルに脆弱性があると危険にさらされます。ただし、Docker には高度なセキュリティ管理も多数用意されています。
逆に、VM はオペレーティングシステム全体を実行するため、アプリケーションを実行しているときに分離レベルが高まります。オペレーティングシステムに厳格なセキュリティ対策が講じられている限り、VM のセキュリティは高くなります。
使用するタイミング: Docker と仮想マシン
Docker コンテナは Linux アーキテクチャ上で動作し、名前空間やコントロールグループ (cgroup) などの Linux カーネル固有の機能を必要とします。デベロッパーはしばしば Linux ベースの仮想マシン上で Docker プラットフォームを実行します。Docker はアプリケーションコードを、どこでも実行できるコンテナにパッケージ化します。環境の更新は、コンテナ内で 1 回だけ実行されます。アプリケーション環境を更新する必要はありません。
例えば、AWS でインスタンスを起動し、Docker で事前設定された Amazon マシンイメージ (AMI) をすぐに読み込めます。
ただし、アプリケーションのデプロイに仮想マシン (VM) と Docker のどちらを使用するかを具体的に決定する場合は、アプリケーションの実行要件に左右されます。
仮想マシンを使用するタイミング
以下の要件を満たすアプリケーションを実行する場合は、仮想マシンを使用するのが最適です。
- オペレーティングシステム固有の依存関係
- 多大なハードウェアリソース要件
- オペレーティングシステムにさまざまなコントロールを設定する必要
- 最新のオペレーティングシステムでは動作しなくなったレガシーアプリケーション
- 基盤となる 1 つの物理インフラストラクチャが利用可能なさまざまなオペレーティングシステム要件
Docker をいつ使うか
以下の要件を満たすアプリケーションを実行する場合は、Docker を使用するのが最適です。
- 軽量リソース要件またはマイクロサービスアーキテクチャ
- クラウドベースのサーバーを含む分散型物理インフラストラクチャ環境
- 迅速なデプロイサイクル (Dockerfile は VM 設定よりも管理が容易なため)
- 迅速なスケーラビリティ要件
違いの要約: ドッカーとVM
Docker コンテナ |
VM |
|
内容 |
Docker は Docker コンテナを作成して実行するためのソフトウェアプラットフォームです。Docker コンテナは、ユーザープロセスが実行されるオペレーティングシステムの一部であるユーザースペースインスタンスのエミュレーションです。 |
オペレーティングシステムを実行している物理マシン (仮想化されたハードウェアを含む) のエミュレーション。 |
仮想化 |
コンテナは、アプリケーションコードからオペレーティングシステムの詳細を抽出します。 |
VM はアプリケーションコードからハードウェアの詳細を抽出します。 |
目的 |
ハードウェアの詳細を抽象化し、ハードウェアの使用率を高めます。 |
アプリケーション環境管理を改善し、複数の環境に一貫性をもたらします。 |
管理者 |
Docker Engine は、オペレーティングシステムと Docker コンテナ間の調整を行います。 |
ハイパーバイザーは、マシンの物理ハードウェアと仮想マシンの間の調整を行います。 |
アーキテクチャ |
基盤となるホストカーネルとリソースを共有します。 |
独自のカーネルとオペレーティングシステムを実行します。 |
リソースの共有 |
オンデマンド。 |
仮想マシンイメージの設定要件で設定される固定金額。 |
AWS はお客様のアプリケーションデプロイ要件をどのようにサポートできるか?
Amazon Web Services (AWS) には、仮想マシン (VM) と Docker 管理専用に設計されたさまざまなサービスがあります。
- Amazon Elastic Cloud Compute (Amazon EC2) は、600 種類以上の安全で信頼性が高く、スケーラブルなインスタンスを提供しています。Amazon マシンイメージ (AMI) テンプレートを読み込むことで、完全に指定された開発、テスト、または本番環境のサーバーを数分で準備できます。
- Amazon Elastic Container Service (Amazon ECS) は、コンテナ化されたアプリケーションのデプロイおよびスケールを容易にするフルマネージド型のコンテナオーケストレーションサービスです。お客様はご自分のコンテナインスタンスから、仮想プライベートクラウド (VPC) 内のプライベート Docker イメージレジストリ、または VPC 外でアクセスできるレジストリにアクセスするよう設定できます。
- Amazon Elastic Container Registry (Amazon ECR) を使用すると、コンテナをどこにでも簡単に保存、共有、デプロイできます。Amazon ECR は Docker コマンドラインインターフェイス (CLI) と統合され、開発と本番稼働のワークフローを簡素化します。例えば、開発マシンから Docker CLI を使用してコンテナイメージを Amazon ECR にプッシュできます。また、Amazon コンテナオーケストレーターはそれらを直接プルして本番環境にデプロイできます。
- AWS Fargate は、物理サーバーや仮想マシンを管理しなくてもコンテナをデプロイして管理できるサーバーレスサービスです。
今すぐアカウントを作成して、AWS でアプリケーション開発を始めましょう!