仮想マシン構築(VirtualBox + Vagrant)
はじめに
アプリケーション開発でLinuxマシンが必要になった場合、実機を用意するのはコスト、スペース的に面倒です。 AWS EC2やAzure VMなどの仮想サーバも良いですが、ローカルな環境でとりあえず開発をするには仮想マシンが役に立ちます。 仮想マシンを利用することで、手元のMacやWindowsの中でLinux環境を再現できます。 本記事では仮想マシンを構築するVirtualBoxと、これを管理するVagrantというソフトウェアについて解説します。 *この記事はMacユーザを対象に書いています。Windowsユーザは適宜読み替えてください。
VirtualBoxとは
VirtualBoxはオラクルが提供する仮想化ソフトウェアです。
VirtualBoxを使うことでOS上で仮想のOSを動かすことができます。
例えば、MacやWindowsの中にLinux環境を構築することが可能です。
同様の機能を持ったソフトウェアにVMwareなどがあります。
VirtualBoxを動かすOS(元からあるOS)をホストOS、新しく作るOSをゲストOSと呼びます。
一つのホスト上に複数のゲストOSを立てることもできます(メモリの関係で限度はありますが)。
VirtualBox単体では使い勝手が悪いので後述のVagrantと組み合わせて使います。
Vagrantとは
Vagrant(ベイグラント)はVirtualBoxやVMwareなどによる仮想マシン構築を補助するツールです。
設定ファイルに記述することで、仮想マシン構築の手順を文書化したり共有したりすることが簡単になります。
また、コマンドラインからVM(仮想マシン)の起動や停止、破棄などを簡単に指示することもできます。
チーム開発においては特に開発環境を共有することで得られる恩恵は大きいです。
インフラに疎いメンバーでも即座に環境構築をできるので、開発の本筋に注力することができます。
元々VirtualBoxを対象として開発されたものなのでこれを使うのが最もスタンダードでしょう。
インストール
早速諸々インストールしていきます。
まずはVirtualBoxをインストールします。
公式サイトから自分の環境に合わせたものをダウンロードしましょう。
VirtualBox公式サイト
インストーラを開いて進めます。
このような画面です。
引き続きVagrantをインストールします。
公式サイトからインストーラをダウンロードしましょう。
Vagrant公式サイト
実行して指示に従います。
このような画面が開かれます。
Vagrant.pkgをダブルクリックしてインストールを完了します。
ターミナルでバージョン確認しましょう。
vagrant -v
Vagrant 1.8.1
バージョンが確認できたらインストール成功です。 前準備は以上です。
仮想マシン起動
それでは仮想環境を構築します。 今回はCent OS 7をMac環境に用意します。 githubからCentOS7.0のboxをダウンロードします。 (vagrantでは仮想マシンの元になるファイルをboxと呼びます。) 3分くらいかかります。
vagrant box add CentOS7.0 https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'CentOS7.0' (v0) for provider:
box: Downloading: https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box
==> box: Successfully added box 'CentOS7.0' (v0) for 'virtualbox'!
ダウンロードできたら、このboxをもとに仮想マシンを作成します。
vagrant init box名でboxから仮想マシンを作成できます。
この時ディレクトリ内に設定ファイルであるVagrantfileが作成されます。
そしてvagrant upでVagrantfileの記述に従って仮想マシンを起動します。
適当にディレクトリを作って、そこで行います。
cd ~
mkdir CentOS7.0
cd CentOS7.0
vagrant init CentOS7.0
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.
vagrant up
2回目以降はinitせずにVagrantfileのあるディレクトリでupします。
作ったVMにはvagrant sshでSSH接続することができます。
vagrant ssh
last login: Thu Jul 16 08:48:31 2015 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
基本コマンド
よく使う基本のコマンドを紹介します。
VM起動
vagrant up
VM終了
シャットダウン状態です。upコマンドで再度起動することができる状態です。
vagrant halt
VMの状態を確認
vagrant status
SSH接続、離脱
vagrant ssh #接続
exit #離脱
VM破棄
destroyコマンドはhaltコマンドと異なり、VMを破棄してしまうコマンドです。 対象のVMは削除されてしまい、再度起動することができなくなります。
vagrant destroy
全てのVMの状態を確認する
複数のVMを使っていると、それぞれの状態を確認するのが億劫になります。 その場合は以下のプラグインを導入することで、全体のstatusを確認することが可能になります。 まず以下のコマンドでプラグインを導入します。
vagrant plugin install vagrant-global-status
以下のコマンドで現在あるすべてのVMを確認できます。
vagrant global-status
Dockerとの違い
よくVagrantと比較対象に挙げられるのがDockerです。 Dockerでは仮想マシンではなくコンテナというものを作成します。 詳細は省きますが、ざっくり説明します。 先述のようにVirtualBoxでは丸々新しいOSを作成します。 しかし、OSの核の部分(カーネル)はホストOSとゲストOSで共通部分が少なからずあります。 この共通部分をわざわざ新しく作らずに、ホストのカーネル部分をゲストも利用するのがDockerのやり方です。 そのためDockerの起動は仮想マシンに比べると高速です。 メモリ消費量も少ないためたくさん立てることができます。
Infrastracture as Codeとは
VagrantにしろDockerにしろ、最大のメリットは環境構築を文書化することだと考えています。 煩雑な環境構築をWordの手順書にして(Wordの手順書!)、頭からコマンドをコピペしていく。。。 途中で1行飛ばしたり、バージョンが変わっていてエラー、エラー&エラー。 考えたくもないですね。 Infrastracture as Codeはその名の通りインフラ構築をコードで記述するという考え方です。 VagrantfileやDockerfileのように特定の形式で記述することで、あとは数kBのファイルをやり取りするだけで環境を再現できます。 構成管理ツールと呼ばれるAnsibleやChef、Puppetなどのツールを用いることでVagrantによる環境構築をさらに自動化することができますが、それはまたの機会に。 (楽なるためのツールを取り入れようとした結果、学習コストに苦しむこともあります。ご利用は計画的に。。。)