Docker ComposeでCakePHPの開発環境をサクッと作る方法

Docker ComposeでCakePHPの開発環境をサクッと作る方法

今回は、プログラミングに関する記事です。

タイトルの通り、CakePHPの開発環境をDocker Composeを使ってサクッと作る方法について解説します。

今回作ってみたCakePHPの開発環境は「matatabi3 / cakephp-env (GitHubリンク)」で共有していますので、よかったらご参考ください。

「思いついたアイデアをCakePHPを使ってサクッと試したい」「プロジェクトチームみんなのPHP開発環境を共通化したい」という方の参考になれば幸いです。

目次


1. 構成について

今回作った開発環境の構成について解説します。

まずそれぞれのミドルウェアとCakePHPのバージョンはそれぞれ以下のようになっています。

  • Apache/2.4.38
  • PHP 7.2
  • MySQL 5.7
  • CakePHP 3.8

それぞれ個人的に安定しているかな?という感じでバージョンで選定していますが、ご自身の必要なバージョンに合わせてもらえたらと思います。

MySQLについては、リリースする本番環境などでAWS AuroraServerlessを使う場合、MySQL5.6しか対応していない(2020/06/03時点)ので開発環境時点でも揃えておくことをおすすめします。

(CakePHPは4が最近出たところですが、自分の中で実績のある3.8の環境を作ってみました。)

ディレクトリ構成について解説します。

├── docker
│   ├── docker-compose.yml
│   └── files
├── docker-vagrant
│   └── docker-compose.yml
└── src
├── cake
├── local
└── local-vagrant

リポジトリ直下は上記のような構成になっていて、それぞれどういうファイル群を保存しているか解説します。

  • docker
    Docker Composeを使う上で必要なファイル一式をまとめているところで、docker-vagrantは後述するVagrantの連携を考えて置いています。

  • src
    このディレクトリ以下にPHPのソースコード一式をまとめていて、cakeディレクトリにはCakePHPオリジナルのソースコード一式が置いてあります。

  • src/cake
    CakePHPをcomposerでインストールしたときにダウンロードされるファイル一式を置いています。
    Webサイトを実装していくときにControllerやModelなどを追加していきます。

  • src/local
    Docker Composeで立ち上げる開発環境用で、cakeディレクトリに元々存在しているCakePHPのオリジナルファイルで上書きしたいものを置く場所にしています。
    具体的には、Webサイトを実装する上で変更するであろうApplication.phpやbootstrap.phpなどですね。
    この構成にしているのは、CakePHPをcomposerでインストールしたときに存在しているけど、をlocalに置いておいて、docker-compose.ymlで上書きする仕様にしておくと、CakePHPのバージョンアップの際に影響を受けにくいだろうと考えからです。(cakeディレクトリはそのままバージョンアップ時にファイルを上書き可能にする)

また、デプロイ用にsrc/localと並列でsrc/devやsrc/productionディレクトリを作成して.envなどを置いておき、デプロイ時にlocalのファイルで上書きした後に、さらにdevやproductionのファイルで上書きすることで、環境毎の設定も行えるようにしています。(.envをバージョン管理すべきではないという議論は置いておいて)

もう少し効率の良い方法があるとは思いますので、一案としてご認識してもらえたらと思います。

ちなみにMySQL用のボリュームは永続化せず、立ち上げ時にデータを再投入するような次項の仕組みを使っています。


2. docker-compose.ymlの解説

Webサーバー+DBサーバーのサーバー構成で本番運用することを想定して、基本的にコンテナでもコンテナ間で独自のネットワークを構築して通信するような設定にしています。

下記で172.30.0.0系のネットワークを作成しています。

docker-compose.yml
base:
ipam:
driver: default
config:
- subnet: 172.30.0.0/24

MySQL用のコンテナはcake_dbという名前を付けて、172.30.0.10のIPアドレスを割り振っています。

今の時点では使用していませんが、起動時に自動でスクリプトが実行できるように./files/mysql/docker-entrypoint-initdb.dをコンテナにマウントしておきます。

docker-compose.yml
cake_db:
build: ./files/mysql
networks:
base:
ipv4_address: '172.30.0.10'
volumes:
- ./files/mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d

Webサーバー用のコンテナはcake_webという名前を付けて、172.30.0.100のIPアドレスを割り振っています。

docker-compose.yml
cake_web:
build: ./files/web
depends_on:
- cake_db
networks:
base:
ipv4_address: '172.30.0.100'

また、ソースコードのCakePHPのオリジナルファイルを上書きするものの設定をvolumesの箇所に書き足していきます。

docker-compose.yml
volumes:
- ..:/var/shared
- ../src:/var/www/html
- ../src/local/composer.json:/var/www/html/cake/composer.json
- ../src/local/composer.lock:/var/www/html/cake/composer.lock
- ../src/local/src/Application.php:/var/www/html/cake/src/Application.php
- ../src/local/config/.env:/var/www/html/cake/config/.env
- ../src/local/config/app.php:/var/www/html/cake/config/app.php
- ../src/local/config/bootstrap.php:/var/www/html/cake/config/bootstrap.php

VSCodeでPHPのリモートデバッグをするときの設定として、下記の記載も追加しています。

docker-compose.yml
extra_hosts:
- "dev_host:172.30.0.1"

最後に、Webサーバー用のDocker起動時に実行するスクリプトを指定しています。

docker-compose.yml
command: bash -c "bash /var/shared/docker/files/web/init.sh"

こちらについては次項で詳しく解説します。


3. Webサーバー用Dockerの解説

上記で「MySQL用のボリュームは永続化せず、立ち上げ時にデータを再投入する」と記載していましたが、その理由は、ボリュームを永続化してしまうとチームで開発しているときに「誰かがテーブル構成を変更したときは一度DBを消して再度作り直さないといけない」という状況が出てくると思います。

これが発生しないようにDocker起動時に毎回CakePHPのmigrationsを実行するようにしておけば、他の人の変更を追いやすくなりますね。

Dockerizeを使用している理由は、migrationsはPHP用のコンテナで実行しますが普通に起動時の実行コマンドとして実行すると、MySQLのコンテナは起動に時間がかかるのでMySQLが立ち上がりきる前にmigrationsを実行してしまい「Connection refused」が発生してエラーになります。

Dockerizeを使うことで、PHP用のコンテナ内でMySQLコンテナの起動が完了するのを待つことができますので、きちんと起動時にmigrationsが実行できるようになります。

Dockerizeはコンテナ間の連携でけっこう使えるツールだと思います!

Dockerizeをインストールしている場所は、docker/files/web/Dockerfile内の以下の場所で、コンテナ作成時にDockerfizeをインストールしています。

docker/files/web/Dockerfile
RUN apt-get update && apt-get install -y wget
ENV DOCKERIZE_VERSION v0.6.1
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz

docker-compose.ymlに以下のように書いておくと、docker-compose実行時に任意のコマンドが実行できるので、init.shの中に起動時に実行したいことを書いていきます。

docker-compose.yml
command: bash -c "bash /var/shared/docker/files/web/init.sh"

init.shの中身についてそれぞれ解説していきます。

以下の部分は、初回起動時にcomposer installでCakePHP実行に必要なファイル一式を取得します。

init.sh
if [ ! -e /var/www/html/cake/vendor ]; then
cd /var/www/html/cake
composer install
fi

以下の部分で、MySQLのコンテナの起動を待ちます。

init.sh
dockerize -timeout 20s -wait tcp://cake_db:3306
# -timeout 20s ←20秒待ち、スペックに応じて変更
# cake_db:3306 ←コンテナ名:ポート番号、MySQL以外でも使えます

以下の部分で、migrateを実行してテーブルの追加や変更を行い、seedでテストデータを入れることを想定しています。

init.sh
php cake.php migrations migrate

php cake.php migrations seed

以下の最後の部分ですが、init.shを実行するように指定したときに、init.shの実行が完了するとコンテナが終了してしまうので、最後にapache2を実行しなおすことで、コンテナが終了しないように制御しています。

init.sh
source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND "$@"

これ見つけるのにけっこう苦労しました。。。


4. Vagrantとの連携を考える

リポジトリにdocker-vagrantというディレクトリを作っていて、こちらはVagrantで立ち上げたLinux上で今回のDocker Composeを使えるように作りかけているものです。

理由としては、Macを使って開発を行っているときに、MacのDockerで直接コンテナを動かしてCakePHPを使っているとWebサイトの画面表示にかなり時間がかかるなどパフォーマンスが全然出ませんでした。

結果的にVagrantで起動したLinux上でDockerを使うと体感5倍以上の速さが出たので、MacではVagrantと組み合わせた方がDockerのパフォーマンスがかなり良くなります。

そうなったときに、チーム内で同じ開発環境を共有するとなるとWindows(WSL)やLinuxで直接Docker Composeを実行する人と、Vagrant上でDocker Composeを実行する人が出てくるようになると思います。

両者で環境構築で必要なファイルをまとめておけるように、今回の構成を考えてみました。

できれば、Vagrant上のDockerでもブラウザにhttp://localhostと入力してアクセスできるようにしたいところですが、今のところ方法が見つけられていません。。。


以上、ざっくりではありますがCakePHPの開発環境をDocker Composeを使ってサクッと作る方法についての解説でした。

Docker Composeは環境構築では欠かせないものになってきてるので、これからプログラミングを始める方の参考になれば幸いです。


Docker関連の記事はこちら

返金保証付きプログラミングスクールで >>

この記事もおすすめ