業務でLaravelを使うことになったのですが、M1のMacBookでLaravel HomesteadのVirtualBox + Vagrant環境は動かないことがわかったので、Laradockを使ってみました。 その際に調べた内容を共有します。
Laradockについて
Laradockとは、PHP開発向けに構築されているDocker環境です。 多種多様なサービス構成に適応するため、各種Dockerコンテーを立ち上げることができます。
- nginx
- mysql
- phpmyadmin
- PostgreSQL
- ...etc
ビュッフェスタイルの環境構築
実際に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さんの記事が、とても参考になりました。 コードの一部を引用して掲載しますが、元記事を参照されることをオススメいたします。
// 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を使ったサービスにおいて需要がある周辺コンテナー(サービス構成)を把握するには役立ちそうなので、触れてみて良かったです。