私は開発とデプロイメントにUbuntuを使用しており、分離された環境を作成する必要があります。
この目的のために、VagrantまたはDockerを検討しています。長所と短所は何ですか、またはこれらのソリューションはどのように比較されますか?
私は開発とデプロイメントにUbuntuを使用しており、分離された環境を作成する必要があります。
この目的のために、VagrantまたはDockerを検討しています。長所と短所は何ですか、またはこれらのソリューションはどのように比較されますか?
回答:
あなたの目的が分離である場合、Dockerがあなたの望んでいるものだと思います。
Vagrantは仮想マシンマネージャーです。仮想マシンの構成とプロビジョニングをスクリプト化できます。ただし、VirtualBox(またはその他)に依存する仮想マシンであり、オーバーヘッドが非常に大きくなります。巨大になる可能性のあるハードドライブファイルが必要であり、RAMを大量に消費し、パフォーマンスがあまり良くない場合があります。
一方、DockerはLXCを介してカーネルcgroupとネームスペースを使用します。これは、ホストと同じカーネルと同じファイルシステムを使用していることを意味します。コンテナーdocker build
のプロビジョニングと構成を処理するために、コマンドでDockerfileを使用できます。docs.docker.comに、Dockerfileを作成する方法の例があります。とても直感的です。
Vagrantを使用する唯一の理由は、UbuntuボックスでBSD、Windows、またはその他のLinux以外の開発を行う必要がある場合です。それ以外の場合は、Dockerを使用します。
免責事項:私はヴァグラントを書いた!しかし、私はVagrantを作成したため、ほとんどの時間をDockerなどのソフトウェアを含むDevOpsの世界に住んでいます。私はVagrantを使用している多くの企業と協力しており、多くの企業がDockerを使用しており、2つがどのように相互作用するかを理解しています。
話をする前に、直接的な答えを述べます。特定のシナリオ(自分で作業している、Linuxで作業している、本番環境でDockerを使用している)では、Dockerだけに固執して単純化できます。他の多くのシナリオ(後で説明します)では、それほど簡単ではありません。
VagrantとDockerを直接比較するのは正しくありません。一部のシナリオでは重複しますが、大多数では重複しません。実際、より適切な比較は、VagrantとBoot2Docker(Dockerを実行できる最小OS)のようなものです。Vagrantは、抽象化の観点からDockerより上のレベルであるため、ほとんどの場合、それは公平な比較ではありません。
Vagrantは、開発を目的としてアプリやサービスを実行するための機能を起動します。これは、VirtualBox、VMwareにあります。AWSやOpenStackのようにリモートにすることもできます。その中で、コンテナーを使用する場合、Vagrantは気にせず、それを受け入れます。たとえば、Dockerコンテナーを自動的にインストール、プルダウン、ビルド、および実行できます。Vagrant 1.6では、VagrantはDocker ベースの開発環境を備えており、Linux、Mac、Windows全体でVagrantと同じワークフローでDockerの使用をサポートしています。Vagrantは、ここでDockerを置き換えることを試みていません。Dockerプラクティスを採用しています。
Dockerは、特にDockerコンテナーを実行します。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の目標はどのシステムでも同じようにうまく機能することなので、これが真実でないとわかった場合は、改善のための提案をさせていただきます。
これで問題が解決することを願っています!
vagrant provision
。すべての開発者はVMを簡単に(を使用して)アップグレードできます。
私はDockerの作者です。
簡単に言えば、マシンを管理したい場合は、Vagrantを使用する必要があります。また、アプリケーション環境を構築して実行する場合は、Dockerを使用する必要があります。
Vagrantは、仮想マシンを管理するためのツールです。Dockerは、アプリケーションを軽量コンテナにパッケージ化して構築およびデプロイするためのツールです。コンテナは、ほとんどすべてのソフトウェアコンポーネントとその依存関係(実行可能ファイル、ライブラリ、構成ファイルなど)を保持でき、保証された再現可能なランタイム環境で実行できます。これにより、一度アプリをビルドしてどこにでもデプロイすることが非常に簡単になります。テスト用にラップトップに、次にライブデプロイ用に別のサーバーに配置するなどです。
LinuxではDockerしか使用できないというのは、よくある誤解です。それは不正解です。MacおよびWindowsにDockerをインストールすることもできます。DockerをMacにインストールすると、コンテナーのラッパーとして機能する小さなLinux VM(ディスク上で25 MB!)がバンドルされます。インストールすると、これは完全に透過的です。Dockerコマンドラインをまったく同じ方法で使用できます。これにより、両方の長所が得られます。非常に軽量で、テストが簡単で、移動が簡単なコンテナーを使用して、アプリケーションをテストおよび開発できます(再利用可能なコンテナーを共有するためのhttps://hub.docker.comを参照してください)。 Dockerコミュニティ)、そして仮想マシンの管理の詳細について心配する必要はありません。これはとにかく目的を達成するための手段にすぎません。
理論的には、Dockerの抽象化レイヤーとしてVagrantを使用することが可能です。次の2つの理由により、これはお勧めしません。
まず、VagrantはDockerの優れた抽象化ではありません。Vagrantは仮想マシンを管理するために設計されました。Dockerは、アプリケーションランタイムを管理するように設計されています。つまり、設計上、Dockerはより豊かな方法でアプリケーションと対話でき、アプリケーションランタイムに関する詳細情報を持っています。Dockerのプリミティブは、プロセス、ログストリーム、環境変数、コンポーネント間のネットワークリンクです。Vagrantのプリミティブは、マシン、ブロックデバイス、sshキーです。Vagrantは単にスタックの下位に位置し、コンテナーとやり取りできる唯一の方法は、「ブート」および「ログイン」できる別の種類のマシンのふりをすることです。したがって、確かに、Dockerプラグインで「vagrant up」と入力すると、かなりのことが起こります。Dockerができることのすべての代わりになりますか?ネイティブDockerを数日間試して、自分の目で確かめてください。
次に、ロックイン引数です。「抽象としてVagrantを使用する場合、Dockerにロックされることはありません!」。マシンを管理するように設計されたVagrantの観点からは、これは完全に理にかなっています。コンテナーは別の種類のマシンではないのですか?Amazon EC2やVMwareと同様に、プロビジョニングツールを特定のベンダーに関連付けないように注意する必要があります。これはロックインを作成します-Vagrantですべてを抽象化する方が良いでしょう。これを除いて、Dockerのポイントを完全に逃しています。Dockerはマシンをプロビジョニングしません。どこにでもドロップできる軽量のポータブルランタイムでアプリケーションをラップします。
アプリケーション用に選択するランタイムは、マシンのプロビジョニング方法とは関係ありません。たとえば、他の誰かがプロビジョニングしたマシン(たとえば、システム管理者がデプロイしたEC2インスタンス、おそらくVagrantを使用)にアプリケーションをデプロイしたり、Vagrantがまったくプロビジョニングできないベアメタルマシンにアプリケーションをデプロイしたりするのはかなり頻繁です。逆に、Vagrantを使用して、アプリケーションの開発とは何の関係もないマシン(たとえば、すぐに使用できるWindows IISボックスなど)をプロビジョニングできます。または、Vagrantを使用して、Dockerを使用しないプロジェクト用のマシンをプロビジョニングできます。たとえば、依存関係の管理やサンドボックス化にrubygemsとrvmの組み合わせを使用している可能性があります。
要約すると、Vagrantはマシンの管理用であり、Dockerはアプリケーション環境の構築と実行用です。
私はDockerの経験がないことを認めて、私の返信の前置きとして、非常にきちんとしたソリューションであると思われるものの熱心な観察者として以外に、多くの牽引力を得ています。
私はVagrantでかなりの量の経験があり、強くお勧めできます。LXCベースではなくVMベースであるという点で、それは確かにより重いソリューションです。ただし、適切なラップトップ(8 GB RAM、i5 / i7 CPU)では、開発ツールと一緒にVagrant / VirtualBoxを使用してVMを実行しても問題はないことがわかりました。
Vagrantのすばらしい点の1つは、構成を自動化するためのPuppet / Chef / shellスクリプトとの統合です。これらのオプションのいずれかを使用して本番環境を構成している場合は、取得しようとしているものとほぼ同じ開発環境を作成できます。これはまさに必要なことです。
Vagrantのもう1つの優れた点は、Vagrantfileをアプリケーションコードと共にバージョン管理できることです。つまり、チームの他の全員がこのファイルを共有でき、全員が同じ環境設定で作業していることが保証されます。
興味深いことに、VagrantとDockerは実際には補完的である場合があります。Vagrantは、さまざまな仮想化プロバイダーをサポートするように拡張できます。Dockerは、近い将来サポートされるプロバイダーの1つである可能性があります。このトピックに関する最近の議論については、https://github.com/dotcloud/docker/issues/404を参照してください。
それらは非常に相補的です。
私はすべてのプロジェクトでVirtualBox、Vagrant、Dockerの組み合わせを数か月間使用しており、次の利点を強く感じています。
Vagrantでは、Chefのソロプロビジョニングを完全に排除でき、Vagrantファイルに必要なのは、Dockerをインストールする単一の小さなシェルスクリプトを実行するマシンを準備することだけです。つまり、すべてのプロジェクトのVagrantfilesはほとんど同じで非常に単純です。
ここに典型的なVagrantfileがあります
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "mark2"
config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"
[3000, 5000, 2345, 15672, 5672, 15674, 27017, 28017, 9200, 9300, 11211, 55674, 61614, 55672, 5671, 61613].each do |p|
config.vm.network :forwarded_port, guest: p, host: p
end
config.vm.network :private_network, ip: "192.168.56.20"
config.vm.synced_folder ".", "/vagrant", :type => "nfs"
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", "2048"]
vb.customize ["modifyvm", :id, "--cpus", "2"]
end
# Bootstrap to Docker
config.vm.provision :shell, path: "script/vagrant/bootstrap", :privileged => true
# Build docker containers
config.vm.provision :shell, path: "script/vagrant/docker_build", :privileged => true
# Start containers
# config.vm.provision :shell, path: "script/vagrant/docker_start", :privileged => true
end
dockerをインストールするBootstrapファイルは次のようになります
#!/usr/bin/env bash
echo 'vagrant ALL= (ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers
apt-get update -y
apt-get install htop -y
apt-get install linux-image-extra-`uname -r` -y
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list
apt-get update -y
apt-get install lxc-docker -y
apt-get install curl -y
実行する必要があるすべてのサービスを取得するために、次のようなdocker_startスクリプトがあります。
#!/bin/bash
cd /vagrant
echo Starting required service containers
export HOST_NAME=192.168.56.20
# Start MongoDB
docker run --name=mongodb --detach=true --publish=27017:27017 --publish=28017:28017 dockerfile/mongodb
read -t5 -n1 -r -p "Waiting for mongodb to start..." key
# Start rabbitmq
docker run --name=rabbitmq --detach=true --publish=5671:5671 --publish=5672:5672 --publish=55672:55672 --publish=15672:15672 --publish=15674:15674 --publish=61613:61613 --env RABBITMQ_USER=guest --env RABBITMQ_PASS=guest rabbitmq
read -t5 -n1 -r -p "Waiting for rabbitmq to start..." key
# Start cache
docker run --name=memcached --detach=true --publish=11211:11211 ehazlett/memcached
read -t5 -n1 -r -p "Waiting for cache to start..." key
# Start elasticsearch
docker run --name=elasticsearch --detach=true --publish=9200:9200 --publish=9300:9300 dockerfile/elasticsearch
read -t5 -n1 -r -p "Waiting for elasticsearch to start..." key
echo "All services started"
この例では、MongoDB、Elastisearch、RabbitMQおよびMemcachedを実行しています。
非ドッカーChefのソロ構成は、かなり複雑になります。
最後の大きなプラスは、本番環境に移行するときに得られます。Dockerを実行するのに十分な構成があるだけで、実際にはほとんど作業を行わないという点で、開発環境をすべて同じホストのインフラストラクチャに変換します。
興味があれば、私自身のWebサイトに、開発環境に関するより詳細な記事があります。
Vagrant-lxcはVagrantのプラグインで、LXCを使用してVagrantをプロビジョニングできます。デフォルトのvagrant VM(VirtualBox)が持つすべての機能を備えているわけではありませんが、Dockerコンテナーよりも柔軟性があります。リンクに、見る価値のある機能を示すビデオがあります。
Vagrantを使用すると、Dockerをプロバイダーとして使用できます。http://docs.vagrantup.com/v2/docker/。VirtualBoxまたはVMwareの代わりにDockerプロバイダーを使用できます。
VagrantでのプロビジョニングにDockerを使用することもできます。これは、Dockerをプロバイダーとして使用する場合とは大きく異なります。http://docs.vagrantup.com/v2/provisioning/docker.html
つまり、ChefまたはPuppetをDockerに置き換えることができます。プロバイダー(VM)としてのDockerとプロビジョニングツールとしてのChefのような組み合わせを使用できます。または、VirtualBoxをプロバイダーとして、Dockerをプロビジョナーとして使用できます。
両方を使用することは、アプリケーション配信テストの重要な部分です。私はDockerに参加し始めたばかりで、ソフトウェアの構築と配信が非常に複雑なアプリケーションチームについて非常に熱心に考えています。クラシックなフェニックスプロジェクト/継続的デリバリーの状況を考えてみてください。
考え方は次のようになります。
これは、ヴァグラントが継続的デリバリーにおけるファーリー/ハンブルズの思考と組み合わせた開発のためのものであるというミッチェルの声明の論理的な拡張のようです。開発者として、統合テストとアプリケーション配信のフィードバックループを縮小できれば、より高品質でより良い作業環境が実現します。
開発者として、私は常に一貫してVMにコンテナーを提供し、アプリケーションをより総合的にテストしているという事実は、製品リリースがさらに簡素化されることを意味します。
したがって、Vagrantは、Dockerがアプリのデプロイメントにもたらす素晴らしい影響の一部を活用する方法として進化していると思います。
勝利のための間違いなくDocker!
ご存知かもしれませんが、Vagrantは仮想マシン管理用であり、Dockerはソフトウェアコンテナ管理用です。違いを認識していない場合は、次のとおりです。ソフトウェアコンテナは、同じマシンとカーネルを他のソフトウェアコンテナと共有できます。コンテナーを使用すると、複数のオペレーティングシステム(カーネル)でリソースを無駄にしないため、コストを節約できます。サーバーごとにより多くのソフトウェアをパックして、十分な分離を維持できます。
もちろん、独自の落とし穴や課題を気にする新しい分野です。
要件が単一マシンのリソース制限を超える場合は、Docker Swarmを使用してください。
実際のOracle Javaマガジンには、DockerをVagrant(およびPuppet)と組み合わせて使用することに関する非常に有益な記事があります。
結論
Dockerの軽量コンテナーは、クラシックVMと比較して高速であり、開発者の間で、そしてCDおよびDevOpsイニシアチブの一部として人気を博しています。目的が分離である場合は、Dockerが最適です。Vagrantは、個々のVMの構成をスクリプト化し、プロビジョニングを実行できるVMマネージャーです。ただし、それは比較的大きなオーバーヘッドを持つVirtualBox(または別のVMマネージャー)に依存するVMです。巨大になる可能性のあるハードドライブアイドルが必要であり、RAMを大量に消費し、パフォーマンスが最適でない可能性があります。DockerはLXCを介してカーネルcgroupと名前空間の分離を使用します。これは、ホストと同じカーネルと同じファイルシステムを使用していることを意味します。Vagrantは、抽象化の観点からDockerより上のレベルなので、実際には比較できません。Puppetなどの構成管理ツールは、ターゲット環境のプロビジョニングに広く使用されています。Dockerを使用すると、既存のPuppetベースのソリューションを簡単に再利用できます。ソリューションをスライスして、インフラストラクチャをPuppetでプロビジョニングすることもできます。ミドルウェア、ビジネスアプリケーション自体、またはその両方がDockerでプロビジョニングされます。DockerはVagrantによってラップされています。この範囲のツールを使用すると、シナリオに最適な方法を実行できます。
DevOpsでDockerコンテナーを構築、使用、オーケストレーションする方法 http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0