Vagrant(ベイグラント)は、簡単に言うと仮想マシンの構築を自動化するツールです。VagrantはHashicorp社よりMITライセンスで公開されいるので、無料で使うことができます。動作する環境はLinux、MacOS、Windowsです。
Vagrant自体にはVitualBOXのような仮想マシン環境は含まれないので、別途用意する必要があります。利用できる仮想マシン環境としては、VirtualBox、VMware、Hyper-Vなどの多くの環境に対応しています。
Vagrantは何が便利?
Vagrantが主に使われるのは、テストや検証のための環境構築です。例えば、Vagrantでサーバーを構築して、テストを実施する次のシナリオを考えてみましょう。
- まずVagrantでサーバー構築するために必要なファイルなどを準備します。
- 準備ができたら仮想環境上にサーバーを作成します。これはVagrantならコマンドひとつ作成することができます。
- サーバーを作成したらテストを実施します。
- テストの過程でサーバーの設定に変更が加えらます。
- 一つ目のテストが完了したら、次のテストを実施します。
ここで新たなテストをするために、サーバーの初期状態が欲しいとします。このようなときにVagrantが威力を発揮します。具体的には今あるサーバーを破棄して、再度サーバーを構築するのです。どちらも簡単なコマンドで実施できます。
これは加えられた変更を手作業でひとつひとつ戻すよりも、明らかに簡単で間違いも起きません。
Vagrantでは仮想マシンのスナップショットを取ることもできますので、ある時点のサーバー状態を保存しておいて、その状態に戻すことも簡単です。このように一度Vagrantで仮想マシンを作成できるようにしておくと、何度でも同じ環境を簡単に作ることができるのです。これがVagrantの最大の魅力でしょう。
また、サーバー作成に必要なファイル一式さえあれば、それを別の環境へ持って行ってサーバーを建てたり、ほかの人に渡して同じサーバーを使ってもらうこともできます。
Vagrant基礎知識
最初にVagrantを使うにあたって重要な用語や概念について説明しておきたいと思います。
- プロバイダ
- VirtualBOX、VMware、Hyper-Vなどの仮想マシン環境のことをVagrantではプロバイダと呼ぶ。
- boxファイル
- Vagrantにおける仮想マシンのイメージファイル。かつてはVirtualBOXのエクスポートファイルそのものだったようですが、様々なプロバイダをサポートするようになり、プロバイダの情報なども含まれる。
- Vagrantfile
- 仮想マシン環境のの設定ファイル。Ruby言語で記述され、boxファイルや仮想マシンの設定などの設定を記述する。
Vagrantにおけるこれらの関係は以下の図のようになります。

boxファイルはいくつかの公開サーバで公開されています。 一般にそれをダウンロードしてローカルマシンに追加して利用しますが、自分で作成することもできます。
Vagrantfileには、どのように仮想マシンを作成するかを定義します。 一つのVagrantfileに複数の仮想マシンを定義することもできます。
Vagrantで仮想マシンを作ってみよう!
ここからは実際に仮想マシンを作成する方法を順に説明します。
Vagrantのインストール
まずはVagrantのインストールが必要です。Vagrantは以下のサイトからダウンロードできますので、 環境に適したものをダウンロードしてインストールしてください。
プロバイダのインストール
次にVagrantで利用する仮想マシン環境(VirtualBox、VMwareなど)をインストールします。 一般にプロバイダとしてVirtualBoxが使われることが多いと思います。 VirtualBoxは以下のサイトからダウンロードできます。
boxファイルを探す
Vagrantで仮想マシンを作成するためにはboxファイルが必要です。 boxファイルはいくつかの公開サーバで提供されていますが、 ここではVagrant公式のサイトである 「HashiCorp's Vagrant Cloud」 のサイトからboxファイルを探します。
サイトにアクセスし、テキストボックスにキーワードを入力してboxファイルを探すことができます。 今回はCentOS7のboxファイルを探してみます。 テキストボックスにCentOSと入力して検索するとたくさんのboxファイルが見つかると思います。 「centos/7」がCentOS公式のboxファイルですので、今回はこれを使います(下記の図を参照)。

boxファイルはダウンロードしてvagrantコマンドで明示的にローカル環境に追加することもできますが、仮想マシンの初回起動時にboxファイルがローカルになければ自動的にダウンロードされて追加されます。
今回は後者のやり方で実施しますので、Vagrantfileに記述する「centos/7」という文字列だけメモっておきます。これは「ボックスのユーザ/ボックス名」という形式になっています。
プロジェクトの作成
ここからはコマンドを使っていくので、LinuxやMacならターミナル、Windowsならコマンドプロントを立ち上げてください。この記事で掲載したコマンドはLinux、Mac、Windowsでもそのまま使用できますが、プロンプトは環境で異なる事があります。
まず最初に、Vagrantのプロジェクトを作成します。プロジェクトといっても実体は単なるディレクトリです。このディレクトリがプロジェクトのルートディレクトリになり、仮想マシンの作成に必要なファイルが置かれます。ディレクトリの場所や名前は任意です。
それでは実際にプロジェクトを作成しましょう。プロジェクトを作成したいディレクトリへ移動して、次のコマンドを実行してください。ここではプロジェクトのディレクトリ名はvagrant_projectにします。
$ mkdir vagrant_project
プロジェクトを初期化する
次にプロジェクトを初期化します。 初期化するにはプロジェクトのルートディレクトリでvagrant initコマンドを実行します。初期化するとルートディレクトリにVagrantfileが作成されます。
vagrant initの書式は次の通りです。
vagrant init [仮想マシン名 [boxファイルのURL]]
- 「仮想マシン名」を指定するとVagrantfileの config.vm.box パラメータに仮想マシン名が設定された状態で作成されます。ここには先ほどメモした「centos/7」を指定します。
-
「boxファイルのURL」を指定すると config.vm.box_url パラメータに指定したURLが設定されます。
「HashiCorp's Vagrant Cloud」のboxファイルを使用する場合、これを指定する必要はありません。config.vm.box_urlの値ははボックスを検索するために使用されますが、config.vm.box_urlの設定がない場合は「HashiCorp's Vagrant Cloud」から検索されるからです。
それではルートディレクトリに移動し、先ほどメモった「centos/7」を指定してvagrant initコマンドを実行します。
$ cd vagrant_project $ vagrant init centos/7 A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on `vagrantup.com` for more information on using Vagrant.
Vagrantfileの設定
vagrant initコマンドを実行すると、プロジェクトのルートディレクトリに次のような内容のVagrantfileが作成されます(コメント行は割愛)。vagrant initの引数に指定した「centos/7」が「config.vm.box」に設定されているのがわかります。
Vagrant.configure("2") do |config| config.vm.box = "centos/7" end
Vagrantfileには仮想マシンなどの様々な設定を記述します。書式はRuby言語で記述します。Vagrantfileにコメントでいくつか設定例が記載されていますので、追加の設定をする場合はそれを参考にしてください。
仮想マシンを起動する
いよいよ仮想マシンの起動です。仮想マシンを起動するには、vagrant up コマンドを使用します。
vagrant up [--provider プロバイダ名] [name|id]
今回の例ではオプションを使いません。そのほかに上記のオプションがあるくらいの理解で取りあえす大丈夫でしょう。
- --providerにはプロバイダ名を指定します。 デフォルトは「virtualbox」なので、今回は指定する必要はありません。
-
nameやidには仮想マシンの名前やIDを指定します。
仮想マシンが複数のある場合は、起動したい仮想マシンの名前やIDを指定する事ができます。省略すると(複数の仮想マシンがある場合)全ての仮想マシンを起動します。
今回は1つの仮想マシンしかありませんので、指定する必要はありません。
boxファイルがローカルにないときは、最初にvagrant upが実行されたときに自動的にダウンロードされローカル環境に追加されます。 そのあと仮想マシンが作成され、起動されます。それでは実際に試してみましょう。
$ vagrant up
これだけで仮想マシンが作成されました。簡単ですね。
仮想マシンへのログインとログアウト
仮想マシンの起動が完了したら、仮想マシンへのログインしてみましょう。
仮想マシンにログインするにはvagrant sshコマンドを使用します。vagrant upのときにログインに必要な設定も行われているので、このコマンドを実行するだけでログインできます。
$ vagrant ssh
vagrant sshでログインするとvagrantユーザとしてログインします。
rootユーザへスイッチしたい場合は以下のコマンドを実行します。
$ sudo su -
ログアウトは通常通りexitやlogoutコマンドで行います。
$ exit
仮想マシンの状態確認
仮想マシンの状態確認してみましょう。ルートディレクトリで vagrant status コマンドを実行します。
$ vagrant status
「not created(仮想マシン未作成)」「poweroff(電源オフ)」「running(起動中)」など、仮想マシンの状態が表示されます。
システム上のすべての仮想マシンの状態を表示するには次のコマンドを実行します。このコマンドは特定のプリジェクトのルートディレクトリ以外でも実行できます。
$ vagrant global-status
ただし、このコマンドはキャッシュに基づいて状態を表示しているため、古い情報が表示される可能性があります。無効なものを削除するためには--pruneオプションを指定してコマンドを実行します。
仮想マシンの再起動
仮想マシンを再起動するにはルートディレクトリで vagrant reload コマンドを実行します。
$ vagrant reload [名前|id]
仮想マシンを停止する
仮想マシンを停止してみましょう。それにはルートディレクトリで vagrant halt コマンドを実行します。
$ vagrant halt
仮想マシンは停止(電源オフ)するだけなので、再び仮想マシンを稼働させるには「vagrant up」で起動します。
仮想マシンの削除
最後に作成した仮想マシンを削除してみましょう。
それにはルートディレクトリで vagrant destroy コマンドを実行します。 本当に削除するか確認を求められますので「y」で回答して削除します。
$ vagrant destroy
仮想マシンを削除してもVagrantfileなどはそのまま残りますので、 vagrant up コマンドを実行すれば、再度、仮想マシンを作成できます。
仮想マシン構築のまとめ
いかがでしたでしょうか。とっても簡単だったと思います。これでVagrantの基本的な使い方はマスターできたと思います。
しかし、ここで作成した仮想マシンはboxファイルの初期状態のままです。本当に試験する場合などは、ここからパッケージをインストールしたり、設定ファイルを変更したり、ネットワークを設定したりする事が必要になるでしょう。
そのような変更を自動化するために、Vagrantは仮想マシン起動時(vagrant up)に、シェルスクリプトを実行したり、Ansibleのような構成管理ツールを実行する方法がサポートされています。ここではこれ以上は触れませんがドキュメントに記載があるので参照してみてください。
boxファイルの管理コマンド
最後にboxファイルについて説明したいと思います。boxファイルはダウンロードされてローカル環境に保存されます。保存される場所は「~/.vagrant.d/boxes」です。これは仮想マシンのプロジェクトとは別に管理されています。
今回はローカル環境へのboxファイルの追加を明示的に行いませんでしたが、初回の vagrant up 時にダウンロードされて追加されています。
それではboxファイルを管理するコマンドを見ていきましょう。
boxファイルの一覧表示
まずはローカル環境に保存されているるboxファイルの一覧を表示してみましょう。それには次のコマンドを実行します。
$ vagrant box list
コマンドを実行すると今回仮想マシンに追加った「centos/7」というboxファイルが表示されるでしょう。
boxファイルの追加
boxファイルを追加するには以下のコマンドを実行します。
vagrant box add boxの名前
boxの名前は「HashiCorp's Vagrant Cloud」で検索したUSER/BOXの形式です。今回の場合で言うと「centos/7」です。
boxファイルの削除
Vagrantからboxファイルを削除するには次のように実行します。
$ vagrant box remove boxの名前
boxファイルのアップデート
boxファイルをアップデートしたければ次のように実行します。
vagrant box update
まとめ
この記事では基本的な仮想マシンの作成とvagrantコマンドの使い方を説明しました。この後はさまざまな環境を構築するためのVagrantfileの書き方を学ぶと良いでしょう。
以上で本編は終わりととなりますが、最後におまけとしてvagrant up 時のログを説明します。ログを見ると起動時にVagrantが実際に何をしているかがわかるので、理解を深めることに役立つでしょう。
参考:Vagrant起動時のログの説明
参考情報として起動時のログの詳細を説明します。
Bringing machine 'default' up with 'virtualbox' provider... ==> default: Box 'centos/7' could not be found. Attempting to find and install... default: Box Provider: virtualbox default: Box Version: >= 0 ==> default: Loading metadata for box 'centos/7' default: URL: https://vagrantcloud.com/centos/7 ==> default: Adding box 'centos/7' (v1905.1) for provider: virtualbox default: Downloading: https://vagrantcloud.com/centos/boxes/7/versions/1905.1/providers/virtualbox.box default: Download redirected to host: cloud.centos.org ==> default: Successfully added box 'centos/7' (v1905.1) for 'virtualbox'! ==> default: Importing base box 'centos/7'...
'centos/7'というboxファイルがローカルで見つからないので、 ダウンロードしてboxに追加しています。 プロバイダはvirtualboxという出力も見られます。
==> default: Matching MAC address for NAT networking... ==> default: Checking if box 'centos/7' version '1905.1' is up to date... ==> default: Setting the name of the VM: test_project_default_1570323199848_99368 ==> default: Clearing any previously set network interfaces... ==> default: Preparing network interfaces based on configuration... default: Adapter 1: nat
これはネットワークの設定です。仮想マシンの「Adapter 1」がNATに設定されています。
==> default: Forwarding ports... default: 22 (guest) => 2222 (host) (adapter 1) ==> default: Booting VM... ==> default: Waiting for machine to boot. This may take a few minutes... default: SSH address: 127.0.0.1:2222 default: SSH username: vagrant default: SSH auth method: private key default: default: Vagrant insecure key detected. Vagrant will automatically replace default: this with a newly generated keypair for better security. default: default: Inserting generated public key within guest... default: Removing insecure key from the guest if it's present... default: Key inserted! Disconnecting and reconnecting using new SSH key...
フォワーディングポートとSSHの設定をしています。 これは、ホストOSの127.0.0.1のポート番号2222への通信を ゲストOSの22番ポート(SSHのポート)へ転送する設定しています。 そして、SSHの公開鍵認証の設定も行われています。 VagrantでゲストOSへ接続するときには、これらの設定が使われます。
==> default: Machine booted and ready! ==> default: Checking for guest additions in VM... default: No guest additions were detected on the base box for this VM! Guest default: additions are required for forwarded ports, shared folders, host only default: networking, and more. If SSH fails on this machine, please install default: the guest additions and repackage the box to continue. default: default: This is not an error message; everything may continue to work properly, default: in which case you may ignore this message. ==> default: Rsyncing folder: /Users/hoge/workspace_vagrant/vagrant_project/ => /vagrant
仮想マシンの準備ができたようです。 最後のメッセージはホストOSの/Users/hoge/workspace_vagrant/vagrant_project/ディレクトリと 仮想マシンの/vagrantディレクトリが同期したというメッセージも見られます。
デフォルトでプロジェクトのルートディレクトリにあるファイルは、仮想マシンの/vagrantディレクトと同期されます。 ただし、通常はプラグインを入れないと単にホストOSの /Users/hoge/workspace_vagrant/vagrant_project/にあるファイルが、ゲストOSの/vagrantにコピーされるだけのようです。