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

公開
注意最終更新から 7 年以上経過しています。最新の情報もあわせてご確認ください。

Laravel を使って Web アプリケーション開発をする際に、開発環境をどうするかというのはわりと最初に考えるところでもあります。

既にオンプレミスやクラウド上に構築された開発サーバを使うか..自身の PC に仮想環境を構築...VirtualBox? Vagrant? Docker?選択肢は多岐に渡ります。

今回は、Laravel の開発環境を Docker で構築していきます。

検証環境

今回の検証環境については、以下の通りです。

  • 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 へアクセスします。

Laravel 初期画面

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 をインストールしたり、コンテナを立ち上げたあとにビルトインサーバーを起動させたりと、若干の作業が発生していましたが、これらの作業も全て自動化する事も出来ます。その場合はマイグレーションやシーディングも実行されるようにしておくとよいでしょう。

Ritolabo