DockerでLaravelの開発環境を爆速で構築する

弊社では人材紹介会社様と人材派遣会社様向けのシステムの開発をしており、今年初めごろに派遣会社スタッフ様向けの新サービスであるWorkinGoodを始めました。

www.workingood.com

主に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コンテナ立ち上げ

bashスクリプトを用意して一発で立ち上げます。

# 用意した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で簡単に環境を構築できることが分かったと思います。