最近の開発に欠かせなくなってきたvagrant
導入の手順と簡単な設定手順を備忘録として
環境はmac osX 10.9

インストールと起動

公式サイトのダウンロードベージからdmgをダウンロード
DLしたインストーラを起動してインストール

完了したら確認を含めversionを表示してみる

vagrant --version

boxファイルを選択する

vagrantのbox共有サイト、ここで大体欲しいboxは見つかる

Vagrantfileを作成する
今回は上記サイトの[Ubuntu precise 64 VirtualBox]を使用する

mkdir vagrant_work
cd vagrant_work
vagrant init precise64 http://files.vagrantup.com/precise64.box

仮想マシンを構築する
初回はremoteでboxファイルのDLが発生する。
次回以降はローカルに保存済みのため高速
ベースになるboxファイルは[~/.vagrant.d/boxes]配下に出来る
VirtualBoxを使ってvagrant upすると[~/VirtualBox\ VMs/]配下に仮想マシンが出来る

vagrant up

仮想マシンにsshで接続する

vagrant ssh

仮想マシンをサスペンドする

vagrant suspend

仮想マシンを停止する

vagrant halt

仮想マシンを廃棄する

vagrant destory
# `vagrant destroy`すると`vagrant up`で作成した仮想マシンは完全に削除される

boxファイルの管理

ダウンロード済みのboxファイルのリストを表示

vagrant box list

不要になったboxファイルの削除

vagrant box remove box名

Vagrantfileについて

仮想マシン構築時の設定等を記述する。
デフォルトは100行ぐらい色々書いてあるけどほとんどコメント。

grep -v -e '\#' -e "^$" Vagrantfile

初期の設定内容は実際はこんな感じ。
rubyのスクリプトになっている。

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "precise64"
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
end

※バージョン管理でVagrantfileのあるディレクトリを管理する場合
は同ディレクトリ内にある./vagrant以下をバージョン管理下から外す。
これらは稼働している仮想マシン固有の情報なので共有してしまうと問題が起きる。

ホストOSとの共有ディレクトリを作成する

共有ディレクトリ内のファイルはvagrant destroyしても消えない。
デフォルトではVagrantfileがあるディレクトリが共有ディレクトリとして設定されている
ゲストOSからはデフォルトでは[/vagrant/]でアクセスできる。
共有ディレクトリの場所を変更するにはVagrantfileを以下のように変更する

# 第一引数は固定、第二引数でゲストOS上の共有ディレクトリパス、第三引数でホストOS上のパスを指定する
config.vm.share_folder "v-root", "/shared_dir", "/Users/xxx/Dropbox/work/vagrant_share"

設定を変更したら以下のコマンドで仮想マシンを再起動、新しい設定で読み込ませる

vagrant reload

ここでエラー

There are errors in the configuration of this machine. Please fix
the following errors and try again:

vm:
* The following settings shouldn't exist: share_folder

確認したところvagrantはV1とV2という二つのバージョンの設定方法を
サポートしていて上記の書き方はV1のモノだったのでV2では以下のように書く

config.vm.synced_folder "/Users/xxx/Dropbox/work/vagrant_share", "/shared_dir"

ちなみに、vagrantはV1とV2の両方の設定を共存する事を許容しているので

# V2形式での記述
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  ...
end

# V1形式での記述
Vagrant::Config.run do |config|
  config.vm.share_folder "v-root", "/shared_dir", "/Users/xxx/Dropbox/work/vagrant_share"
end

みたいな風にしても問題はない。

ただ、V1とV2でゲストOS側のパスとホストOS側のパスの引数の順番が
逆になっているので注意

ネットワーク設定

ゲストOS上のwebサーバにホストOSからアクセスできるようにする

  • Vagrantfileを以下のように編集

    config.vm.network "forwarded_port", guest: 80, host: 8080
    # V1のconfigは以下のようにする
    # config.vm.forward_port 80, 8080
    
  • 仮想マシンを再起動

    vagrant reload
    
  • ゲストOSにapacheをインストール、起動

    sudo apt-get -y install apache2
    cd /etc/apache2/sites-available
    sudo cp default mysite
    sudo a2ensite mysite
    sudo /etc/init.d/apache2 start
    
  • ホストOS側からゲストOSのwebページにアクセスしてみる

    ホストのブラウザ上から[localhost:8080]にアクセスしてwebページが表示されれば成功

メモリサイズ変更

Vagrantfileに以下を追記してvagrant reloadする

# V2の場合
config.vm.provider :virtualbox do |vb|
  vb.customize ["modifyvm", :id, "--memory", "1024"]
end
# V1の場合
config.vm.customize ["modifyvm", :id, "--memory", "1024"]

共有ディレクトリが遅い!

railsのアプリを開発する時にソースを共有ディレクトリに置いて
エディタはホスト側のモノを使ってゲスト側でアプリを実行した時に
最初、遅過ぎて使いモノにならなかった
rails s した時、assets関係の読み込みに1分以上かかるとか。。。
この問題は共有ディレクトリをNFSとしてマウントすればかなり改善される
private_networkのipは適宜変更

config.vm.synced_folder "/xxxx/VirtualBox VMs/vm_share", "/shared_dir", :nfs => true
config.vm.network :private_network, ip: "192.168.33.10"

まとめ

ここまで設定ができれば、ホスト側のエディタで今まで通り開発して
ゲストOS上のwebページの表示をホストのブウラザで確認するという
一連の開発作業が問題なくできるようになると思う。
なにより、数秒でクリーンな開発環境が作れるのは
色々な作業の敷居を下げてくれるので手放せない。