Docker で Nginx + PostgreSQL 環境を作って CakePHP 4 を動かす
はじめに
CakePHP 4 は Apache + MySQL に限らず、様々な HTTP サーバ、データベースエンジンに対応しています。
今日は Docker Compose で公式イメージを用いた Nginx + PostgreSQL + Adminer の CakePHP 4 動作環境を構築する方法をご紹介します。
- Docker
- 19.03.1
- Docker Compose
- 1.24.1
- CakePHP
- 4.1.4
- Nginx
- 1.19.2
- PHP
- 7.4.9
- PostgreSQL
- 12.4
- Adminer
- 4.7.7
1. 下準備
今回のファイル構成です。
/path/to/your-dir/
├ docker/
│ ├ initdb/
│ │ └ articles.sql
│ │
│ ├ myapp-php/
│ │ └ Dockerfile
│ │
│ ├ nginx-templates/
│ │ └ default.conf.template
│ │
│ └ docker-compose.yml
│
└ html/
/docker/initdb/articles.sql は動作確認用テーブルを作る SQL で、PostgreSQL のコンテナで自動的にインポートされます。今回は下記のようにしました。
SET timezone TO 'Asia/Tokyo';
CREATE TABLE articles (
id SERIAL NOT NULL,
title VARCHAR(255),
body TEXT,
created TIMESTAMP,
modified TIMESTAMP,
PRIMARY KEY (id)
);
INSERT INTO articles (id, title, body, created, modified) VALUES
(1, 'テスト1', E'テスト1\r\nテスト1', NOW(), NOW()),
(2, 'テスト2', E'テスト2\r\nテスト2', NOW(), NOW());
SELECT setval('articles_id_seq', 2);
/docker/myapp-php/Dockerfile は PHP-FPM コンテナに PHP 拡張などをインストールするために使います。
/docker/nginx-templates/default.conf.template は Nginx 用の設定ファイルで、PHP-FPM との連携や CakePHP 4 を使用するための設定を書きます。
/html は Nginx と PHP-FPM コンテナにマウントし、そこに CakePHP 4 をインストールすることで、ローカルでも編集できるようにします。
この /html フォルダは事前に作ってください。
2. Dockerfile 作成
PHP-FPM コンテナ用に 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 &&\
# PDO PostgreSQL 拡張
apt-get install -y libpq-dev &&\
docker-php-ext-install pdo_pgsql
- php Tags - Docker Hub
- https://hub.docker.com/_/php?tab=tags&name=fpm
今回は docker-compose コマンドでビルドしますが、事前にビルドしておきたい場合は下記投稿を参考にしてください。
- 3. Dockerfile で 拡張モジュール導入済のイメージを作成 (Docker で PHP 7.4 と MariaDB 10.5 の LAMP + phpMyAdmin 環境を構築する方法)
- https://tt-computing.com/docker-php74-mariadb10_5#make-dockerfile
3. default.conf.template 作成
Nginx で PHP-FPM を使って CakePHP 4 を動かすための設定を記述します。
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 を追加しました。
- nginx (CakePHP 4.x Strawberry Cookbook)
- https://book.cakephp.org/4/en/installation.html#nginx
4. docker-compose.yml 作成 & ビルド
今回は下記内容で docker-compose.yml をつくりました。
docker_myapp-php:latest イメージが既にある場合は削除してください。
(docker images コマンドなどで確認できます)
Docker toolbox on windows の場合は volumes でマウントするために、VirtualBox の共有フォルダ設定で /path/to/your-dir/html を追加する必要があります。
設定方法は「docker toolbox windows volumes 共有」などで検索すると、みつかると思います。
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"
# PostgreSQL
myapp-db:
container_name: myapp-db
image: postgres:12-alpine
environment:
POSTGRES_DB: sampledb
POSTGRES_USER: sample-user
POSTGRES_PASSWORD: hi2mi4i6
volumes:
- "./initdb:/docker-entrypoint-initdb.d"
# Adminer
myapp-adminer:
container_name: myapp-adminer
image: adminer:4.7-standalone
depends_on:
- myapp-db
environment:
ADMINER_DEFAULT_SERVER: myapp-db
ADMINER_DESIGN: ng9
ports:
- "8080:8080"
- Compose file version 3 reference | Docker Documentation
- https://docs.docker.com/compose/compose-file/
- postgres Tags - Docker Hub
- https://hub.docker.com/_/postgres?tab=tags
- adminer Tags - Docker Hub
- https://hub.docker.com/_/adminer?tab=tags
Nginx コンテナ部分の詳細は、過去の「3. Nginx コンテナ(Docker で Nginx 1.19 + PHP 7.4 + MariaDB 10.5 環境を構築)」でご紹介しています。
Adminer コンテナについては「Docker で Adminer を使ってデータベースを管理」をご覧ください。
また A5M2 を使いたい方は「Windows の A5M2 で Docker コンテナのデータベースに接続する方法」をご参照頂ければと思います。
docker-compose.yml の準備が完了したら、下記コマンドでコンテナのビルドと起動をします。
$ 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 をインストールし、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 です。
設定方法については「CakePHP 4 で PostgreSQL を使う方法」でも紹介していますので、よろしければご覧ください。
<?php
...
// use Cake\Database\Driver\Mysql; // ← 削除 or コメントアウト
use Cake\Database\Driver\Postgres; // ← 追加
...
'App' => [
...
// ↓必要に応じて変更してください
'defaultLocale' => env('APP_DEFAULT_LOCALE', 'ja_JP'),
'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'Asia/Tokyo'),
...
],
...
'Datasources' => [
...
'default' => [
...
'driver' => Postgres::class, // ← 変更
...
],
...
'test' => [
...
'driver' => Postgres::class, // ← 変更
...
],
'Datasources' => [
'default' => [
'host' => 'myapp-db', // ← 変更
...
// ↓変更
'username' => 'sample-user',
'password' => 'hi2mi4i6',
'database' => 'sampledb',
...
以上で作業は完了です。
Web サーバには http://localhost や http://192.168.99.100 などでアクセスできます。
(ホスト名や IP アドレスは設定などによって異なります)
下記のように bake all コマンドを使うと簡単に動作確認用のページが作れます。
root@123456789abc:/var/www# cd /var/www/html
root@123456789abc:/var/www/html# bin/cake bake all articles
また Adminer には 8080 ポートを割り当てているので、
http://localhost:8080 や http://192.168.99.100:8080 でアクセス可能です。
7. おわりに
今回の内容は、過去の「Docker の Nginx + MySQL 環境で CakePHP 4 を動かす」と「Docker で Apache + PostgreSQL 環境を作って CakePHP 4 を動かす」の内容を組み合わせたものになっています。
Docker は色々と覚えることが多いですが、全てを理解していなくても、ある程度使い方が分かれば様々な環境を簡単に作れるようになります。
僕もまだまだ勉強中ですが、使いながら理解を深めている感じです。
参考までに僕の Docker 環境構築のフローですが、まず Docker Hub で使用したいソフトウェアの公式イメージを探し、各イメージの Description や Tags を見ながら Compose ファイル(docker-compose.yml)を作っています。
- Docker Hub
- https://hub.docker.com/
Compose ファイルの各オプションについては公式ドキュメントが役立ちます。英語なので読むのが大変かもしれませんが、知らないオプションが出てきた場合などはこちらを参照してみるといいと思います。
- Compose file version 3 reference
- https://docs.docker.com/compose/compose-file/