CakePHP 5 の開発環境を Docker で構築

はじめに

本記事では CakePHP 5 の開発環境を Docker を使って構築する方法をご紹介します。

ファイル構成は下記のようになります。

/path/to/your-project/
├ .github/
├ bin/
├ config/
│   ├ docker/
│   │   ├ web/
│   │   │   └ Dockerfile
│   │   ├ docker-compose.yml
│   │   └ install-cake5.sh

/path/to/your-project の中に CakePHP 5 のスケルトン(cakephp/app)をインストールし、その config フォルダの中に Docker の設定ファイルを格納します。

OS
Windows 11 Home
Docker
Docker Desktop 4.23.0
目次
  1. Docker 環境を構築
  2. CakePHP 5 のインストール
  3. おわりに

1. Docker 環境を構築

下記内容で Dockerfile と docker-compose.yml を作成します。

Dockerfile の RUN では CakePHP 5 のインストールに必要最低限なものだけインストールしています。
また docker-compose.yml の MySQL のユーザー情報などは適宜変更してください。

config/docker/web/Dockerfile
FROM php:8.2-apache

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

RUN apt update \
  # Zip
  && apt install -y vim unzip \
  # MySQL
  && docker-php-ext-install pdo_mysql \
  # intl
  && apt install -y libicu-dev \
  && docker-php-ext-install intl \
  # Apache mod_rewrite 有効化
  && a2enmod rewrite
config/docker/docker-compose.yml
version: "3"

# WSL などファイル同期に時間がかかる環境用
# (cake5-web の volumes のコメントアウトも外す)
#volumes:
  #dummy-tmp:
  #dummy-vendor:

services:
  # PHP-Apache
  cake5-web:
    container_name: cake5-web
    build:
      context: ./web
      dockerfile: Dockerfile
    depends_on:
      - cake5-db
    ports:
      - 80:80
    volumes:
      - ../../:/var/www/html
      #- dummy-tmp:/var/www/html/tmp
      #- dummy-vendor:/var/www/html/vendor

  # MySQL
  cake5-db:
    container_name: cake5-db
    image: mysql:8.1
    environment:
      MYSQL_DATABASE: cake5
      MYSQL_USER: cake5_user
      MYSQL_PASSWORD: hi2mi4i6
      MYSQL_ROOT_PASSWORD: mu7ya9to

  # phpMyAdmin
  cake5-pma:
    container_name: cake5-pma
    image: phpmyadmin/phpmyadmin:5.2
    depends_on:
      - cake5-db
    ports:
      - 8080:80
    environment:
      PMA_HOST: cake5-db
      PMA_USER: root
      PMA_PASSWORD: mu7ya9to

ホスト OS 上で、下記のように docker-compose コマンドを使ってコンテナを作成、起動します。

cd /path/to/your-project/config/docker
docker-compose -p cake5 up -d

動作を確認するには cake5-web に入って(アタッチして)、下記コマンドのように config フォルダ内にファイルがあれば OK だと思います。

root@0123456789ab:/var/www/html# ls config/docker
docker-compose.yml  web

もしここで下記のようなエラーになったり、ファイルが表示されない場合は、
コンテナとホスト OS とのファイル同期がうまくいっていないか、
フォルダ構成が間違っている可能性があります。

ls: cannot access 'config/docker': No such file or directory

2. CakePHP 5 のインストール

CakePHP インストール用のシェルスクリプトを作成します。

config/docker/install-cake5.sh
#!/bin/bash

mkdir /var/www/cake5
cd /var/www/cake5
composer create-project --prefer-dist cakephp/app . "5.*"
cd /var/www/html
cp -prT /var/www/cake5 /var/www/html
rm -rf /var/www/cake5

コンテナの中で下記コマンドで CakePHP 5 をインストールできます。

root@0123456789ab:/var/www/html# config/docker/install-cake5.sh
(省略)
Set Folder Permissions ? (Default to Y) [Y,n]? Y ← Y と入力して enter キー押下
(省略)
Permissions set on /var/www/cake5/logs
Updated Security.salt value in config/app_local.php

上記のようにならず途中で止まる場合で、Windows の WSL で Docker Desktop をお使いの場合は、上記 docker-compose.yml の dummy-tmp と dummy-vendor が有効になっているかご確認ください。

インストールが完了したら config/app_local.php のデータベース接続情報を docker-compose.yml で設定した内容に変更します。
特にホスト名を localhost から cake5-db に変更し忘れないようにご注意ください。

成功していれば http://localhost などにアクセスすると CakePHP 5 のウェルカムページが表示されます。

3. おわりに

今回 CakePHP 5 のインストールにシェルスクリプトを使ったのは、
composer create-project 実行時に対象フォルダが空でないとエラーになるためです。

この処理をもう少しスマートにできないかと思うのですが、良いアイディアが出なかったので、とりあえずこんな形にしています。

config/app_local.php のデータベース接続情報を変更する箇所も自動化したいところですね。