Dockerで開発環境を構築する

今まで、vagrant+ansibleを利用していて、これはこれで満足していたけど、流行りもあって、Dockerを試してみた。

環境

MAC+boot2docker+dockerである。
それぞれのバージョンは、
docker 1.4.1
boot2docker 1.4.1
である。

行いたいこと

プログラムはMAC側でエディターを利用して書きたい。コンテナー側はプログラムの実行環境と必要なミドルウェアを一つにまとめる。
MACのホスト側とコンテナー側はボリュームを共有し、ホスト側での変更はリアルタイムにコンテナー側に反映される。

コンテナー側で動作するミドルウェア

以下のミドルウェアを動作させる。

  • apache
  • mysql
  • sshd
  • phpmyadmin

ベースイメージの作成

開発環境は、複数のプロジェクトで利用する。そのため、上記環境のベースになるイメージを作成する。
Dockerfile等は以下の通り。

ここまでファイルが揃った時点で、Dockerのコンテナーをビルドする。

各プロジェクトのDockerfile

各プロジェクトのrootディレクトリーにも以下のようなファイルを作成し、プロジェクト毎にコンテナーをビルドする。
各プロジェクトの依存環境は、このDockerfileに集約する形になる。

ここまでファイルが揃った時点で、Dockerのコンテナーをビルドする。

コンテナーの起動

まず、ttyを利用した起動方法。これは、コンテナーを作成している時に便利である。コンテナーから抜けた段階で自動的に消滅する。
コンテナーが安定するまでは、こちらで作成と廃棄を繰り返すことになる。

–rm コンテナー終了時に自動的に破棄する。
-it 標準入力(-i)とtty(-t)を利用可能にする。/bin/bashを利用するのに必要。-itとまとめて設定している。
-p ポートフォワードの設定
-v 共有ボリュームの設定。[host]:[container]:[permission]で指定する。

コンテナーをデーモンとして実行する

ハマったところ

まず、Dockerはコンテナー毎にフォアグランドでサービスが起動するため、通常の方法では、デーモンを実行した場合には、すぐにコンテナー自体が終了してしまう。最初はこれが不可解な動作であり、Dockerfileの途中で例えば、service httpd onとかした場合にも
コンテナーを起動した祭にhttpdは起動していないのである。httpdをDockerで起動するためには、フォアグランドで実行する必要があり、httpd -D FOREGROUND等とする必要がある。しかし、これでは、他のサービスが起動できなくなる。そこで、supervisorを利用してこの問題を解決した。

感想

とりあえず、触って見た状態のため、まだまだ勉強する必要がある。もし、開発環境の構築等でより良い方法があれば、
コメントを頂ければ幸いである。

不要なコンテナーを一括で消す方法

例えば、コンテナーを作成している途中で名前をつけない場合に、コンテナーはとなります。コンテナー作成中には、途中でこのコンテナーが増えるため、一括削除できるととても便利です。以下のコマンドで一括削除ができます。

Vagrantで共有ディレクトリーの静的ファイルが更新されない

Vagrantを利用して、共有ディレクトリーのファイルを更新しても、Apache側に反映されない問題が起きた。
以下の設定をApacheの設定ファイルのDirectoryセクションに書くことで更新が反映するようになったのでメモ。

fuelphpでフォームのrequiredを出力しない方法

fuelphpでtinymceを利用した際にchromeでan invalid form control with name is not focusableなエラーが表示されて、フォームのsubmitが機能しなくなった。調べたところ、textareaにつくrequired属性がダメな感じ。

まあ、各フォームにnovalidateを付けてもいいんだけど、面倒なので、fuelphpのcoreのfieldを拡張することで対応させた。
問題の箇所は、Fieldset_Fieldクラスのadd_ruleメソッド内でrequiredを付与していた。この部分を書き換え、以下のようなクラスを作成した。

このままだと、利用されないので、bootstrap.phpで読み込むようにした。
以下の表をAutoloader::register();の後あたりに追加。

これで、requiredが挿入されなくなり、tinymceが正常に動作した。

iPhoneアプリのsubmit時のエラー

アプリをsubmitしようとしたら、こんなエラーが表示された。

This bundle is invalid. Apps that include an armv7s architecture are required to include armv7 architecture.

調べたところ、iPhoneを接続した状態でビルドするとダメなようだ。
確かに、iPhoneは接続されていたので、外したら大丈夫だった。

http://stackoverflow.com/questions/19211654/ios-application-loader-shows-bundle-error

ansibleが便利です

今までは良くvagrant+chefを利用して開発環境等の構築をおこなっていましたが、ansibleなるものを知人に教わり、試してみた所、これが最高に便利なので、紹介します。

まず、なにがchefより便利なのかというと、chefの場合は、cookbook単位でレシピを作成することになり、これはこれで再利用可能なのと、様々な機種で対応できるため、なかなか慣れないと把握に難しい点がありました。ansibleの場合には、playbook.ymlというファイルにサーバーの構築手順をそのまま書くことでそのとおりのサーバーが作成されます。個人的には、これがとてもわかり易く直感的に扱えるため、便利だと思いました。ただ、例えば、redhat系とdebian系を分ける場合には、その判断もこのファイル内に書く必要があるため、注意が必要です。

Apache2+PHP+NTP+MySQL+PHPMyAdmin+Composerを自動的にインストールするplaybookは例えば、以下の感じになります。

このファイルをvagrantから実行することで、自動的にサーバーが構築されます。

公式サイト http://www.ansible.com/home

laravel4でカスタムバリデーション

ちょっとした仕事でLaravel4でカスタムバリデーションを作成する機会があった。以下、備忘録。

まず、start/global.phpにresolverを追加する。

ここでは、Extensions以下のクラスをapp/extensions以下に配置したいので、composer.jsonのautoloadに設定を追加する。

ここで、artisanでdump-autoloadを実行する。

作成するカスタムバリデータークラスはCustomValidatorとし、Extensions\Validate名前空間を利用することにする。
app/extensions/Validate以下にCustomValidator.phpを作成する。

ポイントは、メソッド名の先頭はかならずvalidateとすること。
あとは、通常のバリデーションルールと同様に利用できる。

yumのアップデートでエラー!!

久々の更新です。借りているサーバーを久々にメンテナンスしようとしてyumってみた所、いきなりエラー発生!

なんか、python関連でエラー??
とりあえず、

としてみるも、エラーは変化しない。しょうがないので、rpmのリビルドDBとクリーンアップを行なってみる。

これで、エラーはなんとか解決!後は、そのままアップデートを行った。一瞬焦った!

phpmyadminのログイン切れの防止策

デフォルトで1440秒でセッションが切れてしまい、開発中に何度もログインするのはとても煩わしい。
以下の修正をphpmyadminのconfig.inc.phpにすることで、この煩わしさから開放される。