隔離された環境を作成するには Vagrant と Docker のどちらを使用すればよいですか? [closed] 質問する

隔離された環境を作成するには Vagrant と Docker のどちらを使用すればよいですか? [closed] 質問する

私は開発と展開に Ubuntu を使用しており、分離された環境を作成する必要があります。

この目的のために Vagrant または Docker を検討しています。長所と短所は何ですか。また、これらのソリューションを比較するとどうなりますか。

ベストアンサー1

免責事項: Vagrant を書いたのは私です。しかし、Vagrant を書いたため、私はほとんどの時間を Docker などのソフトウェアを含む DevOps の世界で過ごしています。私は Vagrant を使用している多くの企業と仕事をしており、多くの企業が Docker を使用しています。そして、この 2 つがどのように相互作用するかを見ています。

あまり長々と話す前に、直接的な答えを述べます。特定のシナリオ (自分自身が一人で作業している、Linux で作業している、Docker を本番環境で使用している) では、Docker だけを使用して物事を簡素化できます。他の多くのシナリオ (後で説明します) では、それほど簡単ではありません。

Vagrant と Docker を直接比較するのは正しくありません。いくつかのシナリオでは重複しますが、大多数のシナリオでは重複しません。実際、より適切な比較は、Vagrant と Boot2Docker (Docker を実行できる最小限の OS) のようなものとの比較です。抽象化の点では Vagrant は Docker より 1 レベル上なので、ほとんどの場合、公平な比較にはなりません。

Vagrantは開発目的でアプリやサービスを実行するためのものを起動します。これはVirtualBoxやVMware上で実行できます。AWSやOpenStackのようにリモートでも実行できます。これらの中でコンテナを使用する場合、Vagrantは気にせず、それを受け入れます。たとえば、Dockerコンテナを自動的にインストール、プルダウン、ビルド、実行できます。Vagrant 1.6では、Vagrantは次のようになります。Dockerベースの開発環境、Linux、Mac、Windows で Vagrant と同じワークフローで Docker を使用することをサポートします。Vagrant はここで Docker を置き換えるのではなく、Docker のプラクティスを採用します。

Docker は、Docker コンテナのみを実行します。Vagrant と直接比較する場合、Vagrant はより特定的 (Docker コンテナのみを実行可能) で、柔軟性が低い (Linux または Linux ホストがどこかに必要) ソリューションです。もちろん、本番環境や CI について話しているのであれば、Vagrant と比較することはできません。Vagrant はこれらの環境では動作しないため、Docker を使用する必要があります。

組織がすべてのプロジェクトで Docker コンテナのみを実行し、開発者が Linux のみを実行している場合は、Docker が間違いなく役立ちます。

そうでなければ、Docker だけを使用するメリットはないと思います。Vagrant が提供する、実際のビジネス/生産性のメリットの多くを失うことになるからです。

  • Vagrant は、VirtualBox、VMware、AWS、OpenStack などのマシンを起動できます。必要なものが何であっても、Vagrant で起動できます。Docker を使用している場合、Vagrant はこれらのいずれかに Docker をインストールして、その目的で使用できます。

  • Vagrant は、すべてのプロジェクトのための単一のワークフローです。言い換えれば、プロジェクトが Docker コンテナ内にあるかどうかに関係なく、プロジェクトを実行するために人々が学ばなければならないことが 1 つだけあります。たとえば、将来 Docker と直接競合する競合製品が登場した場合、Vagrant はその製品も実行できるようになります。

  • Vagrant は、Windows (XP 以降)、Mac (10.5 以降)、Linux (カーネル 2.6 以降) で動作します。3 つのケースすべてで、ワークフローは同じです。Docker を使用する場合、Vagrant はこれら 3 つのシステムすべてで Docker を実行できるマシン (VM またはリモート) を起動できます。

  • Vagrant は、ネットワークやフォルダーの同期など、高度で重要な設定を行うことができます。たとえば、Vagrant はマシンに静的 IP をアタッチしたりポートを転送したりする方法を知っており、使用するシステム (VirtualBox、VMware など) に関係なく設定は同じです。同期されたフォルダーの場合、Vagrant はローカル ファイルをリモート マシンに転送するための複数のメカニズム (VirtualBox 共有フォルダー、NFS、rsync、Samba [プラグイン] など) を提供します。Docker を使用している場合、Vagrant のない VM で Docker を使用している場合でも、これを手動で行うか、この場合は Vagrant を再発明する必要があります。

  • Vagrant 1.6は、以下の第一級のサポートを備えています。Dockerベースの開発環境. これにより、Linux 上で仮想マシンが起動されることはなく、Mac と Windows 上では仮想マシンが自動的に起動されます。 最終的には、Docker の操作はすべてのプラットフォームで統一され、ネットワーク、同期されたフォルダーなどの面倒な詳細は Vagrant によって引き続き処理されます。

Vagrant の代わりに Docker を使用することを支持する具体的な反論に対処するには、次のようになります。

  • 「可動部分が少なくなる」 - はい、すべてのプロジェクトで Docker のみを使用する場合は、その通りです。それでも、Docker ロックインの柔軟性は犠牲になります。過去、現在、または将来のどのプロジェクトでも Docker を使用しないと決めた場合は、可動部分が増えます。Vagrant を使用していた場合は、残りの部分をサポートする可動部分が 1 つあります。

  • 「速いです!」 - Linux コンテナを実行できるホストがあれば、Docker はどの仮想マシンを起動するよりもコンテナの実行が確実に速くなります。ただし、仮想マシン (またはリモート マシン) を起動するには 1 回限りのコストがかかります。1 日中、ほとんどの Vagrant ユーザーは VM を実際に破壊することはありません。これは開発環境に対する奇妙な最適化です。Docker が真価を発揮する本番環境では、コンテナをすばやく起動/停止する必要があることは理解できます。

これで、Docker と Vagrant を比較するのは非常に難しく、また正しくないということがおわかりいただけたと思います。開発環境の場合、Vagrant はより抽象的で、より一般的です。Docker (および Vagrant のように動作させるさまざまな方法) は、Vagrant の特定の使用例であり、Vagrant が提供するその他のすべての機能を無視しています。

結論: 非常に特殊なユースケースでは、Docker は確かに Vagrant の代替品になり得ます。ほとんどのユースケースではそうではありません。Vagrant は Docker の使用を妨げるものではありません。むしろ、その使用体験をよりスムーズにするためにできることをします。そうではないと思われる場合は、喜んで改善の提案をお受けします。Vagrant の目標は、どのシステムでも同じようにうまく動作することです。

これで問題が解決することを願います!

おすすめ記事