2021年6月17日

入社して初めてのプロジェクトで docker-compose.yml を使い、Laravel の開発環境を構築してみた (1 / 3)

awanoHBSS

2020年10月より入社しました Awano です。

HBSS に入社して半年以上が経ちましたが、私が初めて本格的な業務に携わったのが施設予約システムの開発でした。
その際に用いた開発環境が Docker であり Laravel であったのですが、今までポートフォリオ作成において Docker を使用してはいたものの、Laravel は初めて着手するフレームワークであった為、試行錯誤の日々でありました。

そこで、業務で学んだ docker-compose による Laravel プロジェクトの環境構築を複数回に分けて解説していきたいと思います。

まず、Docker による環境構築のディレクトリ・ファイル構造は下記となります。

docker-compose.yml を含めて計4ファイルから成りますが、まずは PHP の設定について説明していきます。

Docker-compose.yml の書き方( PHP )


version: "3"

services:
    php_docker:
        container_name: php_example   // コンテナ名(PHPのコンテナである事が分かる名前に)
        build: ./docker/php
        volumes:
        -   ./application:/var/www/html
        ports:
        -   "3001:3001"   // 3000番はデフォルトで使用している事がある為、3000番以外の任意の番号で

docker-compose.yml 内の PHP に関する項目を見てみます。


build: ./docker/php

build のアドレスについてですが、 docker-compose.yml があるディレクトリの位置を基準として、ビルドの際の Dockerfile の読み込み先を指定しています。これにより、php ディレクトリ内にある Dockerfile にて PHP のイメージの作成と設定を行います。


volumes:
-   ./application:/var/www/html

./application が、ローカル側での PHP フレームワーク等を導入するディレクトリとなります。こちらはビルドの際に自動的に生成されるので、あらかじめ application ディレクトリを作成しておく必要はありません。
そして、サーバー側におけるフレームワーク等の導入箇所が /var/www/html ディレクトリです。volumes を指定する事で、ローカルとサーバー共通でファイルを取り扱う事が可能となります。

PHP サーバーの設定とアプリのインストール

では Docker イメージを作成する Dockerfile を見てみましょう。


FROM php:7.4-fpm

COPY php.ini /usr/local/etc/php/

ENV TZ Asia/Tokyo
RUN echo "${TZ}" > /etc/timezone \
    && dpkg-reconfigure -f noninteractive tzdata

RUN apt-get update \
    && apt-get install -y vim unzip git wget \
    libzip-dev libpq-dev libonig-dev mariadb-client \
    libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
    && docker-php-ext-install zip pdo_mysql pdo_mysql mysqli mbstring gd iconv

RUN : 'Install Node.js' \
    && curl -sL https://deb.nodesource.com/setup_12.x | bash - \
    && : 'Install PHP Extensions' \
    && apt-get install -y nodejs

#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

WORKDIR /var/www/html

当記事では PHP 7.4 を使用します。なお、PHP 7.3 等、バージョンが異なる場合は RUN による各種コンポーネントのインストールの書き方も多少変わりますので、このままでの流用は出来ない事を知っておいて下さい。続いて、コードの詳細です。


COPY php.ini /usr/local/etc/php/

ここでは、Dockerfile と同ディレクトリ内にある php.ini ファイルの内容を、仮想サーバー側内の指定の URL にコピーする処理をしています。


RUN apt-get update \
    && apt-get install -y vim unzip git wget \
    libzip-dev libpq-dev libonig-dev mariadb-client \
    libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
    && docker-php-ext-install zip pdo_mysql pdo_mysql mysqli mbstring gd iconv

Laravel での開発に当たって必要なアプリ + α を、RUN によって Dockerfile から直接、仮想サーバーのターミナルでアプリのインストールをする指示を出しています。

仮想サーバーの OS は Ubuntu ですので、最初に update を行った後、apt-get install にて vim や unzip 等の必要なアプリをインストールします。ちなみに apt-get install の場合は -y を入れておかないとインストールの自動化が出来ないので必ず入力して下さい。


RUN : 'Install Node.js' \
    && curl -sL https://deb.nodesource.com/setup_12.x | bash - \
    && : 'Install PHP Extensions' \
    && apt-get install -y nodejs

Laravel で必要となる Node.js や PHP Extensions のインストールを別途行っています。


#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

Laravel を導入する為の composer のインストールと設定を行っています。前半部分は composer の Web サイトで記載されているコマンドをそのまま仮想サーバー内で実施するだけです。

しかしこのままでは 仮想サーバー内にて composer コマンドが使用出来ませんので、ENV 以下にて権限の設定やコマンドが使用出来る様にする為の URL の指定を行います。


WORKDIR /var/www/html

最後に、仮想サーバー内での作業ディレクトリを設定します。この URL は docker-compose.yml 内の、


volumes:
-   ./application:/var/www/html

volumes で指定した右側の URL ( /var/www/html ) と同じにして下さい。以上で Dockerfile の設定は完了です。

PHP の設定( php.ini )

お次は php.ini です。


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

PHP でのタイムゾーンやエンコード、言語を php.ini で設定します。この内容がそのまま仮想サーバー側の /usr/local/etc/php/php.ini に反映されます。

…まずは docker-compose.yml にて PHP の設定をする為の説明をしました。次回は nginx 設定関連の説明をしていきたいと思います。