DockerによるLaravel Webアプリケーション開発環境構築

先日いよいよ個人開発を開始しました。
目指すところはAWS+Docker+Vue.js+LaravelのSPA(シングルページアプリケーション)です。
AWSによるインフラ部分の構築はアプリケーションが完成してから取り組むとして、まずはDockerによる開発環境構築を行いました。

ディレクトリの構成

ディレクトリはまずは下記のような構成としました。
不具合・不都合があれば、そのときどきで対応していきたいです。

./
|─ /database # コンテナ内のデータ保存先
|─ /web # アプリケーションコード
|─ .gitignore
|─ docker-compose.prod.yml # 本番環境用差分ファイル
|─ docker-compose.yml
|─ Dockerfile
|─ install-composer.sh
`- README.md

Dockerfile

FROM php:7.4.3-fpm

COPY install-composer.sh /
RUN apt-get update \
&& apt-get install -y wget git unzip libpq-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
&& : 'Install Node.js' \
&& curl -sL https://deb.nodesource.com/setup_12.x | bash - \
&& apt-get install -y nodejs \
&& : 'Install PHP Extensions' \
&& docker-php-ext-install -j$(nproc) pdo_pgsql \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd \
&& : 'Install Composer' \
&& chmod 755 /install-composer.sh \
&& /install-composer.sh \
&& mv composer.phar /usr/local/bin/composer

WORKDIR /var/www/html/hoge

PHPは7.4.3を指定。
これは学習に用いていた教材「Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう」でPHP7.4系を使っていたので、7.4系の環境構築時最新バージョンとしました。

FPM とは「FastCGI Process Manager」の略とのこと。
FastCGI はCGIの問題点として挙げられていた、大量の要求に対してプロセスの生成と破棄の実施をメモリへのキャッシュで対応し、プログラム動作速度の向上・サーバー負荷の軽減が可能となります。

【参考】

docker-compose.yml

version: '3'
services:
hoge_web:
build: .
volumes:
  - ./web:/var/www/html/hoge
ports:
  - 8081:8081
  - 3000:3000
hoge_database:
image: mysql:5.7.29
environment:
MYSQL_DATABASE: mysql
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: password
ports:
  - "3306:3306"
volumes:
  - ./database:/var/lib/mysql

docker-compose.yml ではWebアプリケーションサーバーとデータベースサーバーをコンテナで構築。

Webアプリケーションサーバーは上記した Dockerfile を元にPHP環境を構築してビルドしました。
DBサーバーはMySQLの5.7系の最新版のイメージを利用しました。
8系を用いるか迷いましたが、8系は非常に大きなリファクタリングを含んでいるとのことで、より現場に近いであろう5.7系を選択することとしました。

DockerによるMySQLの環境構築は初めてだったので、検索しつつ記述をおこなっています。

【参考】

docker-compose.prod.yml

version: '3'
services:
  hoge_web:
    restart: always
  hoge_database:
    restart: always

学習時に何気なくやり過ごしていた restart: always が何をしているのか気になり、調査してみました。

すると、OS立ち上げ時に自動的にコンテナも起動する設定とのこと。
調べてみると、確かに学習で用いていたPostgreSQLのコンテナが何故か起動中…
開発環境では不要との判断で取り除くこととしました。

しかし、(せっかくのOS立ち上げ時の自動起動なので、とりあえず万が一に備えて本番環境では自動起動するように設定したい…!)との思いから、本番環境用に分離しました。

$ docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

のように -f のオプションを用いると複数のcomposeファイルが利用できるそうです。

【参考】

install-composer.sh

#!/bin/sh

EXPECTED_SIGNATURE="$(wget -q -O - https://composer.github.io/installer.sig)"
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
ACTUAL_SIGNATURE="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"

if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]
then
    >&2 echo 'ERROR: Invalid installer signature'
    rm composer-setup.php
    exit 1
fi

php composer-setup.php --quiet
RESULT=$?
rm composer-setup.php
exit $RESULT

こちらは PHPのパッケージ管理システム composer のインストールスクリプトです。
Dockerfile で指定して呼び出しています。

Dockerの起動

上記した4つのファイルの用意が完了したらdocker-compose.yml があるディレクトリで

$ docker-compose up -d

のコマンドを実行してDockerの起動です。
無事コンテナが立ち上がればひとまず安心ですね。

まとめ

この記事ではDockerでPHPのWebアプリケーションサーバーのコンテナとMySQLのデータベースのコンテナを設定して立ち上げまで行いました。

ひとまず、無事ビルドされてコンテナが立ち上がってくれれば期待した挙動となります。
次回の記事ではLaravelの初期設定について書いていきたいと思います。

まだまだ未熟なので、もし誤りがありましたらご指摘いただけると大変嬉しいです。

参考サイト一覧

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です