Laravel4 Boxをもっと便利に

タグ: Laravel4   Vagrant   VirtualBox  

Ubuntu12.04+Laravel4のVagrant Boxをもうちょっと簡単に素早く使いましょうという紹介記事です。一度作成した環境をパッケージングし直し、起動時の設定にかかる時間を省力する方法です。

(追記:現在だいぶ改良され、今は2度めの起動以降は、さほど遅くなりません。プロビジョンをやり直さなくなったようです。そのため、ここで紹介する再パッケージは、特に必要ありません。)

まずは動かしましょう。

ご自身の環境でVirtualboxとvagrantをインストールする必要があります。

次に以下の記事を参考にして、正しく動作する仮想マシーンをまず作成してください。

何を行なっているか

上記の記事で紹介した方法でvagrant upにより自動に行われているのは次の過程です。

  1. VagrantがWeb上に用意しているUbunt12.04の最低限度パッケージBox(Precise32)を取り込む
  2. 必要なリソースをフェッチする(apt-get)
  3. 環境のセットアップを行う

一度Boxをダウンロードしたら、Vagrantはそれを維持しているので、同じBoxを使用する場合でも再度ダウンロードすることはありません。保存してあるBoxをコピーして使いまわします。

2はUbuntuによりリソース管理されており、通常は初回の一回のみですが、アップデートされる場合もあるかも知れません。その場合は、再度取り込まれます。

3は、Upを行うと毎回行われます。haltして仮想マシーンを停止させ、その後にupする場合も、同じ内容のVagrantfileとBoxを使用して別の仮想マシーンを作成する場合でも、毎回設定作業を行い、そのための時間が結構かかります。

Vagrantのパッケージ

一度vagrant upが上手く行ったら、その仮想マシーンは設定済みの環境になっているわけです。それならば、この構築済みの環境を基にして次回Upできれば、設定の時間が必要ありません。ほぼVirtualboxとVagrantの起動時間だけですみます。起動時間が短縮できるわけです。

VirtualBoxではスナップショットという、その時点の状況をそのまま保存する機能があります。それと同様にVagrantにも、その時点の環境をそのままBoxにできるpackageコマンドが用意されています。

ただし、VirtualBoxのスナップショットと異なり、一度仮想マシーンを停止させる必要があります。もし、停止していない場合は、自動的にhaltが実行されます。

vagrant package

パッケージングには多少の時間がかかります。終了するとpackage.boxという新しいボックスが出来上がります。

packageコマンドはオプションを駆使してVagrantfileを取り込んだりもできますが、自前で使用するなら、このように複雑なことを行わなくても簡単な方法で利用できます。

Boxの登録

initコマンドやVagrantfile中の設定で、このファイルのパスをURLの代わりに指定するとその仮想マシンに取り込まれます。

しかし個人の環境で使用するなら、まずBox名を付けてVagrantに登録してしまいましょう。同じ環境を使いまわすのに便利です。例えばubuntu32larave4というBox名を付けるのであれば:

vagrant box add ubuntu32laravel4 package.box

もちろんお好きなBox名で、お好きなBoxファイルを登録できます。登録し終えたら、package.boxは削除しても構いません。登録時に、別の場所へコピーされています。

ボックスの登録を削除する必要が起きたら、次のコマンドで行います。

vagrant box remove ubuntu32laravel4 virtualbox

最後のvirtualboxはいまのところ決めうちで指定する必要がありますが、将来のバージョンでは指定しなくても削除できるようになります。

新しい仮想マシーンを作成する

この登録した新しいBoxを使用し、別の環境を作成してみましょう。

まず、新しいディレクトリーを作成します。そのディレクトリーに移動してください。

続いてwwwディレクトリーを新しいディレクトリーにコピーしましょう。

次にVagrantfileを作成します。(私のリポのjapaneseとxdebug/japaneseブランチにはVagrantfile2として入れています。Vagrantfileにリネームしてお使いください。)

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Ubuntu12.04+Laravel4 再パッケージ時用 Vagrantfile

Vagrant.configure("2") do |config|

  # 作成したボックス名を指定してください
  config.vm.box = "ubuntu32laravel4"

  # SSH リトライ回数
  config.ssh.max_tries = 10

  # ポートフォワード 複数マシン作成する時はダブらないように変更します
  config.vm.network :forwarded_port, guest: 80, host: 8888
  config.vm.network :forwarded_port, guest: 3306, host: 8889
  config.vm.network :forwarded_port, guest: 5432, host: 5433

  # 共有フォルダー
  config.vm.synced_folder "www/", "/var/www", :extra => 'dmode=777,fmode=777'

  # ホスト側でもchmod -R 777 www/app/storageを実行する必要があるかも知れません

end

boxの名前は、登録した"ubuntu32laravel4"になります。既に登録済みですのでURLは指定していません。

比較して理解しやすいように、元の仮想マシーンのVagrantfileと同じポートを割り振っていますが、別マシーンを作成する場合ホストのポートは重複しないよう、マシンごとに別のポート番号を割り振りましょう。

後は、これでvagrant upを実行すれば、余計なフェッチ作業も入らずマシンが動作します。

現状、Laravel 4をちょっといじっただけの確認しかしていません。お気づきの点は各自修正してください。

どうしてこのBoxを公開しないの?

確かにこれを公開できれば便利ですね。直接URLに指定するだけで利用できるようになるんですからね。

しかしBoxファイルは約0.5Gもあります。2回ダウンロードされると、それだけで1Gになります。

自前サーバーの場合は転送量を鑑みなくても利用できます。ですから自前サーバーを持っている方の中には公開されている人もいます。

ところが自前の公開サーバーを持っていない場合、どんな種類のホスティングサービスであろうと転送量やディスク容量など何かしらの制限があります。それに引っかかったり、大きな転送量に対して大きな金額を支払う羽目になります。もしくは多くのユーザーからアクセスされれば、それなりに負荷がかかります。ですから通常できません。

理想的には、転送量の心配などいらない開発会社の方が、自社の開発力をみせるために使いやすいBoxをアチラコチラで公開してくるようになることが理想ですね。(期待しています。;) )

注意点

新しいBoxをパッケージングする、BoxをVagrantに登録するごとに、ボックスがコピーされます。現状で500Mあります。ですから、この作業だけで1G使用します。

さらに新しいマシーンを作成する、suspendするとその分ディスク容量を消費します。

容量に余裕がない場合はお気をつけ下さい。