Home > Vagrant
Vagrant Archive
vagrant-serverspec で TDD ライクにサーバ構築を行う
- 2013-12-24 (火)
- Advent Calendar 2013 | Vagrant
Shin x blog Advent Calendar 2013 の 24 日目です。
先日リリースされた vagrant-serverspec を使って、テストドリブンなサーバ構築を行ってみました。
vagrant-serverspec
vagrant-serverspec は、サーバ、インフラの状態をテストするツール serverspec を Vagrant のプロビジョナとして実行できるプラグインです。これを使うことで、vagrant コマンドから、serverspec のテストを実行することができます。
詳しくは、@ryuzee さんの下記エントリを参照して下さい。
vagrant-serverspecを使ってプロビジョニング結果をテストする | Ryuzee.com
仕様
今回構築するサーバの仕様は下記です。PHP 5.5.x をインストールして、ビルトインサーバを起動するというものです。(※ちなみにビルトインサーバは開発用途でのみ利用して下さい。)
* PHP 5.5.x を yum でインストール(remi-php55)
* date.timezone を Asia/Tokyo に設定
* ビルトインサーバを Port 8000 で起動
また、環境は下記で動作確認しています。必要であれば、それぞれについてインストールを行なって下さい。
* Vagrant 1.4.1
* VirtualBox 4.3.0
* serverspec 0.13.7
* ansible 1.2.2
vagrant-serverspec インストール
vagrant plugin
コマンドで、vagrant-serverspec をインストールします。
$ vagrant plugin install vagrant-serverspec
Vagrantfile 作成
Vagrant で仮想サーバを構築して、このサーバを仕様を満たす形に進めていきます。まず、vagrant init
コマンドで Vagrantfile を作成します。
$ vagrant init centos64_ja
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.
serverspec-init でデフォルトのテストケースを作成
テストドリブンということで、先に serverspec のテストを作っていきます。
serverspec-init
コマンドで、デフォルトのテストケースを生成します。いくつかオプションを選択する必要があるので、下記のように回答しています。
$ serverspec-init Select OS type: 1) UN*X 2) Windows Select number: 1 Select a backend type: 1) SSH 2) Exec (local) Select number: 1 Vagrant instance y/n: y Auto-configure Vagrant from Vagrantfile? y/n: y + spec/ + spec/default/ + spec/default/httpd_spec.rb + spec/spec_helper.rb + Rakefile
作成されたスペックファイルを元にテストケースを作ります。今回は、PHP に関するテストとなるので、spec/default/httpd_spec.rb を spec/default/php_spec.rb というファイルにリネームします。そして、このファイルにテストケースを書いていきます。
まずは、下記のように、PHP パッケージがインストールされているかだけを確認するテストを書きました。
$ mv spec/default/httpd_spec.rb spec/default/php_spec.rb $ vim spec/default/php_spec.rb require 'spec_helper' describe package('php') do it { should be_installed } end
作成したテストケースが実行されるように Vagrantfile に serverspec のプロビジョニング設定を記述します。spce/default/ 以下の全てのスペックファイルを対象としています。
config.vm.provision :serverspec do |spec| spec.pattern = "spec/default/*_spec.rb" end
これで、vagrant up
を実行すると、serverspec のテストが実行されます。では、実際にvagrant up
を実行してみましょう。下記のように、serverspec プロビジョナが実行され、テストが失敗しました。まだ、PHP はインストールしていないので、これは当然の結果です。
$ vagrant up Bringing machine 'default' up with 'virtualbox' provider... (snip) [default] Running provisioner: serverspec... F Failures: 1) Package "php" should be installed Failure/Error: it { should be_installed } sudo rpm -q php パッケージ php はインストールされていません。 expected Package "php" to be installed # ./spec/default/php_spec.rb:4:in `block (2 levels) in' Finished in 5.07 seconds 1 example, 1 failure Failed examples: rspec ./spec/default/php_spec.rb:4 # Package "php" should be installed
では、PHP をインストールするプロビジョニングをシェルで記述してみます。このプロビジョニングは、serverspec よりも前に実行する必要があるので、serverspec プロビジョニングより上に記述します。
config.vm.provision :shell, :inline => <<-EOT # # yum repository # rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm yum -y install php --enablerepo=remi-php55 EOT config.vm.provision :serverspec do |spec| (snip)
これで、PHP をインストールが行われ、その後に serverspec が実行されるので、テストが通るはずです。vagrant provision
コマンドを実行して、プロビジョニングを行うと、今後はちゃんとテストが通りました。
$ vagrant provision (snip) [default] Running provisioner: serverspec... . Finished in 4.31 seconds 1 example, 0 failures
次に PHP のバージョンが、5.5.x であることを確認するためにテストを追加します。spec/default/php_spec.rb に下記を追加します。
describe command('php -v') do it { should return_stdout /^PHP 5\.5\./ } end
テストを再実行します。次は、--provision オプションで、serverspec のみを実行するようにします。ちゃんとテストが通りました。これで、サーバには PHP パッケージがインストールされており、バージョンが 5.5.x であることが確認できました。
$ vagrant provision --provision=serverspec [default] Running provisioner: serverspec... .. Finished in 4.23 seconds 2 examples, 0 failures
date.timezone を Asia/Tokyo に変更する
次に PHP ではお馴染みの date.timezone 設定が Asia/Tokyo であることを確認します。
serverspec では、php_config という、そのままずばり PHP の設定を確認するためのリソースタイプが用意されているので、これを spec/default/php_spec.rb に追加します。
describe 'PHP config parameters' do context php_config('date.timezone') do its(:value) { should eq 'Asia/Tokyo' } end end
プロビジョニングを再実行して、今回追加したテストが失敗することを確認します。
$ vagrant provision (snip) [default] Running provisioner: serverspec... ..F Failures: 1) PHP config parameters Php config "date.timezone" value should eq "Asia/Tokyo" Failure/Error: its(:value) { should eq 'Asia/Tokyo' } sudo php -r 'echo get_cfg_var( "date.timezone" );' expected: "Asia/Tokyo" got: "" (compared using ==) # ./spec/default/php_spec.rb:13:in `block (3 levels) in' Finished in 5.23 seconds 3 examples, 1 failure Failed examples: rspec ./spec/default/php_spec.rb:13 # PHP config parameters Php config "date.timezone" value should eq "Asia/Tokyo"
では、このテストが通るように date.timezone
を設定するプロビジョニングを書きましょう。
今回は、php.ini の値を上書きするために zzmyphp.ini というファイルを作成し、ここに date.timezone
の設定を記述することにします。
$ mkdir provision $ vi provision/zzmyphp.ini date.timezone="Asia/Tokyo"
このファイルをシェルプロビジョニングで、仮想サーバの /etc/php.d/ にコピーします。
config.vm.provision :shell, :inline => <<-EOT # # yum repository # rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm yum -y install php --enablerepo=remi-php55 cp -a /vagrant/provision/zzmyphp.ini /etc/php.d/ # <--- 追加 EOT
これでテストが通るはずです。vagrant provision を再実行します。下記のとおり、テストが通ったので、date.timezone
の値が Asia/Tokyo
となっていることが確認できました。
$ vagrant provision (snip) [default] Running provisioner: serverspec... ... Finished in 5.12 seconds 3 examples, 0 failures
ビルトインサーバを起動
最後に PHP のビルトインサーバを 8000 ポートで起動します。DocumentRoot は、/vagrant にします。
まずテストから書きます。ここでは簡易的にポート 8000 で Listen しているかを確認します。
describe port(8000) do it { should be_listening } end
プロビジョニングを行なって、追加したテストが失敗することを確認しておきます。
$ vagrant provision (snip) [default] Running provisioner: serverspec... ...F Failures: 1) Port "8000" should be listening Failure/Error: it { should be_listening } sudo netstat -tunl | grep -- :8000\ expected Port "8000" to be listening # ./spec/default/php_spec.rb:18:in `block (2 levels) in' Finished in 6.07 seconds 4 examples, 1 failure Failed examples: rspec ./spec/default/php_spec.rb:18 # Port "8000" should be listening
では、シェルプロビジョニングでビルトインサーバを起動するように設定します。ここでは supervisor を使って、ビルトインサーバを起動するようにします。
config.vm.provision :shell, :inline => <<-EOT rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm yum -y install php --enablerepo=remi-php55 cp -a /vagrant/provision/zzmyphp.ini /etc/php.d/ # 追加 yum -y install supervisor cp -a /vagrant/provision/supervisord.conf /etc/ chkconfig supervisord on service supervisord start EOT
vagrant provision を実行すると、ビルトインサーバが起動され、テストが通りました。これで、ビルトインサーバがポート 8000 で起動していることが確認できました。
$ vagrant provision (snip) [default] Running provisioner: serverspec... .... Finished in 6.07 seconds 4 examples, 0 failures
プロビジョナを ansible に変更
これで仕様どおりに稼働するサーバを構築することができました。すでに仕様を検証する serverspec のテストがあるので、構築するためのプロビジョナを変更しても、要求された仕様を満たしているかを検証することができます。ではプロビジョナを ansible に変えて再度サーバを構築し直してみましょう。
Vagrantfile のシェルプロビジョニングの設定を削除して、代わりに ansible の設定を下記のように書きます。
config.vm.provision :ansible do |ansible| ansible.playbook = "provision/playbook/main.yml" end
provision/playbook 以下に main.yml というプレイブックを配置しています。やっている内容は、シェルプロビジョニングとほぼ同じです。
--- - hosts: all sudo: yes tasks: - name: add yum repositories copy: src=files/{{ item }} dest=/etc/yum.repos.d/ with_items: - epel.repo - epel-testing.repo - remi.repo - name: add rpm-gpg-keys copy: src=files/{{ item }} dest=/etc/pki/rpm-gpg/ with_items: - RPM-GPG-KEY-EPEL-6 - RPM-GPG-KEY-remi - name: install PHP 5.5.x yum: name=php enablerepo=remi-php55 - name: put zzmyphp.ini copy: src=../zzmyphp.ini dest=/etc/php.d/ backup=yes - name: install supervisor yum: name=supervisor - name: put supervisord.conf copy: src=../supervisord.conf dest=/etc/supervisord.conf backup=yes - name: enable supervisor service: name=supervisord enabled=yes state=started
では、この ansible プロビジョニングでもテストが通るかを確かめてみます。前回のシェルプロビジョニングで構築した内容が残っているので、仮想マシンを破棄してから、再構築します。
下記のとおり、ansible によるプロビジョニングが実行され、テストが無事に通りました。これにより、要求された仕様が満たされていることが確認できました。
$ vagrant destory -f $ vagrant up (snip) [default] Running provisioner: ansible... PLAY [all] ******************************************************************** GATHERING FACTS *************************************************************** [98/3036] ok: [default] TASK: [add yum repositories] ************************************************** changed: [default] => (item=epel.repo) changed: [default] => (item=epel-testing.repo) changed: [default] => (item=remi.repo) TASK: [add rpm-gpg-keys] ****************************************************** changed: [default] => (item=RPM-GPG-KEY-EPEL-6) changed: [default] => (item=RPM-GPG-KEY-remi) TASK: [install PHP 5.5.x] ***************************************************** changed: [default] TASK: [put zzmyphp.ini] ******************************************************* changed: [default] TASK: [install supervisor] **************************************************** changed: [default] TASK: [put supervisord.conf] ************************************************** changed: [default] TASK: [enable supervisor] ***************************************************** changed: [default] PLAY RECAP ******************************************************************** default : ok=8 changed=7 unreachable=0 failed=0 [default] Running provisioner: serverspec... .... Finished in 10.62 seconds 4 examples, 0 failures
さいごに
Vagrant と serverspec の相性が良いのは分かっていたのですが、vagrant up の後にいちいち rake spec を実行するのが面倒だなと感じていました。
vagrant-serverspec を使えば、プロビジョニングの後に自動で serverspec が実行されるので、構築とテストを一息で行うことができます。
仕様を決める、テスト書く、vagrant provision 、プロビジョニング書く、vagrant provision の流れはなかなか気持ち良いです。こうして検証済のプロビジョニングは、本番環境など Vagrant 以外の環境でも利用できますし、当然ながらそのテストも serverspec で行うことができます。
サーバ設定はわりと仕様が決まりやすく、テストが書きやすいと思うので、vagrant-serverspec を使って、テストドリブンなサーバ構築を行ってみて下さい。
参考
- コメント (Close): 0
- トラックバック (Close): 0
Vagrant に見るインテグレーションのヒント
- 2013-12-23 (月)
- Advent Calendar 2013 | Docker | Vagrant
Shin x blog Advent Calendar 2013 の 23 日目です。
今年一年を振り返った時に、一番インパクトがあったのは Vagrnat でした。
昨年までも存在は知っていたものの、本質を理解しておらず、単に仮想マシンをコマンドで扱えるもの程度の認識でした。今年に入り、利用法が分かった後は、開発環境や検証環境などを構築するのに大いに役立っています。
Vagrant はパッケージとしてよく出来ており、それまで一部の人しか扱わなかった仮想化環境を多くの人に解放してくれました。ここでは、Vagrant の構成から、システムインテグレーションを行う上でのヒントを見出してみたいと思います。
既存技術をインテグレーションしたツール
まず、Vagrant で興味深いのは、基礎的な技術要素は、Vagrant 自身では提供しておらず、外部のソフトウェアやサービスを利用しているという点です。
仮想化環境にしても、プロビジョニングツールにしても、以前から存在しており、特段珍しいものではありません。これらを上手く組み合わせて、Vagrant という一つのツールとして扱えるようにしています。
Vagrant を知っても、すぐに触手が伸びなかった人(私も含めて)は、このインテグレーションしている部分が見えず、単に技術要素だけを見ていたのではないでしょうか。もちろん、技術要素が無ければ動作しないのですが、そこだけを見ていると本質を見誤ります。それらを組み合わせて、より良い使い方を提示しているのが Vagrant というツールです。
ある意味、技術要素は上手く隠蔽して、ツールの目的を果たせるような作りにするのが手腕の見せ所なのかもしれません。
実行環境を同梱
Vagrant 1.0.x の頃は、パッケージでのインストールの他に gem でのインストールも可能でした。もともと gem コマンドを使っている人にとっては便利なものですが、そうで無い人にとっては、まずは gem の環境を整える必要があり、インストールの障壁となる場合がありました。また、Ruby や gem のバージョンがユーザ毎に異なるので、その環境固有が問題が生じてしまいます。
そこで Vagrant 1.1 からは、Ruby の実行環境ごと Vagrant にパッケージングして、これさえダウンロードすれば、同じ環境で動くようになっています。これには、Vagrant 開発側が多様な環境をサポートする手間を削減するという面もありますが、ユーザとしても、自分の環境に Ruby があろうが無かろうが、そんなことは気にする必要が無く、ただパッケージをダウンロードして、インストールするだけで良くなりました。
実行環境が同梱できるかどうかはケースバイケースになりますが、ストレージやネットワークがリッチになった今では、こういった方針は、開発側、ユーザの双方にとってメリットになりますね。
メインの操作を vagrant up に集約
Vagrant で、一番行う操作は vagrant up
でしょう。
このコマンドを実行するだけで、仮想マシンの構築から、プロビジョニングの実行を自動で行ってくれます。その裏では、Vagrantfile に書かれた情報を読み取って、仮想環境を作り、ベース仮想イメージを取得し、仮想マシンを起動。OS ブートが完了したら、プロビジョニングを実行して、仮想サーバの設定を行っています。
ユーザは、こういった一連の流れを意識することなく、複雑なところは Vagrant が連携するソフトウェアと協調して、良しなにやってくれます。これは非常に分かりやすい方法です。
Vagrantfile を利用するだけの人は、このコマンド(と halt / destroy などの基本的なコマンド)だけを覚えるだけで、Vagrant の恩恵を十二分に受けることができます。
また、Vagrantfile を書く側の人にとっても、操作方法がはっきりしているので、それに合わせて Vagrantfile やプロビジョニング設定の記述することになります。vagrant up
するだけで全ての環境構築が完了するように設定を書いていくわけです。記述した Vagrantfile を管理する方法も、プロジェクトのソースコードと同じリポジトリに含めて、git clone して、vagrant up するという流れができるように行います。
こうして、主となる操作がはっきりしているので、使う側はそれだけ覚えれば良く、設定する側もそれに合わせて構築すれば良くなります。
vagrant up
を打ち出して、これだけで環境構築ができます!と謳ったのは、Vagrant の本質を伝えるにはとても有効な手法だったと思います。
プラガブルなソフトウェアとエコシステムの利用
先に書いたとおり、Vagrant は多様な技術を組み合わせて使うツールなので、別システムとの連携が必須です。
Vagrant では、そういった外部ツールとの連携処理をプラグインで実装しています。利点は、もし新しい技術が登場した場合、Vagrant 本体は触らなくても、プラグインを追加すれば、利用が可能となるということです。プラグインは、gem パッケージにて配布できるようになっているので、有志によるプラグインが作られています。
gem パッケージで配布されているからといって、ユーザは gem を意識する必要はありません。プラグインのインストールには vagrant plugin
というコマンドが用意されており、これを使うことで、プラグインのインストールやアップデート、アンインストールが可能です。
実際、仮想化環境、プロビジョニングツールは、プラグインとなっているので、Vagrant 本体に同梱されているもの以外にも、AWS や Digital Ocean 、Fabric など多くプラグインが公開されています。中には Vagrant 自体のパッケージに同梱されていくパターンもあります。
ソフトウェア自体はプラガブルにして、機能拡張が容易に行えるようにしています。プラグインの配布には、Ruby のエコシステムを利用して、誰もが開発したプラグインを配布できるようにしています。そして、ユーザにはそういった構成を知る必要は無く、単にいつものコマンドを使うだけで良いわけです。
さいごに
同じように既存の技術を組み合わせて、パッケージングしていると感じるのが、Docker です。これも lxc や aufs など、以前からある技術を利用していますが、それらを組み合わせて、コンテナベースの仮想マシンという形を作り上げています。エコシステムに関しては、まだ荒削りな面がありますが、これも次第に成熟が進んでいくと期待しています。
Vagrant が多くの人に受け入れられているということは、ある意味レゴブロック型プログラミングでも上手くやれば、多くの人に使ってもらえるようなものが作れるということを示唆しているように思います。個人的にはこの点でも Vagrnat や Docker は気になるソフトウェアで、今後何かを作っていく時のヒントにしていきたいですね。
- コメント (Close): 0
- トラックバック (Close): 0
ざっくり分かる Vagrant 1.4 / Docker Provisioner
- 2013-12-10 (火)
- Advent Calendar 2013 | Docker | Vagrant
Shin x blog Advent Calendar 2013 の 10 日目です。
Vagrant 1.4 がリリースされました。Docker Provisioner を中心に新機能をざっくりと見てみました。
ダウンロードページの変更
さあ、1.4 をダウンロードしよう、と今までのダウンロードページに行くと 1.4 のリンクがありません><
新しいダウンロードページからダウンロードしましょう。
Docker Provisioner
Docker 対応として Docker Provisioner が追加されました。
このプロビジョナを使うと Docker 自体のインストールが自動で行われ(!)、その後、docker pull や docker run を実行することができます。
下記の Vagrantfile では Docker Provisioner を使って、docker run を実行する例です。
他のプロビジョナ( chef や puppet 等)と一緒に使うことも可能なようです。
precise64 Box ファイルで vagrant up してみました。Docker インストールやコンテナ実行が行われていますね。
$ vagrant up (snip) [default] Running provisioner: docker... [default] Installing Docker (latest) onto machine... [default] Starting Docker containers... [default] -- Container: ubuntu $
vagrant ssh して、VM の中に入りました。Docker は最新の 0.7.1 が入っています。
vagrant@precise64:~$ docker info Client version: 0.7.1 Go version (client): go1.2 Git commit (client): 88df052 Server version: 0.7.1 Git commit (server): 88df052 Go version (server): go1.2 Last stable version: 0.7.1 Go version (client): go1.2
docker info を見ると aufs が Driver となっています。
vagrant@precise64:~$ docker info Containers: 1 Images: 3 Driver: aufs Root Dir: /var/lib/docker/aufs Dirs: 5
docker ps -a で確認すると、Vagrantfile に書いた bash コマンドが実行されていました。
vagrant@precise64:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 54ead2bad23d ubuntu:12.04 bash -l About a minute ago Exit 0 condescending_albattani
Docker – Provisioning – Vagrant Documentation
CentOS の Box ファイル
CentOS 6.5 の Box ファイルでも試してみました。上記の Vagrantfile から box ファイルを変更しただけです。
$ vagrant up (snip) [default] Running provisioner: docker... [default] Installing Docker (latest) onto machine... Vagrant attempted to execute the capability 'docker_install' on the detect guest OS 'redhat', but the guest doesn't support that capability. This capability is required for your configuration of Vagrant. Please either reconfigure Vagrant to avoid this capability or fix the issue by creating the capability. $
あ、エラーになりました。redhat 系のゲスト OS はサポートしていないようです。。。Docker 自体は、CentOS で動くようになっているので、今後に期待ですね。
private network を設定しているとエラー
private network を設定しているとエラーが発生する場合があるようです。
“Configuring and enabling network interfaces” fails with ssh error Issue #2614 mitchellh/vagrant
他の新機能
Machine-Readable Output
システムが読み込みやすい形式で、vagrant コマンドの実行結果?を出力します。changelog を見ると –machine-readable フラグを使うようなのです。
試しに vagrant up –machine-readable を実行したのですが、何も出力されませんでした。
Machine Readable Output – Command-Line Interface – Vagrant Documentation
Enforcing a Vagrant Version
Vagrant.require_version オプションを Vagrantfile に記述することで、実行する vagrant のバージョンを指定できます。バージョンが合わないために予期せぬ挙動になることを防止します。
Synced Folder Plugins
synced_folder の実装をプラグインで行うことができるようになりました。nfs がプラグインとして提供されています。
すでに、rsync, scp, NFS(ホストがゲストをマウントするパターン))のプラグイン実装が存在するようです。
Box downloading will resume if interrupted
Box ファイルのダウンロードが中断しても、次回再開できるようになりました。
Box checksums
追加した BOX ファイルのチェックサムを検証します。
NFS on VirtualBox no longer requires a static IP
VirtualBox 上の NFS では、static IP が必要なくなりました。
Running multiple “vagrant up” commands in parallel with VirtualBox
VirtualBox での vagrant up を並行して実行できるようになりました。CI 環境などでは有効ですね。( Docker で良いかもしれませんが。)
Multiple SSH keys
複数の SSH Key を指定することが可能になりました。また、プロビジョニングで、安全ではない Vagrant のキーをより安全なキーに置き換えることもできます。
さいごに
synced_folder のプラグイン化や、Box ファイルダウンロードの resume 機能など色々な改良が施されたバージョンですが、今回の目玉は、Docker Provisioner ですね。
これまでもプロビジョニングで Docker インストールや docker コマンドの実行は可能でしたが、Docker Provisioner の登場により、さらに手軽に Docker を利用できます。
Docker を利用するベースとして Vagrant を使うというシーンが増えていきそうです。
- コメント (Close): 0
- トラックバック (Close): 0
WordPress を Docker で動かす( OSX / Vagrant )
- 2013-12-09 (月)
- Advent Calendar 2013 | Docker | Vagrant
Shin x blog Advent Calendar 2013 の 9 日目です。
Docker で PHP アプリケーションを動かしてみようということで、WordPress でやってみます。
WordPress 用 Docker コンテナを作る
Docker は現状 Linux 上でしか動かないので、OSX 上では直接動きません。Vagrant で Linux(CentOS)の仮想マシンを作り、その上で Docker を動かします。
さっそく Linux 環境から WordPress が動く Docker コンテナまで、一気に構築できる Vagrantfile を作りました。これを使うだけで環境構築は終わりです。
まず、GitHub から git clone します。
$ git clone https://github.com/shin1x1/vagrant-docker-wpdev $ cd vagrant-docker-wpdev $ ls wordpress/ Vagrantfile
vagrant up で、仮想マシンを起動します。自動で、Docker のインストール、Docker イメージを生成、コンテナの起動と一連の流れが実行されます。
$ vagrant up (snip) Step 29 : ENTRYPOINT ["/usr/bin/supervisord"] ---> Running in 43bd85e2cde6 ---> f846d6a8f9fb Successfully built f846d6a8f9fb 751f8c8e48519ca624a9167b46b3cbd406b7aeb4ded70b0356992ff3dadc50f0 $
vagrant up コマンドが完了したら、OSX のブラウザから http://192.168.33.11/ にアクセスしましょう。
WordPress の初期画面が表示されれば ok です。
ではウィザードを進んで設定を行いましょう。データベースの設定には、データベース名=「test」、データベースユーザ名=「root」、データベースパスワード=「docker」に設定して下さい。
これで Docker で動く WordPress ができました。やったね!
WordPress の編集
WordPress のソースコードは、OSX の wordpress/ ディレクトリにあります。
このディレクトリは Docker コンテナから参照しているので、OSX 上で編集、ブラウザで確認という流れで作業を進めることができます。
docker-wpdev
この Vagrantfile では、WordPress の Docker コンテナとして、docker-wpdev を利用しています。
WordPress の Docker コンテナはいくつか公開されているのですが、docker-wpdev はソースコードのディレクトリをホスト側からマウントする機構になっており、開発環境などでソースコードを頻繁に書き換える用途に向いていますね。
さいごに
Docker は面白い OSS なのですが、Linux 上でしか動かないため、OSX では Vagrant などで Linux 環境を用意する必要があります。
ここでは CentOS を Linux 環境として使いましたが、Docker を動かすだけなら、より軽量な CoreOS や boot2docker を使う方が良いかもしれません。(ダウンロードも速いですし)
Docker が OSX 上で動くようになるといいなあ。
- コメント (Close): 0
- トラックバック (Close): 0
CentOS 6.5 に Docker をインストールしてみた
- 2013-12-07 (土)
- Advent Calendar 2013 | Docker | Vagrant | Web+DB
Shin x blog Advent Calendar 2013 の 7 日目です。
いよいよ CentOS 6.5 から Docker がサポートされたということで、実際にインストールしてみました。
Vagrant で CentOS 6.5 環境
Vagrant で CentOS 6.5 環境を作ります。( CentOS 6.5 環境がある場合は不要です。)
CentOS 6.5 の Box ファイルには、Opscode が提供している Bento プロジェクトのものを利用しました。
$ vagrant init opscode-centos65 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box $ vagrant up $ vagrant ssh
Docker インストール
では、CentOS に Docker をインストールします。
Docker は、EPEL リポジトリで配布されているので、追加しておきます。あとは yum で、docker-io パッケージを入れるだけです。docker の起動設定なども行っていきます。
[vagrant@localhost ~]$ rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm [vagrant@localhost ~]$ yum -y install docker-io [vagrant@localhost ~]$ chkconfig docker on [vagrant@localhost ~]$ service docker start
Docker で Hello World
ではさっそく Docker を試してみましょう。Docker 公式の centos イメージを使って、コンテナ内で echo を実行してみます。
[vagrant@localhost ~]$ sudo docker run centos /bin/echo "Hello World" Hello World
centos イメージのバージョンを見てみました。まだ 6.4 のようです。
[vagrant@localhost ~]$ sudo docker run centos /bin/echo /etc/redhat-release CentOS release 6.4 (Final)
/bin/bash を実行すれば、コンテナ内でシェルが起動できます。
[vagrant@localhost ~]$ sudo docker run -i -t centos /bin/bash bash-4.1#
Vagrantfile
CentOS 6.5 で Docker をインストールする Vagrantfile を書いています。ご参考まで。
さいごに
ついに CentOS で Docker が来ましたね。これで Docker 探索が捗ります:D
ちなみに AWS でも試そうとしたのですが、Amazon Linux ではインストールはできたもの動作が不安定でした(たまたまかもですが)。CentOS は公式も AMI はまだ 6.4 のままだったので、まだ試していません。
あ、公式サイトでも RHEL/CentOS のインストール手順が掲載されましたね。(昨晩は無かった。。。)
Requirements and Installation on Red Hat Enterprise Linux / CentOS – Docker Documentation
参考
Docker Documentation – Docker Documentation
Docker: Linuxコンテナを使ってアプリケーションの配置を支援する
仮想環境構築に docker を使う – apatheia.info
- コメント (Close): 0
- トラックバック (Close): 0
PHP開発環境のサンプルVagrantfile
PHPカンファレンス2013でPHP開発環境をVagrantで作る発表を行ったのですが、具体的なVagrantfileが欲しいという声を頂いたので、GitHubに公開しました。
ご自身で構築するベースになれば良いと思うので、どう作れば良いの?と言う方は参考にしてみて下さい。
なお、このリポジトリの Vagrantfile は、開発PC内の VirtualBox 上で開発環境として動かすことを想定しています。セキュリティについては考慮されていないのでご注意下さい。
vagrant-lapp-sample
https://github.com/shin1x1/vagrant-lapp-sample
このリポジトリは、PHPアプリケーション(CakePHP)をイメージしています。構成は以下です。
- CentOS 6.4
- Apache 2.2
- PHP 5.4
- PostgreSQL 9.3
- phpPgAdmin
ディレクトリ構成としては、app/ がアプリケーションのコードを置くディレクトリで、vagrant/ に Vagrant のファイルを置くイメージです。
app/ には、サンプルとして CakePHP アプリケーションを置いています。(cake bake project したもの)
使い方
git clone でプロジェクトのコードを取得して、あとは vagrant ディレクトリ で、vagrant up を実行するだけです。
$ git clone https://github.com/shin1x1/vagrant-lapp-sample $ cd vagrant-lapp-sample/vagrant $ vagrant up
アプリケーションへのアクセス
ブラウザから http://192.168.33.30/
にアクセスすると、PHPアプリケーションを実行することができます。
phpPgAdminへのアクセス
ブラウザから http://192.168.33.30/phpPgAdmin/
にアクセスすると、phpPgAdmin を利用できます。ユーザは vagrant、パスワードは pass です。(厳密にはパスワードは何でも ok です)
ポイント
synced_folder
このリポジトリのルートディレクトリ( app/ があるディレクトリ)を synced_folder に設定しており、仮想マシンからは /share でアクセスすることができます。
つまり、ホストPCで app/webroot/index.php というファイル編集すると、仮想マシンでは /share/app/webroot/index.php のファイルが自動で更新されます。
ドキュメントルート
Apache のドキュメントルートは、/share/app/webroot に設定しています。
これは vagrant/httpd.conf で設定しており、プロビジョニング実行時に /etc/httpd/conf/httpd.conf に上書きされます。変更が必要であれば、vagrant/httpd.conf を編集して、vagrant provision でプロビジョニングを再実行すると良いでしょう。
なお php.ini も同様に vagrant/php.ini を用意しています。
設定ファイルの準備
Apache や PHP などの設定ファイルを準備する際は、下記手順で行っています。
仮想マシン内での /vagrant ディレクトリが、ホストPCでは Vagrantfile があるディレクトリと synced_folder になっているのがポイントです。
- まずが vagrant up で仮想マシンを起動
- vagrant ssh でログインして、yum で対象パッケージをインストール
- 設定ファイルを変更、動作確認
- cp -a /etc/http/conf/http.conf /vagrant/
- ホスト PC の variant/ に httpd.conf がコピーされる
- プロビジョニングで、/vagrant/httpd.conf を /etc/httpd/conf/ にコピーするコードを書いておく
データベース
この Vagrantfile では、データベースの構築は行っていますが、アプリケーションで必要なテーブル定義などは行っていません。
このあたりはプロジェクトによって方法が異なると思いますが、フレームワークやライブラリ等でマイグレーション機能があればそちらを、無ければ dmp ファイルを適用するコマンドをプロビジョニングで記述することになります。
( PostgreSQL であれば、 psql -Uvagrant app < pgsql.dmp など。)
シェルプロビジョニング
プロビジョニングには、シェルを使っています。
普段、サーバにSSHログインして yum や apt-get などでインストールしているコマンドをそのまま Vagrantfile に記述していくだけなので、簡単に書けるのが利点です。
Chef や Puppet、Ansible などのプロビジョニングツールを利用しても良いのですが、以前にこういったツールを使ったことが無いのであれば、まずはシェルで構築してみて、次の段階として好みのプロビジョニングツールを試してみるがおすすめです。(もちろん、一気にプロビジョニングツールを使いたい方はその方法でも問題ありません。)
Composer
composer.json が存在すれば、composer.phar をダウンロードして、composer install を実行するようにしています。
このリポジトリでは、CakePHP と PHPUnit を Composer でインストールしています。
- コメント (Close): 0
- トラックバック (Close): 0
Vagrantで作るPHP開発環境[実践編]をPHPカンファレンス2013で発表してきた
2013/09/15に開催されたPHPカンファレンス2013でVagrantに関する発表をしてきました。
発表資料はこちらです。
(2013/10/09追記)
PHP開発環境を構築するサンプル Vagrantfile をアップしました。
PHP開発環境のサンプルVagrantfile
第7回関西PHP勉強会で発表した下記の内容をベースに、より実践的な内容を追加しました。
PHPシステムの開発環境をVagrantで作ることを題材に、基本的な流れをお話しました。
ポイントは、プロビジョニングにシェルを使う部分と、やはり synced_folder ですね。AWS上にも同じ環境を構築できる部分ももう少し深くお話したかったのですが、時間が足りませんでした><
また、Vagrantfile があるディレクトリ(vagrant upしたカレントディレクトリ)も synced_folder となっていて、仮想マシンでは /vagrant としてアクセスできるということも知っておくと便利です。これを利用するとChefのtemplateリソースのように設定ファイルをあらかじめ用意しておいて、所定の場所にコピーするなどが簡単にできます。
発表後には何人かの方にフィードバックを頂いて、Vagrant + Chef-solo を一気にやって躓いたという方やPHPでプロビジョニングをやることもできるという点に気付いた方もいて、シェルスクリプトをプロビジョニングに使う方法もあるよということが伝わって良かったです。
なかには、PHPを使っていないけど、Vagrantの話を聞きにきました!という方もいて、個人的にはとても嬉しかったです。
ちなみにスライドにある「Vagrantが見せる夢」は、今年のPHPカンファレンスのテーマが「PHPの夢を語ろう。」となっているからです:D Vagrantを使うとより多くの人が簡単にPHP開発環境を手にすることができる、というのは実際に思うところです。
今回は 2F 小展示ホールで発表したのですが、ここは以前のPHPカンファレンスではメイン会場として使われていた場所で、落ち着いて発表することができました。会場の雰囲気も良く、あっという間に発表時間が過ぎました。参加頂いたみなさんありがとうございました!
発表でも触れましたが、Vagrant はじめの一歩として執筆したVagrant入門ガイドは下記です。こちらも合わせて、よろしくおねがいしますm(_ _)m
PHPエンジニア養成読本
9/13に発売された「PHPエンジニア養成読本」をイベント会場内のジュンク堂さんにて販売して頂きました。おかげさまで持ち込まれていた在庫は全て完売ということになりました。ご購入いただいた、みなさんありがとうございましたm(_ _)m
途中、サイン会なども開かれていて、購入して頂いた方と少しお話することができ、楽しかったです。
LT 司会
カンファレンスの最後といえば LT 大会!今回も WordCamp Tokyo とPHPカンファレンスとで合同の LT 大会だったのですが、PHPカンファレンス側の司会として登壇しました。スタッフでも無いのに申し訳ない気もしたのですが、後で聞くと皆さんオーバーワークだったようで(5トラックもあったので。。。)、少しでも負担減に協力できたのなら良かったです。
ただ、もしかするとスタッフの中でやってみたい方もいたかもしれないので、次回は手を挙げると良いと思います。
カンファレンスセッション
今回は特に色々とやることが多かったので、他の方のセッションはほとんど参加できませんでした。。。PHP言語系やRubyからPHPへの話、あとインフラ系の話は面白そうだと思っていたのですが、自身のやることと、あと久しぶりに会う人と話すのが楽しく、気がつくと終わっていました。TLを見ると、かなり面白そうな内容だったようなので、あとでUstやスライドを見てみます。
今年は 5 トラックということで、運営は大変だったと思うのですが、スピーカーとして参加した私はとても快適に過ごすことができました。運営スタッフのみなさん、本当にありがとうございました。
- コメント (Close): 0
- トラックバック (Close): 0
Vagrantをはじめてみたい方へ「Vagrant入門ガイド」を書きました
「Vagrant入門ガイド」という電子書籍を技術評論社さんから出版しました。Kindle ストア と Gihyo Digital Publishing にて購入できます。
Vagrantは、まだエンジニアが中心に触っている状況ですが、いずれはWebデザイナーやコーダーの方など、サーバ構築を自分ではやらない人にも、制作するWebサイト、システムの動作検証を行う環境として利用する場面が増えていくと思います。
blog エントリなども多数あるのですが、断片的な情報も多く、また、Vagrant自身の進化が早いため、最新の環境だと上手くインストールできなかったり、動かないということがままあります。(このblogの過去エントリも。。。)
もちろん、じっくりと調べていけば解決できる問題なのですが、できれば、はじめの一歩くらいは、まとまった情報が日本語であると良いなと思い、本書を書きました。
目次
本書は、Vagrantはじめの一歩ということで、vagrant
コマンドの使い方が中心となっています。順に進んでいけば、自分のPCにVargrantとVirtualBoxをインストールして、仮想マシンを起動する流れが出来上がります。
本書の内容をベースに、自らVagrant上で仮想サーバを構築していくならVagrantfileやプロビジョニングを習得していくと良いでしょう。また、誰か作ったVargrantfile(Githubに公開されているものやチームのエンジニアが作ったものなど)を使うだけなら、これでVargrantを活用することができます。
基本は入門者向けの内容ですが、すでにVargrantを使っている人向けということで、vagrant
コマンドの各サブコマンドの引数や実行例を付録に収録しています。(正直これを書くためにはじめて知ったオプションもあり、個人的にも勉強になりました:D)
Vagrantの使い方は人それぞれだと思うのですが、特にWeb制作の現場では、エンジニアで無い人にも広く使ってもらえる可能性のあるソフトウェアだと思います。本書がVagrantを触るきっかけになれば嬉しいです。
なおVagrantの対象バージョンですが、今週リリースされたばかりの Vagrant 1.3.1 に対応しています。(さすが電子書籍!)
1.Vagrantとは プロバイダ(Provider) プロビジョニング(Provision) Boxファイル Vagrantfile vagrantコマンド まとめ 2.環境設定 VirtualBoxのインストール Vagrantのインストール 3.設定ファイルの準備 Boxes(Boxファイル)のインストール Boxファイルの追加 Boxファイルの確認 Boxファイルの削除 Vagrantfileの作成 Vagrantfileの生成 4.仮想マシンの起動と操作 仮想マシンを起動 仮想マシンへSSHログイン 仮想マシンの状態を確認 仮想マシンを停止 仮想マシンを削除 5.仮想マシンでWebサーバを構築 6.プラグインで拡張 saharaプラグインをインストール saharaプラグインを使う まとめ 7.応用(複数の仮想マシン) 複数の仮想マシンを起動 仮想マシンのエクスポート Appendix:vagrant サブコマンド box destroy halt init plugin plugin uninstall provision reload resume ssh ssh-config status suspend up
PHPカンファレンス2013でVagrantについてお話します
今週末(2013/09/14)に東京で開催されるPHPカンファレンス2013で、Vargrantに関するセッションを行ないます。このセッションは本書の内容を超えて、PHPの開発現場でVargrantを活用するお話をしたいと思っています。
ちなみに「PHPエンジニア養成読本」も明日発売だったりするので、本書と合わせてよろしくお願いしますm(_ _)m
- コメント (Close): 0
- トラックバック (Close): 0
Vagrant + VirtualBox で nfs を使って、synced_folder を速くする
Vagrant + VirtualBox で便利な synced_folder を nfs を使ってパフォーマンスを向上する方法です。
開発環境として Vagrant + VirtualBox を使う上で欠かせないのが synced_folder です。ホストとゲスト間でディレクトリを共有できるので、ホストで書いたコードをゲストですぐに実行することができます。
synced_folder はVirtualBox が持つ shared folders という機能をつかているのですが、代わりに nfs を使うことで、パフォーマンスを向上させることができます。
nfsd をホスト側で起動
synced_folder に nfs を利用するには、ホスト側で nfsd を起動する必要があります。
OS X(Lion / Mountain Lion)では標準で nfsd がインストールされているのでこれを利用します。nfsd コマンドで enable にすると、nfsd を起動して、さらに再起動時も自動で nfsd が起動するようになります。
なお nfsd を起動するには /etc/exports が必要になります。存在しない場合は、作成しておきます(内容は空で良いです)。
$ sudo touch /etc/exports $ ls /etc/exports /etc/exports
nsfd enable コマンドで nfsd を起動します。
$ sudo nfsd enable $ sudo nfsd status nfsd service i enabled nfsd is running (pid xxxxx, 8 threads)
nfsd disable コマンドを実行すると、nfsd が停止して、再起動後も起動しなくなります。
$ sudo nfsd disable $ sudo nfsd status nfsd service is disabled nfsd is not running
Vagrantfile で nfs を指定
Vagrantfile で synced_folder を NFS で利用する設定を行ないます。
ポイントは2つです。まず host-only ネットワークで IP アドレスを指定します。そして、synced_folder に :nfs => true を設定します。
vagrant up すると、synced_folder で指定したディレクトリをゲストが NFS マウントします。
$ vagrant up Bringing machine 'default' up with 'virtualbox' provider... (snip) [default] Exporting NFS shared folders... Preparing to edit /etc/exports. Administrator privileges will be required... The nfsd service does not appear to be running. Starting the nfsd service (use 'enable' to permanently enable) [default] Mounting NFS shared folders...
ゲストにログインすると NFS マウントしていることが分かります。
$ vagrant ssh [vagrant@localhost ~]$ df -h Filesystem Size Used Avail Use% マウント位置 /dev/mapper/VolGroup-lv_root 8.4G 1.1G 7.0G 14% / tmpfs 230M 0 230M 0% /dev/shm /dev/sda1 485M 32M 429M 7% /boot /vagrant 931G 359G 572G 39% /vagrant 192.168.33.1:/path/to/directory <---- NFS でマウントした synced_folder 931G 359G 572G 39% /share
ホストの /etc/exports には下記のように対象のディレクトリが自動で追記されています。
$ cat /etc/exports # VAGRANT-BEGIN: 0f0224b9-b61c-47ff-b769-49d1e3103b28 "/path/to/directory" 192.168.33.30 -mapall=501:20 # VAGRANT-END: 0f0224b9-b61c-47ff-b769-49d1e3103b28
なお、もし IP が指定されていないと、vagrant up 時に下記のようなエラーが表示されます。
$ vagrant up Bringing machine 'default' up with 'virtualbox' provider... (snip) NFS requires a host-only network with a static IP to be created. Please add a host-only network with a static IP to the machine for NFS to work.
パフォーマンス
NFS を使った場合、実際の開発でどれほど恩恵があるかを判断するために簡単な Web アプリケーションを siege で計測してみました。
対象アプリケーションはCakePHPのコントローラで「Hello」という文字列を出力するのみで、DBへの接続は行なっていません。それぞれの方式でマウントしたディレクトリをdocument_rootに指定しています。
ホストから「siege -c 10 -t 60s -b http://URL/」で5回計測を行ない、その平均値を算出しました。
計測結果は下記になります。NFS の方が 3.5倍多くのリクエストをさばいており、パフォーマンスが向上していることが分かります。
方式 | 計測値 | Rate |
---|---|---|
share folders(synced_folderデフォルト) | 11.366 trans/sec | 1 |
NFS | 40.066 trans/sec | 3.52 |
参考までに、Vagrant サイトでは実際の Rails プロジェクトのテストを使った結果が掲載されています。NFS が 22s に対して、Shared folders は 5m14s となっており、大きく速度が異なっています。
VirtualBox Shared Folders: 5m 14s
Host File System: 10s
Native VM File System: 13s
NFS Shared Folders: 22s
NFS Shared Folders (warm cache): 14s
http://docs-v1.vagrantup.com/v1/docs/nfs.html
まとめ
NFS を使うことで簡単に synced_folder のパフォーマンスを上げることができます。synced_folder のパフォーマンスに不満がある場合は NFS を一度試してみて下さい。
ただ、ホスト側で nfsd を動かす必要があるので、Windows など nfsd が標準でインストールされていない環境では気軽に使えないのが難点ですね。
参考
- コメント (Close): 0
- トラックバック (Close): 0
Vagrant を使うなら、VirtualBox 4.2.16 以降で
VirtualBox 4.2.14 + Vagrant 1.2.2 の組み合わせで、正常に動作しなかった問題が、VirtualBox 4.2.16 で解決されたようです。
VirtualBox 4.2.14 + Vagrant 1.2.2 の組み合わせで、一部の環境にて vagrant up ができないという現象がありました。
$ vagrant up Bringing machine 'default' up with 'virtualbox' provider... [default] Importing base box 'precise32'... There was an error while executing `VBoxManage`, a CLI used by Vagrant for controlling VirtualBox. The command and stderr is shown below. Command: ["import", "/Users/hans/.vagrant.d/boxes/precise32/virtualbox/box.ovf"] Stderr: 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100% Interpreting /Users/hans/.vagrant.d/boxes/precise32/virtualbox/box.ovf... OK. 0%... Progress object failure: NS_ERROR_CALL_FAILED
Vagrant の github サイトでもこの問題に関する issue が上がっていましたが、いずれも VirtualBox 4.2.16 で解決したようです。
- Clean install on OS X 10.8.4 w/ latest VirtualBox not working · Issue #1847 · mitchellh/vagrant:
- VirtualBox 4.2.14 Breaks Vagrant 1.2.2 When Importing Boxes · Issue #1850 · mitchellh/vagrant
手元の環境をVirtualBox 4.2.8 から 4.2.16 にアップグレードしたところ、Vagrant 1.2.2 との組み合わせで正常に動作しました。(sahara プラグインもちゃんと動きました:D)
- Mac OS X 10.7.5
- Vagrant 1.2.2
- VirtualBox 4.2.16
$ vagrant -v Vagrant version 1.2.2 $ VirtualBox -h Oracle VM VirtualBox Manager 4.2.16 (C) 2005-2013 Oracle Corporation All rights reserved. (snip) $ vagrant init precise32 http://files.vagrantup.com/precise32.box 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 Bringing machine 'default' up with 'virtualbox' provider... [default] Box 'precise32' was not found. Fetching box from specified URL for the provider 'virtualbox'. Note that if the URL does not have a box for this provider, you should interrupt Vagrant now and add the box yourself. Otherwise Vagrant will attempt to download the full box prior to discovering this error. Downloading or copying the box... Extracting box...te: 1905k/s, Estimated time remaining: --:--:--) Successfully added box 'precise32' with provider 'virtualbox'! [default] Importing base box 'precise32'... [default] Matching MAC address for NAT networking... [default] Setting the name of the VM... [default] Clearing any previously set forwarded ports... [default] Fixed port collision for 22 => 2222. Now on port 2201. [default] Creating shared folders metadata... [default] Clearing any previously set network interfaces... [default] Preparing network interfaces based on configuration... [default] Forwarding ports... [default] -- 22 => 2201 (adapter 1) [default] Booting VM... [default] Waiting for VM to boot. This can take a few minutes. [default] VM booted and ready for use! [default] Configuring and enabling network interfaces... [default] Mounting shared folders... [default] -- /vagrant $ vagrant ssh Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686) * Documentation: https://help.ubuntu.com/ Welcome to your Vagrant-built virtual machine. Last login: Fri Sep 14 06:22:31 2012 from 10.0.2.2 vagrant@precise32:~$
- コメント (Close): 0
- トラックバック (Close): 0
ホーム > Vagrant
- 検索
- フィード
- メタ情報