Laravelの開発環境をDockerで構築する
- 公開日
- 更新日
- カテゴリ:Laravel
- タグ:Laravel,Docker,DockerCompose

Laravel を使って Web アプリケーション開発をする際に、開発環境をどうするかというのはわりと最初に考えるところでもあります。
既にオンプレミスやクラウド上に構築された開発サーバを使うか..自身の PC に仮想環境を構築...VirtualBox? Vagrant? Docker?選択肢は多岐に渡ります。
今回は、Laravel の開発環境を Docker で構築していきます。
Contents
検証環境
今回の検証環境については、以下の通りです。
- macOS Mojave
- docker for Mac
今回は、Mac 環境で、docker for Mac と composer がインストールされている前提で進めていきます。
構築する構成
Laravel を動作させるためには、WEB サーバとデータベースが必要です。なので今回はアプリケーション用と DB 用2つの Docker イメージを作成します。さらにそれをまとめて管理できるように、Docker Compose を使用します。
ちなみに今回のデモでは、以下の構成で構築します。
- CentOS 7(最新版)
- Apache 2.4
- PHP 7.2
- MySQL 8.0(最新版)
- Laravel 5.7(最新版)
いくつかファイルを作成するので、今回のディレクトリ構成は以下で開始します。
./
├── docker
│ ├── app
│ └── db
└── laravel
docker ディレクトリに設定ファイル等を設置します。 laravel ディレクトリには Laravel をインストールします。
Laravel インストール
まずは Laravel をインストールしておきます。プロジェクトルートで composer を使って Laravel をインストールします。
composer create-project laravel/laravel --prefer-dist laravel
laravel ディレクトリ配下へインストールされます。
Dockerfile
app/DB それぞれのイメージを作成するために Dockerfile を作成します。
APP
アプリケーション側のイメージを定義します。 docker/app 配下に Dockerfile を作成して以下を定義します。
- docker/app/Dockerfile
-
FROM centos:latest RUN yum -y update && yum -y install httpd RUN yum -y install epel-release \ && rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm \ && yum -y install --enablerepo=remi,remi-php72 php \ php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit \ php-pecl-xdebug php-gd php-intl php-symfony php-pdo php-xml php-tokenizer php-pear php-zip ENTRYPOINT ["/usr/sbin/httpd", "-DFOREGROUND"]
上から解説します。
FROM centos:latest
ベースイメージとして CentOS の最新版を指定しています。
RUN yum -y update && yum -y install httpd
Apache をインストールします。
RUN yum -y install epel-release \
&& rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm \
&& yum -y install --enablerepo=remi,remi-php72 php \
php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit \
php-pecl-xdebug php-gd php-intl php-symfony php-pdo php-xml php-tokenizer php-pear php-zip
PHP とエクステンションをインストールします。 PHP7.2 と、Laravel の動作に必要な PHP 拡張を指定しています。
ENTRYPOINT ["/usr/sbin/httpd", "-DFOREGROUND"]
コンテナ起動時に Apache を起動します。
DB
次に、データベース側のイメージを定義します。 docker/db 配下に Dockerfile を作成して以下を定義します。
- docker/db/Dockerfile
-
FROM mysql:latest COPY ./conf.d /etc/mysql/conf.d
ベースイメージに MySQL の最新版を指定しています。そして、設定ファイルをコピーして MySQL の設定を行います。
docker/db 配下に conf.d ディレクトリを作成し、設定ファイルを定義します。
- docker/db/conf.d/my.cnf
-
[mysqld] # Character code setting / collation order setting character_set_server=utf8mb4 collation-server=utf8mb4_bin collation_server = utf8mb4_ja_0900_as_cs # Default Authentication Plugin default_authentication_plugin=mysql_native_password # Japan time default-time-zone='+9:00' [mysql] default-character-set=utf8mb4
文字コードの設定などを行なっていますが、自身の好きな設定にしていただければ良いです。
Docker Compose
Dockerfile を作成が完了したので、次にそれらを Docker Compose で管理します。
docker/ 配下に docker-compose.yml を作成して以下を定義します。
version: '3'
services:
db:
container_name: laravel_db_sample
build: ./db/
image: laravel_db_sample
environment:
MYSQL_ROOT_PASSWORD: Password@1234
MYSQL_DATABASE: laravel_db
ports:
- 3306:3306
app:
container_name: laravel_app_sample
build: ./app/
image: laravel_app_sample
ports:
- 80:8000
links:
- db
volumes:
- ../laravel:/var/www/html/laravel
stdin_open: true
tty: true
depends_on:
- db
今回は PHP のビルトインウェブサーバーを利用するので、アプリケーション側のポートを 80 番から 8000 番にマッピングするようにしています。
Laravel をインストールした laravel ディレクトリをボリュームとしてマウントしています。
コンテナ起動
全ての設定が完了したので、コンテナを起動させます。
docker ディレクトリへ移動し、以下の docker-compose コマンドを叩きます。
docker-compose up -d --build
Docker イメージが作成され、コンテナが起動します。
初回はイメージを作成するため若干時間がかかりますが、一度作成されてしまえば次回からは高速でコンテナが起動します。
docker-compose up -d // 2 回目からはこっちで OK
コンテナが立ち上がったら、Laravel のストレージとログディレクトリのパーミッションを変更します。以下の docker コマンドを叩きます。
docker exec -it laravel_app_sample chown -R apache:apache /var/www/html/laravel/storage /var/www/html/laravel/bootstrap/cache
最後にビルトインサーバーを起動します。以下の docker コマンドを叩きます。
docker exec -it laravel_app_sample php /var/www/html/laravel/artisan serve --host 0.0.0.0
ビルトインサーバーが立ち上がったら、ブラウザから http://localhost へアクセスします。
Docker コンテナが起動し、正常に動作している事を確認できました。もちろん Laravel ソースはコンテナを落としても消えないので、ここから開発を進めていけます。
ちなみに、コンテナをストップさせる時は以下の docker-compose コマンドを叩きます。
# コンテナのストップ
docker-compose down
# イメージも削除する
docker-compose down --rmi all
最終的なディレクトリ構成は以下になります。
.
├── docker
│ ├── app
│ │ └── Dockerfile
│ ├── db
│ │ ├── Dockerfile
│ │ └── conf.d
│ │ └── my.cnf
│ └── docker-compose.yml
└── laravel
└── # Laravel ソース一式
まとめ
作業は以上で終了です。 Docker を用いた開発環境構築は既存のイメージを使ったりなど、今回の手順以外にも手段は結構あるので、自分に最も合う方法を探す事をお勧めします。
開発環境の構築に Docker を用いると構築時間を短縮できるので、そもそもの目的である Laravel での Web アプリケーション開発に集中する事ができます。また「infrastructure as code 」によって安定して環境の構築や配布が行え、かつ高速に動作するので、Docker はおすすめです。
ちなみに今回は、コンテナを立ち上げる前に Laravel をインストールしたり、コンテナを立ち上げたあとにビルトインサーバーを起動させたりと、若干の作業が発生していましたが、 これらの作業も全て自動化したツールを Github にアップしてあります。
Laravel Docker Starter
こちらでは、今回扱わなかったマイグレーションやシーディングも実行されるようにしてあります。その他、詳細は README を確認してください。