Laravel環境構築(最低限のみ)

今日はタイトルにある通り、Laravelの環境構築について書いてみたいと思います。

普段の業務でもLaravelを使用していますが、新しくプロダクトを作るとかでもない限り開発環境を一から作ることってなかなか無いと思います。

実際入社した際にもDockerによってそこまで詰まることなく環境構築できました。

なので、改めて自分でやってみようということで書いていきたいと思います。

今回のゴール

  • LaravelとMySQLによるローカル環境を構築する

Docker

今回はDockerを使って構築していきます。

Dockerはコンテナ型の仮想化技術であり、ホストOS上で動作しているDocker Engineの上にコンテナと呼ばれるアプリケーションの実行環境を構築するものです。

同じ環境を速やかに構築・共有できるという点でチームでの開発においては今や不可欠な技術の一つではないかと思います。

Docker とは開発者やシステム管理者が、コンテナでアプリケーションを 構築(build)、実行(run)、共有(share)するためのプラットフォームです。アプリケーションをデプロイするために、コンテナを利用する事をコンテナ化( containerization )と呼びます。コンテナは新しくありませんが、コンテナを使えばアプリケーションのデプロイがより簡単になります。
引用元:Docker ドキュメント日本語化プロジェクト | Dockerの概念

今回はDocker HubにあるPHP公式のDockerイメージを使用します。

PHP公式だけでもいくつか種類がありますが、その中でもPHPApacheが一緒になったイメージを使ってDockerfileを書いていきます。

FROM php:8.0-apache

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
RUN apt-get update && apt-get install -y \
  git zip unzip \
  && docker-php-ext-install pdo_mysql

ENV APACHE_DOCUMENT_ROOT /var/www/html/public

RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

1行ずつ解説していきます。

FROM php:8.0-apache

PHP8.0とApacheが一緒になったイメージを指定しています。
バージョンは各自お好みで指定してください。

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

マルチステージビルドを使ってcomposerをインストールしています。
マルチステージビルドとは1つのDockerfileの中で複数のビルドを行うことができるというものです。ビルドされたステージから他のステージにコピーすることができ、不要な部分はそのまま破棄されます。 そうすることで最終的なファイルサイズを小さくすることができます。 ここでは--from=composer:latestでイメージを指定しています。そしてcomposerイメージの/usr/bin/composerの中身をビルドされたPHP-Apache/usr/bin/composerにコピーしている、ということです。

RUN apt-get update && apt-get install -y \
  git zip unzip \
  && docker-php-ext-install pdo_mysql

必要なパッケージをインストールしています。
apt-get updateでパッケージリストの更新を行い、apt-get installでインストールを実行しています。-yはすべてYesと回答するオプションです。
docker-php-ext-installPHP拡張機能を入れるためにPHP公式が提供しているコマンドです。

ENV APACHE_DOCUMENT_ROOT /var/www/html/public

RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

デフォルトではApacheのDocumentRootは/var/www/htmlになっています。それをvar/www/html/publicに変更する為の処理になります。
こちらもPHP公式がDocker Hubに書いています。

docker-compose.yml

続いてdocker-compose.ymlを書いていきます。

version: "3.9"
services:
  app:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
    volumes:
      - ./src/:/var/www/html/
    ports:
      - 8080:80

  db:
    image: mysql:5.7
    ports:
      - 3306:3306
    volumes:
      -  db_data:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=mysql
      - MYSQL_USER=user
      - MYSQL_PASSWORD=password
      - MYSQL_ROOT_PASSWORD=root
volumes:
  db_data:

先程作成したDockerfileをappbuild.dockerfileに指定しています。

また、ホストの8080番ポートとコンテナの80番ポートを紐付けています。こうすることでブラウザでlocalhost:8080にアクセスしたときにコンテナの80番ポートに繋がるように設定できます。

volumesでホストの/srcディレクトリとコンテナの/var/www/htmlディレクトリをリンクさせています。

また、dbについてはDockerfileではなくMySQL5.7の公式イメージを使用しています。db.environmentで初期ユーザーの設定をしている他、volumesで指定したボリュームをdb.volumesでコンテナと紐付けています。こうすることでdocker compose downでコンテナを破棄しても再度立ち上げた時にデータを永続化することができます。

ここまでできたら、

docker-compose build --no-cache
docker compose up -d

でコンテナを起動します。

Laravelのインストール

あとはLaravelをインストールするだけです。

docker compose exec app composer create-project --prefer-dist laravel/laravel .

appコンテナの中でLaravelをインストールします。

しばらく待つとインストールが完了するのでlocalhost:8080にアクセスしてみると、

f:id:fcosk:20220412232345p:plain

無事にLaravelの初期画面が表示されました。

まとめ

以上、Laravelの環境構築についてまとめてみました。

ただ、タイトルにあるように本当に必要最低限なので実際にはもっと設定が必要になると思います。

パッケージや拡張機能も入れるでしょうし、NginxをWebサーバーとして立てる構成もあります。

この記事ではとりあえず最低限の環境構築というところを目指したので、上記のような追加の構成については追々記事にできればと思います。