DockerでLaravelの開発環境を爆速で構築する
弊社では人材紹介会社様と人材派遣会社様向けのシステムの開発をしており、今年初めごろに派遣会社スタッフ様向けの新サービスであるWorkinGoodを始めました。
主にPHPを使用して開発していますが、新しいサービスに関してはAWSやDocker、Reactなどトレンドとなっているものに追随して技術を選択しています。
そこで今回は弊社の開発環境構築にDockerを採用した話をしたいと思います。
なぜDockerを導入したか
弊社ではプロダクションへのデプロイでもDockerを使用していますが、先ほどもお話ししたように弊社では複数のプロジェクトがあり、それぞれが異なるPHPのバージョンで動いています。このため毎回環境構築しようと思うと複数バージョンのPHPを入れる必要がありとても手間となってしまいます。
そこでDockerを使うことで気軽に環境を構築できるようにしました。
Dockerに関しては様々な記事が出ているのでここでは説明しませんが、今ではDocker ToolboxやDocker for Mac、Docker for Windowsのおかげで手軽に導入することができます。
どうやっているのか
ここではLaravelとMySQLの標準的な環境を想定します。
まずはLaravelのコンテナを作る必要があります。
FROM php:7.0.8-alpine RUN apk --no-cache add curl nodejs python make g++ &&\ npm install -g gulp &&\ curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer &&\ docker-php-ext-install pdo_mysql curl WORKDIR /var/www/localhost/htdocs EXPOSE 8000 CMD ["php", "-S", "0.0.0.0:8000", "-t", "/var/www/localhost/htdocs/public"]
alpine linuxという軽量なイメージをベースにしたPHP7のコンテナを使用しています。
最後にPHP付属の開発用サーバーを起動して終わりです。
MySQLは特にカスタマイズしないので公式のものをそのまま使います。
Dockerコンテナ立ち上げ
# 用意したDockerfileのビルド docker build -t matchingood/application:dev . # 現在のパスを取得 path=$(cd $(dirname $0) && pwd) # MySQLの公式イメージ docker pull mysql # 各イメージを動かす docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d mysql docker run -p 8000:8000 \ --link mysql:mysql \ --name application \ -v ${path}:/var/www/localhost/htdocs \ -t -d matchingood/application:dev # Laravelの設定ファイル cp .env.example .env # applicationとリンクしているMySQLのホストを取得 dbhost=$(docker exec application env | grep MYSQL_PORT_3306_TCP_ADDR | cut -d '=' -f 2-2) # Laravel設定ファイルのMySQLの情報をコンテナ内から見えるホストに置換 sed -i -e "s/DB_HOST=127.0.0.1/DB_HOST=${dbhost}/g" .env # MySQLコンテナにアプリケーション用のデータベースを作成 docker exec mysql mysql -u root --password=mysql -e "create database application;" # Laravelを動かすために必要なものたち docker exec application composer install docker exec application php artisan key:generate docker exec application php artisan migrate docker exec application php artisan db:seed
これでもうLaravelの開発環境を整えることができました!
Docker Compose
LaravelのコンテナにMySQLとElasticSearchのコンテナをリンクさせるときにlinkオプションで指定しています。ですが、Docker Composeと言うものを使うことで綺麗にこのあたりのオーケストレーションを行うことができます。ただ今回はそこまで複雑な構成ではないのでbashスクリプトで書いています。
まとめ
実際の例を見て、Dockerで簡単に環境を構築できることが分かったと思います。