RitoLabo

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

  • 公開:
  • カテゴリ: PHP Laravel
  • タグ: Laravel,Docker,DockerCompose

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

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

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

アジェンダ
  1. 検証環境
  2. 構築する構成
  3. Laravelインストール
  4. Dockerfile
    1. APP
    2. DB
  5. Docker Compose
  6. コンテナ起動

検証環境

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

  • 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をインストールしたり、コンテナを立ち上げたあとにビルトインサーバーを起動させたりと、若干の作業が発生していましたが、 これらの作業も全て自動化したツールをGithubにアップしてあります。
Laravel Docker Starter
こちらでは、今回扱わなかったマイグレーションやシーディングも実行されるようにしてあります。その他、詳細はREADMEを確認してください。