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. 下準備
今回は下記ファイル構成にします。
/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 コンテナに自動インポートされます。今回は下記内容でつくりました。
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 等にすれば動くと思います。
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 を下記内容で作ります。
(説明用にコメントを多めに入れています)
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 の設定は以下の通りです。
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 にしているのは、僕がこのパスで慣れているためです。
お好みのパスを指定してください。
- nginx (CakePHP 4.x Strawberry Cookbook)
- https://book.cakephp.org/4/en/installation.html#nginx
設定ファイルを作成したら、docker-compose コマンドでコンテナをビルド、起動します。
$ cd /path/to/your-dir/docker
$ docker-compose up -d
5. composer インストール
今回は CakePHP 4 のインストールを下記手順で行います。
- PHP-FPM コンテナ内で /var/www/composer.phar を作成
- composer で /var/www/html に CakePHP 4 をインストール
- composer.phar を /var/www/html の中に移動
上記 1 の手順として、PHP-FPM のコンテナに入って、composer 公式ドキュメントにあるコマンドで composer.phar をインストールします。
- Download Composer (Composer)
- https://getcomposer.org/download/
$ 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 です。
'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 を使ってみようかなと思っています。