Vagrantがどういう仕組みで動いてるのか理解するために、馴染みのあるDockerと比較してみるのが分かりやすかったのでまとめます。
VagrantはOSの仮想化、Dockerはコンテナ化の技術
Dockerはコンテナ化によって、アプリの実行環境を他のプロセスから隔離させることができますが、親マシンのOSがLinuxでないと動きません。Macや他のOSでDockerが動いているのは、例えばDocker for Macというアプリをインストールした時に、裏でLinuxを仮想マシンとして動かすことができるようになるので、その仮想マシン内でDockerを利用しているからです。
反対にVagrantだと、Mac上でもWindowsやLinuxを動かすことができ、これがVagrantとDockerの主な違いです。
Vagrantの仮想マシンの場合だとGuest OS上でアプリを動かしていますが、コンテナ化の場合だとOSはホストマシンのOSに依存しています。仮想マシンの場合は「ハイパーバイザー(Hypervisor)」というレイヤーがOSの仮想化を可能にしていて、VirtualboxやVMWareがこの機能を担っています。
Vagrantをもっと詳しく
このハイパーバイザー層を担うvagrantのプロバイダーには、VirtualBox/VMWareなどがあり、vagrantのほとんどの機能はプロバイダーも事前にインストールしないと使えません。
公式DocではVMWareが推奨されていますね。Dockerもプロバイダーとして使えるようです。
各インスタンスの設定や必要なライブラリのインストールは、vagrantのプロビジョニングに設定します。shellや、Ansible/Chef/Puppetなどのツールを使います。
どう違う?
DockerよりVagrantの方が初心者には理解しやすいと思います。Dockerはswarmやcomposeなど複数のコンテナを動かすための独特の概念がたくさんありますが、Vagrantは基本的にprovider/box/provisionの概念を押さえればなんとなく使える気がします。
リソース的には、OS全体を仮想化するのでVagrant環境の方が重く、起動も遅いです。DockerではOSは仮想化しないので、起動も早いです。Docker for Macは重いですが、Dockerの方が基本的にリソースの消費が少ないです。
まとめ
- VagrantはOSレベルの仮想化。Dockerはコンテナレベルの仮想化。
- Vagrantは理解しやすいが、RAM/ディスク容量など親マシンのリソースを圧迫する場合がある。起動が遅い。
- Dockerのアーキテクチャの方が複雑だが、CPU/RAM/ディスク容量の消費が少なくて済む。起動が早い。
- dockerでのimageと同じようにvagrantにはboxというパッケージがあるので、環境構築が楽
参考
https://www.docker.com/resources/what-container
https://www.vagrantup.com/intro/index.html
https://deliciousbrains.com/vagrant-docker-wordpress-development/
https://rancher.com/playing-catch-docker-containers
https://www.slideshare.net/AnatolyBubenkov/vagrant-are-you-still-develop-in-a-nonvirtual-environment