Docker の Nginx + MySQL 環境で CakePHP 4 を動かす

はじめに

CakePHP はデフォルトで .htaccess が含まれており、一見 Apache での動作が前提のようにも見えますが、Nginx でも動作させることができます。

今日は Docker で構築した Nginx + MySQL 環境で CakePHP 4 を動かす方法をご紹介します。

Docker
19.03.1
Docker Compose
1.24.1
Nginx
1.19.2
PHP
7.4.9
MySQL
5.7.31
CakePHP
4.1.3
目次
  1. 下準備
  2. docker-compose.yml 作成
  3. PHP-FPM 用 Dockerfile 作成
  4. Nginx 設定&コンテナ起動
  5. composer インストール
  6. CakePHP 4 インストール & 動作確認
  7. おわりに

1. 下準備

今回は下記ファイル構成にします。

/path/to/your-dir/
  ├ docker/
  │  ├ initdb/
  │  │  └ articles.sql
  │  │
  │  ├ myapp-php/
  │  │  └ Dockerfile
  │  │
  │  ├ nginx-templates/
  │  │  └ default.conf.template
  │  │
  │  └ docker-compose.yml
  │
  └ html/

initdb/articles.sql は動作確認で使用する articles テーブル生成用のファイルです。MySQL コンテナに自動インポートされます。今回は下記内容でつくりました。

/docker/initdb/articles.sql
SET CHARACTER_SET_CLIENT = utf8mb4;
SET CHARACTER_SET_CONNECTION = utf8mb4;

CREATE TABLE articles (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  title varchar(255) NOT NULL,
  body text NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO articles (id, title, body)
VALUES (NULL, 'テスト1', 'テスト\r\nテスト\r\nテスト'); 

myapp-php/Dockerfile は PHP-FPM コンテナに PHP 拡張などをインストールするための処理を書きます。

nginx-templates/default.conf.template は Nginx コンテナで使用する設定ファイルです。

html/ フォルダは Nginx と PHP-FPM コンテナにマウントして CakePHP のファイルをローカルでも編集可能にします。
この html/ フォルダを事前に作っておいてください。

2. docker-compose.yml 作成

docker-compose.yml の内容は以下の通りです。

先日の「Docker で Nginx 1.19 + PHP 7.4 + MariaDB 10.5 環境を構築」でご紹介したものをベースにしています。
詳細はそちらで紹介していますので、よろしければご覧ください。

上記投稿を参考にしたサンプル作成などで既に myapp-php で Dockerfile をビルドしている場合は、一度イメージを削除してください。

MariaDB を使いたい方は myapp-db の images を mariadb:10.5 等にすれば動くと思います。

/docker/docker-compose.yml
version: "3"

services:
  # Nginx
  myapp-web:
    container_name: myapp-web
    image: nginx:1.19
    depends_on:
      - myapp-php
      - myapp-db
    ports:
      - "80:80"
    volumes:
      - "./nginx-templates:/etc/nginx/templates"
      - "../html:/var/www/html"

  # PHP-FPM
  myapp-php:
    container_name: myapp-php
    build:
      context: ./myapp-php
      dockerfile: Dockerfile
    volumes:
      - "../html:/var/www/html"

  # MySQL
  myapp-db:
    container_name: myapp-db
    image: mysql:5.7
    volumes:
      - "./initdb:/docker-entrypoint-initdb.d"
    environment:
      MYSQL_DATABASE: sampledb
      MYSQL_USER: sample-user
      MYSQL_PASSWORD: hi2mi4i6
      MYSQL_ROOT_PASSWORD: mu7ya9to

  # phpMyAdmin
  myapp-pma:
    container_name: myapp-pma
    image: phpmyadmin/phpmyadmin:5.0
    depends_on:
      - myapp-db
    ports:
      - "8080:80"
    environment:
      PMA_HOST: myapp-db
      PMA_USER: sample-user
      PMA_PASSWORD: hi2mi4i6

3. PHP-FPM 用 Dockerfile 作成

PHP-FPM コンテナ用の Dockerfile を下記内容で作ります。
(説明用にコメントを多めに入れています)

/docker/myapp-php/Dockerfile
FROM php:7.4-fpm

RUN apt-get update && \
  apt-get install -y vim &&\
  # unzip コマンド (composer で必要)
  apt-get install -y unzip &&\
  # PHP の intl 拡張 (CakePHP 4 で必要)
  apt-get install -y libicu-dev &&\
  docker-php-ext-install intl &&\
  # MySQL
  docker-php-ext-install pdo_mysql

4. Nginx 設定&コンテナ起動

Nginx の設定は以下の通りです。

/docker/nginx-templates/default.conf.template
server {
    root   /var/www/html/webroot;
    index  index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
       fastcgi_pass   myapp-php:9000;
       fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
       include        fastcgi_params;
    }
}

下記の CakePHP 4 公式ドキュメントを参考に、root を webroot にして、try_files を追加しました。

root で /var/www/html にしているのは、僕がこのパスで慣れているためです。
お好みのパスを指定してください。

設定ファイルを作成したら、docker-compose コマンドでコンテナをビルド、起動します。

$ cd /path/to/your-dir/docker
$ docker-compose up -d

5. composer インストール

今回は CakePHP 4 のインストールを下記手順で行います。

  1. PHP-FPM コンテナ内で /var/www/composer.phar を作成
  2. composer で /var/www/html に CakePHP 4 をインストール
  3. composer.phar を /var/www/html の中に移動

上記 1 の手順として、PHP-FPM のコンテナに入って、composer 公式ドキュメントにあるコマンドで composer.phar をインストールします。

$ docker exec -it myapp-php bash

root@123456789abc:/var/www/html# cd /var/www
# 【注意】下記4つのコマンドはコピペせず composer 公式ドキュメントにあるコードを使ってください
root@123456789abc:/var/www# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
root@123456789abc:/var/www# php -r "if (hash_file('sha384', 'composer-setup.php') === '...') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
root@123456789abc:/var/www# php composer-setup.php
root@123456789abc:/var/www# php -r "unlink('composer-setup.php');"

6. CakePHP 4 インストール & 動作確認

PHP-FPM コンテナ内で以下のように composer create-project コマンドで CakePHP 4 をインストールし、
その後 mv コマンドで composer.phar を /var/www/html の中に移動します。

root@123456789abc:/var/www# php composer.phar create-project --prefer-dist cakephp/app:4.* html

root@123456789abc:/var/www# mv composer.phar html

インストールが完了したら CakePHP 4 のデータベース設定を変更します。

PHP-FPM コンテナに vim を入れているので、それを使って変更してもいいですし、/var/www/html を ローカルの /html にマウントしているので、ローカル側で編集しても OK です。

/html/config/app_local.php
'Datasources' => [
    'default' => [
        'host' => 'myapp-db', // ← 変更
        ...
        // ↓変更
        'username' => 'sample-user',
        'password' => 'hi2mi4i6',
        'database' => 'sampledb',
        ...

以上で作業は完了です。

あとはブラウザでアクセスしたり、下記のような Bake コマンドを叩いたりして、動作を確認してください。
(URL は http://localhost/ や http://192.168.99.100/ など Docker の環境によります)

root@123456789abc:/var/www# cd html
root@123456789abc:/var/www/html# bin/cake bake all articles

phpMyAdmin は 8080 ポートでアクセス可能です。
(http://localhost:8080、http://192.168.99.100:8080、 など)

7. おわりに

今回は CakePHP 4 公式ドキュメントにある設定例のおかげもあり、特につまづく事なく Nginx でも CakePHP 4 を動作させることができました。

どんなフレームワークでもそうですが、多くのプロジェクトで採用できると、開発効率の向上に繋りますよね。プロジェクトによってサーバの要件が決まっている場合があるので、複数のサーバソフトウェアに対応しているのはメリットだと思います。

また Docker についてもやはり便利だと思います。使い始めた当初は勝手がわからなくて苦労もしたのですが、慣れてくると様々な環境を簡単に構築できますし、それをコードとして残せて共有できるのも良いですね。

次は CakePHP 4 で PostgreSQL を使ってみようかなと思っています。