DockerでLaravel開発環境を整える
このブログ初投稿となります、MatchinGoodでエンジニアアルバイトをしている妹尾です。
弊社では人材紹介会社様と人材派遣会社様向けのシステムの開発をしており、今年初めごろに派遣会社スタッフ様向けの新サービスであるWorkinGoodを始めました。
主にPHPを使用して開発していますが、新しいサービスに関してはAWSやDocker、Reactなどトレンドとなっているものに追随して技術を選択しています。
そこで今回は弊社の開発環境構築にDockerを採用した話をしたいと思います。
なぜDockerを導入したか
弊社ではプロダクションへのデプロイでもDockerを使用していますが、先ほどもお話ししたように弊社では複数のプロジェクトがあり、それぞれが異なるPHPのバージョンで動いています。このため毎回環境構築しようと思うと複数バージョンのPHPを入れる必要がありとても手間となってしまいます。そこでDockerを使うことで気軽に環境を構築できるようにしました。
Dockerに関しては様々な記事が出ているのでここでは説明しませんが、今ではDocker ToolboxやDocker for Mac、Docker for Windowsのおかげで手軽に導入することができます。
どうやっているのか
実際に弊社で開発中の新サービスでは開発時に
- ElasticSearch
- MySQL
- Laravel
の組み合わせが必要になります。ElasticSearchについては開発時にDIでモックできる設計になっているので必要ではないですがMySQLには必ず必要になります。LaravelはPHPのフレームワークで実際のアプリケーションとなります。
Dockerfileの書き方
まずは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"]
これが弊社開発環境用のDockrfileです。alpine linuxという軽量なイメージをベースにしたPHP7のコンテナを使用しています。最後にPHP付属の開発用サーバーを起動しています。
MySQLは特にカスタマイズしないので公式のものをそのまま使います。次にElasticSearchのDockerfileです
FROM elasticsearch:2.3.5
RUN plugin install analysis-kuromoji \
&& plugin install analysis-icu
COPY config /usr/share/elasticsearch/config
EXPOSE 9200 9300
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["elasticsearch"]
日本語全文検索するために必要なプラグインを入れるために公式のイメージをそもまま使わず、Dockerfile内でインストールしています。
Dockerコンテナ立ち上げ
bashスクリプトを用意して一発で立ち上げます。
# 用意したDockerfileのビルド
docker build -t matchingood/elasticsearch:dev ./elasticsearch
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 --name elasticsearch -d matchingood/elasticsearch:dev
docker run -p 8000:8000 \
--link mysql:mysql \
--link elasticsearch:elasticsearch \
--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
# applicationとリンクしているElasticSearchのホストを取得
eshost=$(docker exec application env | grep ELASTICSEARCH_PORT_9200_TCP_ADDR | cut -d '=' -f 2-2)
# Laravel設定ファイル内のElasticSearchのホストを設定
sed -i -e "s/ES_HOST=127.0.0.1/ES_HOST=${eshost}/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
これで弊社の新サービスの開発環境を整えることができました!
Docker Compose
LaravelのコンテナにMySQLとElasticSearchのコンテナをリンクさせるときにlinkオプションで指定しています。ですが、Docker Composeと言うものを使うことで綺麗にこのあたりのオーケストレーションを行うことができます。ただ今回はそこまで複雑な構成ではないのでbashスクリプトで書いています。
まとめ
実際の例を見て、Dockerで簡単に環境を構築できることが分かったと思います。そして弊社では仲間を募集しています!プログラミング初心者から実力者までやりがいを感じることができる職場です!