macにVagrant導入
最近の開発に欠かせなくなってきたvagrant
導入の手順と簡単な設定手順を備忘録として
環境はmac osX 10.9
インストールと起動
-
Virtualboxのインストール
-
Vagrantのインストール
公式サイトのダウンロードベージから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ページの表示をホストのブウラザで確認するという
一連の開発作業が問題なくできるようになると思う。
なにより、数秒でクリーンな開発環境が作れるのは
色々な作業の敷居を下げてくれるので手放せない。