Vagrant vs Docker: どちらがあなたに適していますか? (両方の可能性があります)
公開: 2023-01-26DevOps チームは、より優れた機能を顧客に迅速に提供するというプレッシャーにさらされています。 クラウド プロバイダーは、優れた CLI および API 統合を備えたスケーラブルなプラットフォームを通じてソリューションを提供します。 残念ながら、クラウド プロバイダーによって公開されているインターフェイスには互換性がない場合があります。 ただし、一部のクラウドネイティブ ツールは、DevOps チームが任意のクラウド プロバイダー向けのカスタム ソリューションを構築するのに役立ちます。
そのようなツールの 2 つが Vagrant と Docker です。 それらが何をし、どのように連携するかを理解することは、クラウド環境を最大限に活用するための鍵です。
Vagrant は、単一のワークフローで仮想マシン (VM) 環境を構築および管理するためのツールです。 ハイパーバイザーで実行するローカル VM を構築する場合でも、クラウド VM のみを構築する場合でも、Vagrant は、ソフトウェアをインストールして構成を変更するための一貫した構成形式、単一の CLI、および共有プロビジョナーを提供します。
Docker は、ソフトウェアとサポート構成を複数のプラットフォームで一貫して実行されるイメージにパッケージ化する機能を提供します。 Docker を使用すると、DevOps チームは、ソフトウェアがマネージド クラウド プラットフォームで実行されるのとほぼ同じように、ローカル ワークステーションで実行されるという確信を持つことができます。
Vagrant と Docker は反復可能な環境を作成するという目標を共有していますが、それらは異なるが補完的な方法でそれを行っています。 この記事では、Vagrant と Docker がどのように目標を達成するかを探ります。
ドッカーとは?
Docker は、アプリケーションを開発、出荷、実行するためのオープン プラットフォームです。 これにより、DevOps チームは、カスタム ソフトウェア、サポート アプリケーション、ライブラリ、および構成、ネットワーク、ファイル マウント、ヘルス チェック、起動スクリプトの手順を、イメージと呼ばれる自己完結型のアーティファクトにパッケージ化できます。
イメージは、コンテナーと呼ばれる軽量の分離された環境で実行されます。 通常、一定量のメモリを予約し、CPU 使用率を厳密に制限する VM とは異なり、コンテナははるかに弾力性があり、必要なメモリと CPU のみを消費します。
これにより、多くのコンテナーを効率的に並べて実行できるため、コストが削減され、スケールが増加します。 ただし、コンテナーは VM ほど安全であるとは見なされません。つまり、コンテナーは、信頼されていないコードを実行するための理想的なソリューションではありません。
Docker を使用する理由 (対 Vagrant)?
DevOps チームは通常、Docker を使用して Web アプリケーションを配信および実行します。これには、メッセージ キューと統合するか、クラウドベースのトリガーとイベントに応答するサービスとしての機能 (FaaS) プラットフォームでホストされるクラウドネイティブ アプリケーションが含まれます。
Kubernetes のようなプラットフォームは Docker 上に構築され、コンテナーを大規模にオーケストレーションできます。 さらに、すべてのクラウド プロバイダーは、サービスとしてのプラットフォーム (PaaS) オファリングで Docker コンテナーを実行する機能をサポートしています。 現在、Docker をサポートしていない PaaS はほとんどありません。
Docker は、CLI ベースのツールを配布および実行することもできます。一般的なクラウドネイティブ ツールはすべて、Docker イメージに CLI を埋め込んだものを提供します。
Docker の利点は何ですか?
Docker は、カスタム アプリケーションが開発者のローカル ワークステーションと実稼働環境で実行されると異なる結果を示す可能性があるという、従来のソフトウェア展開プロセスが直面する一般的な問題を解決します。 これらの違いは、多くの場合、開発者が異なるバージョンのプログラミング言語を実行している、Web サーバーなどのアプリケーションをサポートするための構成が異なる、または運用環境とはまったく異なるオペレーティング システムを実行していることが原因です。 これらの違いは、「私のマシンで動作します」などのコメントでチーム間を行き来するサポートの問題につながります。
Docker イメージには、カスタム アプリケーション、すべてのサポート アプリケーション、およびライブラリのコードが含まれているため、イメージは、実行場所に関係なく、より一貫した結果を提供するコンテナーで実行されます。
Docker イメージは、Docker Hub などのレジストリを使用して簡単に配布できるため、DevOps チームはイメージをすばやく共有し、さまざまなホスティング プラットフォームを使用してイメージをデプロイできます。 たとえば、Kinsta の DevKinsta WordPress 開発スイートの背後には Docker があります。
バックエンド アプリケーションと一緒にデータベースをデプロイしたり、関連するマイクロサービスのコレクションをデプロイしたりするなど、より複雑なアプリケーション スタックが必要な場合、Docker Compose は、1 つのコマンドで複数の Docker コンテナーを作成してリンクする機能を提供します。 すべてのコンテナー、関連する設定、およびネットワーク構成は、1 つの YAML ファイルで定義されます。 次に、Docker Compose はこのファイルを読み取り、複数のコンテナーを 1 つのユニットとして作成および管理します。
また、Docker は、主要なクラウド プロバイダー全体でほぼ普遍的なサポートを受けています。つまり、DevOps チームは、Docker イメージをクラウドで実行する際に選択の余地がありません。
放浪者とは?
何十年もの間、VM は、コンピューティング リソースのパーティショニングとプロビジョニングのための信頼できる安全なソリューションであることが証明されてきました。 VM は依然としてクラウド プロバイダーによって公開されている最も人気のあるサービスであり、チーム向けの多くの商用およびオープンソース ソリューションが VM をオンプレミスで実行することを検討しています。
ただし、この多様性は DevOps チームに課題をもたらします。 各ソリューションは、VM を作成および管理するための異なる CLI および API を公開しているため、ローカルの開発環境とクラウドベースのプラットフォームの間で一貫性を維持することが難しくなっています。
Vagrant は、VM プラットフォーム間の根本的な違いを抽象化することでソリューションを提供し、DevOps チームが単一の CLI と一貫した構成構文を使用して新しい VM をプロビジョニングできるようにします。 Vagrant を採用するチームは、オンプレミスで実行するかクラウド環境で実行するかに関係なく、一貫した VM を作成でき、環境を簡単に切り替えることができます。 Vagrant には、MAMP の代替 (macOS、Apache、MySQL/MariaDB、および PHP、Perl、または Python) など、さまざまな用途があります。
Vagrant を使用する理由 (vs Docker)?
ソフトウェアを手動でインストールし、構成ファイルを編集することで、VM を起動し、オペレーティング システムを手動で構成することができます。 これは理想的ではありません。プロセスを繰り返すことができないためです。つまり、さまざまなオペレーティング システムやプロバイダー用に VM を手動で再作成する必要があります。 また、後で VM がどのように構成されたかを理解することもほぼ不可能になります。
仮想マシンの構成に必要なプロセスを自動化することをお勧めします。 Vagrant は、多くのプロバイダー向けに VM を構築するプロセスを自動化するための単一のツールを提供します。 Vagrant は、DevOps チームが独自の VM を開始するために使用できる Vagrant Cloud 上の高品質 VM の幅広い選択肢も提供します。
Vagrant の利点は何ですか?
Vagrant を利用する DevOps チームは、オンプレミス プラットフォーム、クラウド プラットフォーム、またはその両方の VM を構築しているかどうかに関係なく、1 つのツールで学習できます。 Vagrant 構成ファイルを簡単に微調整し、後で再実行または確認して、VM がどのように構築されたかを理解することができます。
Vagrant を使用すると、DevOps チームは、VM の構築に使用するプロセスを再設計することなく、クラウドまたはプロバイダー間で移行できます。
Vagrant によって作成された VM は、高度な分離を提供し、多くの場合、最新の CPU に組み込まれた特殊な仮想化サポートを利用します。 これにより、VM と Vagrant などの VM を作成するツールが、セキュリティと分離が優先される場合に最適な選択肢になります。
Ubuntu や Fedora などの多くの Linux ディストリビューションも、DevOps チームが構築できる公式の Vagrant ボックスを提供しています。 これにより、カスタム VM の構築にかかる時間が短縮されます。
Vagrant vs Docker: 詳しく見る
Vagrant と Docker はどちらも、ソフトウェア アプリケーションの構築、配布、実行を自動化することで、DevOps チームをより効率的にします。
Docker は、イメージ形式のカスタム パッケージ フォーマットと、コンテナーによる軽量の実行環境によって、この目標を達成します。 コンテナーはプラットフォーム間で一貫して実行されるため、DevOps チームは、ソフトウェアが期待どおりに動作するという確信を深めることができます。 Docker は PaaS および FaaS クラウド プラットフォームで十分にサポートされているため、DevOps チームはニーズに最適なプラットフォームを選択できます。
多くのコンテナーは、単一のホスト上で共存できます。主に (ただし完全ではありません)、リソースの同じプールを共有しながら、互いに分離されています。 これにより、コンテナを効率的にスケーリングできます。
Vagrant は、既存のプロバイダーを使用して VM を構築するための一貫した方法を提供することで、この目標を達成します。 これは、VM に既に投資しており、高レベルの分離、セキュリティ、制御、およびカスタマイズに依存しているチームにとって理想的な選択肢です。
Docker は、コンピューティング コストを最小限に抑えながら、信頼できるコードを実行する場合にも最適なソリューションを提供します。 コンテナーは互いに適度に分離されていますが、オーバーヘッドはほとんど発生しません。 つまり、共有 OS 上で多数のコンテナを同時に実行できます。 VM は、チームが高レベルの分離とセキュリティを必要とする場合、または多くの異なるオペレーティング システムを並べて実行する機能を必要とする場合に最適なソリューションを提供します。Vagrant は、自動化された繰り返し可能な方法で VM を構築するための便利なソリューションを提供します。
Vagrant と Docker は相互に排他的なテクノロジではなく、両方のツールを並べて使用できます。 たとえば、DevOps チームは Docker を使用してアプリケーションを開発および実行し、Vagrant を使用して特殊な環境を再作成して問題を再現することができます。 Docker は、Vagrant によって作成された VM 内で実行されることもあります。おそらく、新しいバージョンの Docker をテストしたり、分離された環境で Docker イメージとして配布されたツールをテストしたりするためです。
概要
DevOps チームには、アプリケーションを構築、配布、および実行する際に多くの選択肢があります。
Docker は、大規模で効率的なリソースの使用を可能にし、PaaS および FaaS プラットフォーム全体でサポートされるカスタム イメージ形式とコンテナー実行環境を提供します。
VM は、多くのクラウドおよびオンプレミスの VM プロバイダーから安全で分離された実行環境を提供します。Vagrant は多くの違いを抽象化して単一の CLI と一貫した構成構文を提供し、プロバイダー間で VM をインスタンス化します。
次のアプリの開発を開始する前に、Kinsta のアプリケーション ホスティング サービスが Dockerfiles を利用してコードの展開を管理する方法をご覧ください。