このすみ技術ろぐ

とあるWebエンジニアが、技術や趣味について書くブログです。

LaradockでLaravel開発環境を構築したので、わかったことを共有する

業務でLaravelを使うことになったのですが、M1のMacBookでLaravel HomesteadのVirtualBox + Vagrant環境は動かないことがわかったので、Laradockを使ってみました。 その際に調べた内容を共有します。

Laradockについて

Laradockとは、PHP開発向けに構築されているDocker環境です。 多種多様なサービス構成に適応するため、各種Dockerコンテーを立ち上げることができます。

  • nginx
  • mysql
  • phpmyadmin
  • PostgreSQL
  • ...etc

laradock.io

ビュッフェスタイルの環境構築

実際にLaradockの docker-compose.yml を確認するとわかるのですが、2000行に迫る勢いのコード量です。 正直なところ、ここまで長いdocker-compose.ymlは見たことがなく、初見時は圧倒されました。

https://github.com/laradock/laradock/blob/master/docker-compose.yml

実際には2000行のすべてを使うわけではなく、docker-composeの構成の中から、使いたいコンテナーだけをピックアップして起動します。

$ docker-compose up -d nginx mysql phpmyadmin redis workspace

各ディレクトリ配下に存在するDockerfile

まずはLaradockのリポジトリをcloneします。 実際のファイル構成が気になったのでgrepしてみましたが、各ディレクトリ配下にDockerfileがあると分かります。

$ git clone https://github.com/Laradock/laradock.git
$ cd laradock/
$ find . | grep 'Dockerfile$' | sort
./adminer/Dockerfile
./aerospike/Dockerfile
./apache2/Dockerfile
./aws-eb-cli/Dockerfile
./beanstalkd-console/Dockerfile
./beanstalkd/Dockerfile
./caddy/Dockerfile
./cassandra/Dockerfile
./certbot/Dockerfile
./clickhouse/Dockerfile
./couchdb/Dockerfile
./dejavu/Dockerfile
./docker-registry/Dockerfile
./docker-web-ui/Dockerfile
./elasticsearch/Dockerfile
./gearman/Dockerfile
./gitlab/Dockerfile
./grafana/Dockerfile
./graylog/Dockerfile
./haproxy/Dockerfile
./hhvm/Dockerfile
./ide-codiad/Dockerfile
./ide-icecoder/Dockerfile
./ide-theia/Dockerfile
./ide-webide/Dockerfile
./jenkins/Dockerfile
./jenkins/tests/install-plugins/Dockerfile
./jenkins/tests/install-plugins/update/Dockerfile
./jenkins/tests/plugins/Dockerfile
./jenkins/tests/upgrade-plugins/Dockerfile
./jupyterhub/Dockerfile
./kibana/Dockerfile
./laravel-echo-server/Dockerfile
./laravel-horizon/Dockerfile
./logstash/Dockerfile
./mailcatcher/Dockerfile
./maildev/Dockerfile
./mailhog/Dockerfile
./manticore/Dockerfile
./mariadb/Dockerfile
./memcached/Dockerfile
./mercure/Dockerfile
./minio/Dockerfile
./mongo-webui/Dockerfile
./mongo/Dockerfile
./mosquitto/Dockerfile
./mssql/Dockerfile
./mysql/Dockerfile
./neo4j/Dockerfile
./nginx/Dockerfile
./percona/Dockerfile
./php-fpm/Dockerfile
./php-worker/Dockerfile
./phpmyadmin/Dockerfile
./portainer/Dockerfile
./postgres-postgis/Dockerfile
./postgres/Dockerfile
./rabbitmq/Dockerfile
./react/Dockerfile
./redis-cluster/Dockerfile
./redis-webui/Dockerfile
./redis/Dockerfile
./rethinkdb/Dockerfile
./selenium/Dockerfile
./solr/Dockerfile
./sonarqube/Dockerfile
./sqs/Dockerfile
./swagger-editor/Dockerfile
./swagger-ui/Dockerfile
./thumbor/Dockerfile
./traefik/Dockerfile
./varnish/Dockerfile
./workspace/Dockerfile
./zookeeper/Dockerfile

この中から必要なDockerfileをピックアップして、docker-composeを実行します。 ちなみにファイルの数を数えてみたら、全部で74ファイルありました。

初回構築のスピードは、利用環境の組み合わせに依存する

本記事の執筆時点で74ものDockerfileがあり、Laradockeではこれらを組み合わせて、開発環境を構築します。 そのため開発環境の構築スピードは、実際に組み合わせて起動する環境に依存します。

具体的には、Dockerfileの中で色々やっているものはイメージのビルドが遅くなり、シンプルなDockerfileであれば早いです。 初回はベースイメージのダウンロードが走ることもあり、通信環境次第ですが少なくとも10分以上かかります。 そのため、時間に余裕があるときに行なうことを推奨します。

.envファイルでミドルウェアのバージョンを切り替え、コンテナーを立ち上げる

git cloneが完了したら、次に環境設定ファイルを用意します。 cloneしたファイル郡にenv-exampleファイルがあるため、これをベースとします。

$ git clone https://github.com/Laradock/laradock.git
$ cd laradock
$ cp env-example .env
# ミドルウェアのバージョンを切り替えたり、設定変更を行なう
$ vim .env
# 設定変更を終えたら、Dockerコンテナーを立ち上げる
$ docker-compose up -d nginx mysql workspace

なお、初期状態のenv-exampleでは、自動で最新版(latest)を使うよう設定されているものもあります。 そのため構築したいミドルウェアのバージョンに合わせて、ここで実際にコンテナーで採用するバージョンを切り替えます。

# 設定例
# MYSQL_VERSION=latest
MYSQL_VERSION=5.7
# PHP_VERSION=7.3
PHP_VERSION=7.4
#... etc

実作業はworkspaceコンテナーで行なう

Laravelでは php artisan migrate でDBのマイグレーションを実行したり、各種CLIを実行したいケースもあります。 artisan をはじめとするCLIの作業は、workspaceコンテナーの中で行います。 workspaceという名が示す通り、まさに作業場所です。

ちなみにROXXさんの記事が、とても参考になりました。 コードの一部を引用して掲載しますが、元記事を参照されることをオススメいたします。

www.wantedly.com

// wordspaceコンテナにログイン
$ docker-compose exec --user=laradock workspace bash
 
// ログインすると"/var/www$" というディレクトリに入ります
// workspace上でLaravelアプリケーションファイルを作成します
$ composer create-project laravel/laravel sample --prefer-dist "5.5.*"
  
// "Application key [base64:****] set successfully." となれば完了
// workspaceコンテナからログアウト
$ exit

Laravelプロジェクトの作成完了後は、.envファイル内のAPP_CODE_PATH_HOSTを作成したプロジェクトに向ける必要がある点に注意しておきましょう。

### Paths #################################################

# Point to the path of your applications code on your host
APP_CODE_PATH_HOST=../your-project-name

DBのマイグレーション

これも同じく、ROXXさんの記事が参考になります。 基本的には作業場所であるworkspaceのコンテナーの中で、php artisan migrate すれば完了です。

$ docker-compose exec --user=laradock workspace bash
$ php artisan migrate
# DBのマイグレーションが実行される

なお、ここでDBエラーが発生した場合、まずDBの接続設定を確認しましょう。 DBの接続設定も、ミドルウェアのバージョン指定と同じく.envにあります。

### MYSQL #################################################

MYSQL_VERSION=latest
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d

Laradockを使ってみた感想

さまざまなサービス構成に対応できるdocker-composeの中から、必要なDockerコンテナーをピックアップして、ビュッフェスタイルで組み合わせて起動するのがLaradockです。 このスタイルには一長一短があり、シンプルにLAMP(Linux, Apache, MySQL, PHP)またはLAPP(PostgreSQL)だけが必要な人からすると、全部盛りなのでオーバースペックな印象があります。

一方で、数多くのコンテナーやミドルウェアを組み合わせて構築するサービスや、実験的に試してみたい構成がある場合には便利そうです。 本記事の執筆時点で74ものDockerfileがあるため、今回はじめて知ったミドルウェアも、いくつかありました。

実際にLaradockを使って開発するかどうかは要件次第ですが、PHPを使ったサービスにおいて需要がある周辺コンテナー(サービス構成)を把握するには役立ちそうなので、触れてみて良かったです。

laradock.io