ブロックチェーン・AI・システム開発の株式会社INDETAIL

Vagrant+Dockerで作る開発環境(FuelPHP+MySQL編)

2015.11.05
tacck

去年に引き続き、1カ月半ほど東京出張中のtacckです。
弊社での新たな取り組みの一つである、ゲーム事業の開発ヘルプでちょこっとだけお手伝い中です。

さて、今回の業務では利用していないのですが、弊社ではサーバサイドのフレームワークとしてFuelPHPを使うことがあります。
しかし、毎度新規に環境を作ったり、それをメンバーや別のプロジェクトの人のローカルへ作ったり、バージョンアップ時に再度環境を作り直したり、、、ということがよく発生しています。
(FuelPHPに限らずですが。)
これは、非常に効率の悪いことです。

というわけで、今回はFuelPHPの開発環境のベースをVagrantとDockerで、さらにそれぞれの公式で配布されているイメージをベースに作ってしまおうと思います。
こうすることで、プロジェクトをまたぐ「基本環境」とできること、基になるイメージを変えることでバージョン違いの環境を容易に構築することが、できるようになります。

環境

要素 Version
Mac OSX 10.11.1 (El Capitan)
Vagrant 1.7.4
VirtualBox 5.0.8
CentOS (on Vagrant) 7.1 (https://atlas.hashicorp.com/centos/boxes/7)
Docker (on CentOS)
PHP (on Docker) 5.6 (https://hub.docker.com/_/php/)
MySQL (on Docker) 5.7 (https://hub.docker.com/_/mysql/)

実際の開発はMac上で行ない、編集した結果をDocker内のPHPコンテナ経由で表示する、という環境を想定しています。
ここでは、Mac上のVagrantとVirtualBoxはインストール済みの想定です。

手順

今回使用するファイルは、すべて下記URLにあります。
https://github.com/tacck/vagrantfiles/tree/master/fuelphp-sample
先に、下記コマンド実行しておいて、内容をcloneしておくとスムーズに作業できます。

FuelPHPのダウンロードと展開

まずは、フレームワークであるFuelPHPをダウンロードし展開します。

展開できたら、今回のサンプルコードをフレームワーク内へコピーします。
対象は、
https://github.com/tacck/vagrantfiles/tree/master/fuelphp-sample/sample/
配下のファイルです。

内容は、MySQLの"sample"テーブル内のレコード一覧を取得し、画面に(var_dumpで)表示させるだけです。

ここのポイントは、DBの設定ファイルであるsample/fuelphp/fuel/app/config/development/db.phpです。

host=mysqlというところが、MySQLサーバの指定です。後ほど、DockerのMySQLコンテナをmysqlとしてPHPコンテナへ接続しますが、この名前がそのままサーバ名として利用が可能です。
この機能のおかげで、コンテナ間の接続も柔軟に行うことができるわけですね。

Vagrant(VirtualBox)にCentOSとDocker環境を構築

今回は、「環境」のCentOSに記載しているURLのイメージを使います。

Vagrantfileは下記となります。

6行目のconfig.vm.synced_folderですが、Vagrant内から、Vagrantを起動したディレクトリをマウントするものです。
基本的には指定無しで行なわれるのですが、今回の私の確認の中では実行されなかったため、明示的に記載しています。
("centos/7"の標準設定で、rsyncを行なうようになっているようです。)

FuelPHPは、フレームワーク内にログを書き込みます。(標準の設定の場合)
ただ、今回はDockerのコンテナからCentOSがマウントしたMacのディレクトリへの書き込み、、という状態となり、私の方ではうまく書き込めるようにできませんでした。
そのため、9行目・10行目でログ出力のディレクトリを作成し、Dockerの設定でこちらへログ書き込みを行なうようにしています。

11-13行目は、見てわかる通り、Dockerのインストールとサービスの起動・登録です。

14行目は、MySQLのDockerコンテナ作成と起動を行なうスクリプトの実行、
15行目は、PHPのDockerコンテナ作成と起動を行なうスクリプトの実行、となります。
(内容については、後述します。)

今回利用しているVagrantのイメージ"centos/7"ですが、VirtualBox Guest Additionsが未インストールのようです。
そのため、事前にVagrantへプラグインを入れておくことで、上記のディレクトリマウントを行なえるようにします。

Vagrantイメージのダウンロード、Dockerインストールによるパッケージのダウンロード、Docker作成のためのイメージダウンロード、などにより、起動には時間がかかります。
コーヒーなどを飲みながら、ゆったりと待ってください。
実行完了したら、下記URLを開くと結果を確認できます。
http://localhost:8000/sample

2015110301

Dockerコンテナ起動(MySQL)

MySQLのコンテナは、データコンテナとMySQLの実体コンテナ、の2つに分けて利用します。
(データと実体を分けることで、データのポータビリティを上げるDockerの構築パターンです。)

(1) MySQLの初期投入SQLファイルを配置したイメージを作成

mysql-5.7/Dockerfileを基に、MySQLの実体コンテナ用イメージを作成します。

mysql-5.7/Dockerfile

この中のADDで指定しているファイルは、下記となります。

mysql-5.7/sample_ddl.sql

見てわかるとおり、すごく単純なテーブルを作成し、初期データを投入するSQLファイルです。
これを、/docker-entrypoint-initdb.dというディレクトリの下に配置すると、コンテナの初回起動時にSQLを実行してくれます。
上記のSQLの中身が、先ほどブラウザで表示されていたものとなっていることがわかると思います。

(2) データコンテナの作成

データコンテナは、下記のスクリプトで作成します。ここで、コンテナ名をfuelphp-mysql-dataとつけています。

mysql-5.7/run-data.sh

(3) (1)のイメージからMySQLの実体コンテナを作成し起動

(1)で作成したイメージから、MySQLの実体コンテナを作成し、起動します。
作成するコンテナ名は、fuelphp-mysqlです。
--volumes-fromの指定で、(2)で作成したデータコンテナを利用するようになります。
また、-eオプションで環境変数を設定できます。MYSQL_DATABASEは起動時に作成するデータベース名、MYSQL_ROOT_PASSWORDは起動時に設定するrootのパスワード、となります。

mysql-5.7/run.sh

Dockerコンテナ起動(PHP)

PHPコンテナは、HTTPサーバとしてApacheが起動されるようになっています。
そのため、FuelPHPを利用できるように、Apacheの設定ファイルコピー、PHP Extensionの追加を行なったイメージの作成を行ない、そのイメージからコンテナを起動します。

(1) FuelPHP用のイメージを作成

php-5.6/Dockerfileを基に、FuelPHP利用のためのイメージを作成します。

php-5.6/Dockerfile

ADDしているファイルのうち、FuelPHP向けの設定として修正・追加したものは下記となります。

php-5.6/apache2.conf

(2) (1)のイメージからPHPコンテナを作成し起動

(1)で作成したイメージから、PHPコンテナを作成し、起動します。
作成するコンテナ名は、fuelphp-appです。
--linkで先に作ったfuelphp-mysqlコンテナを、mysqlという名前で利用できるようにしています。
先に書いたFuelPHPのDB設定で利用していますね。
-vは、Dockerを起動しているCentOS側のファイルシステムを、PHPコンテナへマウントする指定となります。
一つ目は、先のapache2.confにある通りDocumentRootをFuelPHPに切り替えるためのもの、二つ目はFuelPHPの書き出すログを別の場所にするためのもの、となります。
-pは、ポート番号のつなぎ変えです。今回はVagrant側の設定とあわせて、8000番でアクセスできるように設定しています。

php-5.6/run.sh

まとめ

以上、かいつまんだ所もありますが、Vagrant+Dockerによって、ポータビリティを意識した開発環境を構築しました。
ファイルの共有部分でOSごとの差異がでるかもしれませんが、VagrantとVirtualBoxが動くのであれば、Macだけでなく、WindowsやLinuxでもまったく同じ条件でFuelPHP+MySQLを動かすことができるようになります。
さらに、簡単に再構築もできるので、MySQLの初期投入SQLを調整しながら試験環境を複数作る、、、といった応用もできます。

環境構築を行うと、いわゆる「秘伝のタレ」と呼ばれる、引き継いだ人が環境を再現できない問題が発生しがちです。
このように、設定ファイルやシェルスクリプトで「どのような環境をどういう手順で構築するか」明示することで、少しでもそういった問題も抑えられるのではないでしょうか。

関連タグ:

tacck Takuya KIHARA

エンジニア (モバイルアプリ、フロントエンド、バックエンド、インフラ) 得意なことは、領域をまたいで考え、開発すること。 ブログでは、主にAnsible、Docker、Raspberry Piのことを書いています。 好きなフィギュアスケートの技は、スプレッド・イーグルです。

「いいね」ボタンを押すと、最新情報をすぐに確認できます。