Laravel+Docker環境

はじめに

Laravel環境をDockerを使って構築してみたので、そのご紹介をします。
環境はweb、app、dbと、メールも使用したかったのでsmtpを用意したいと思います。
今回の環境はこちらになります。急ぎの方はファイルをダウンロードしてご利用ください。

環境構成

# app ver
1 Apache 2.4.38
2 MariaDB 5.5
3 PHP 7.4
4 Laravel 6.20.16
5 MailHog latest

ディレクトリ構成

各ファイルはこれから作成していきますが、
まずはディレクトリを下記のように作成します。

.
├── docker
│ ├── app
│ │ ├── 000-default.conf ・・・ Apacheの設定ファイル、ドキュメントルートを設定する
│ │ ├── Dockerfile
│ │ └── php.ini ・・・ PHPの設定ファイル
│ └── db ・・・ 必要であれば、sqlファイルを配置
├── src ・・・ ここにソースを配置
├── docker-compose.yml
└── Makefile

000-default.conf

では、まずはApacheの設定ファイルを下記のように作成します。
コンテナ内の/var/www/html/webapp/publicをドキュメントルートとする設定をここでは書いています。

<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html/webapp/public
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/html/webapp/public>
           AllowOverride All
       </Directory>
</VirtualHost>

php.ini

次は、PHPの設定ファイルです。
タイムゾーンと文字コード、言語設定を行っています。
必要に応じて、設定を書き加えてください。

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

Dockerfile

次に、Apache+PHP+LaravelのDockerイメージを作成するため、Dockerfileを作成していきます。
ここでは、先ほど作成したApacheとPHPの設定ファイルを読み込みます。
Dockerイメージは、php:7.4-apacheを使用します。

FROM php:7.4-apache

#Composerのインストール
COPY --from=composer /usr/bin/composer /usr/bin/composer

# ミドルウェアのインストール
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libpng-dev \
libpq-dev \
&& docker-php-ext-install pdo_mysql

# 設定ファイルの読み込み
COPY php.ini /usr/local/etc/php/
COPY 000-default.conf /etc/apache2/sites-enabled/

少しだけ説明します。
Laravelを使用するためには、composerと呼ばれるPHPのパッケージ管理システムをインストールする必要があります。
公式の手順はこちらです。この手順に従うと、以下のようにDockerfileに記載することになります。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

その場合、ハッシュ値が変更される度に、Dockerfileも変更する必要があります。
そこで、dockerのマルチステータスビルドの機能を使って、composerのイメージから必要な部分のみをコピーしてきます。
そうすることで、シンプルにでき、イメージサイズも抑えることができます。

COPY --from=composer /usr/bin/composer /usr/bin/composer

docker-compose.yml

あとは、docker-composeを使って、複数のコンテナを作っていきます。
Laravelコンテナは先ほど作成したDockerfileを利用します。
Laravelコンテナ以外は、mariadb、phpmyadmin、mailhogのコンテナを作成します。

version: '3'
services:
# laravel
  app:
    build: ./docker/app
    container_name: web_app
    ports:
       - 8080:80
    volumes:
     - ./src:/var/www/html
# mariadb
  db:
    image: mariadb:5.5
    container_name: web_db
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=webapp
    ports:
      - 3306:3306
    volumes:
      - ./docker/db:/var/lib/mariadb
      - ./docker/db:/docker-entrypoint-initdb.d
# phpMyAdmin
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: web_phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=db
      - PMA_USER=root
      - PMA_PASSWORD=password
    ports:
      - 8081:80
# mailhog
  mailhog:
    container_name: web_smtp
    image: mailhog/mailhog
    ports:
      - 8025:8025
      - 1025:1025

Makefile

ここまで、作ったら、あとはビルドしていくだけですが、
長いコマンドを何度も打つのは大変なので、Makefileを作っておきます。
コマンド名は好みに合わせて変更してください。

projectのコマンドで、Laravelのプロジェクトを作成しています。
バージョンの指定や、プロジェクト名をwebappというものに指定しています。

.PHONY: build up stop down show
NAME=web_app
VERSION=1.0

#imageの作成
build:
    docker-compose build
#起動
up:
    docker-compose up -d
#停止
stop:
    docker-compose stop
#削除
down:
    docker-compose down --volumes
#コンテナ一覧
show:
    docker container ls -a
#イメージの削除
rmi:
    docker image prune
#Laravelプロジェクトの作成
project:
    docker exec $(NAME) composer create-project "laravel/laravel=~6.0" --prefer-dist webapp
#Laravel環境へのログイン
login:
    docker exec -it $(NAME) /bin/bash

ビルド

では、実際、ビルドしていきます。
Makefileを作ったので、簡単にビルドができるはずです。

  1. make buildでイメージを作成します。
  2. make upでコンテナを起動します。
  3. make projectでLaravelプロジェクトを作成します。
  4. http://localhost:8080 に接続するとLaravelのWelcomeページが表示されます。

ここまでできたら、Laravel環境は構築できているので、
あとはsrcディレクトリ内を編集すれば、自分のLaravelアプリができるはずです。

コンテナの停止は、make stopで、
Laravelのコンテナ内にログインする場合は、make loginを使います。

さいごに

dockerを使うことで、簡単にLaravel環境を作ることができましたね。
次回は、Laravelの使い方を紹介したいと思います。