先日いよいよ個人開発を開始しました。
目指すところは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の初期設定について書いていきたいと思います。
まだまだ未熟なので、もし誤りがありましたらご指摘いただけると大変嬉しいです。