Docker で Apache + PostgreSQL 環境を作って CakePHP 4 を動かす

はじめに

前回の「CakePHP 4 で PostgreSQL を使う方法」では、CakePHP 4 で PostgreSQL に接続する方法についてご説明しました。

今日はその開発環境として Docker Compose で公式イメージを用いて
Apache + PostgreSQL + Adminer の CakePHP 4 動作環境を構築する方法をご紹介します。

Docker
19.03.1
Docker Compose
1.24.1
CakePHP
4.1.4
PostgreSQL
12.3
Adminer
4.7.7
目次
  1. 下準備
  2. Dockerfile 作成
  3. docker-compose.yml 作成 & ビルド
  4. composer.phar 設置
  5. CakePHP 4 インストール & 設定
  6. おわりに

1. 下準備

今回のファイル構成です。

/path/to/your-dir/
  ├ docker/
  │  ├ initdb/
  │  │  └ articles.sql
  │  │
  │  ├ myapp-web/
  │  │  └ Dockerfile
  │  │
  │  └ docker-compose.yml
  │
  └ html/

/docker/initdb/articles.sql は動作確認用テーブルを作る SQL で、PostgreSQL のコンテナで自動的にインポートされます。今回は下記のようにしました。

/docker/initdb/articles.sql
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-web/Dockerfile は Web サーバコンテナに PHP 拡張などをインストールするために使います。

/html は Web サーバ のコンテナにマウントします。コンテナ上でそこに CakePHP 4 をインストールして、ローカルでも編集できるようにします。
この /html フォルダは事前に作っておいてください。

2. Dockerfile 作成

myapp-web コンテナ用に PHP 拡張などをインストールしたイメージを作るために、下記 Dockerfile を用意します。

ベースのイメージは、PHP の公式イメージで Apache が導入済みの php:7.4-apache を選びました。

/docker/myapp-web/Dockerfile
FROM php:7.4-apache

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 &&\
  # mod_rewrite 有効化
  a2enmod rewrite

今回は docker-compose コマンドでビルドしますが、事前にビルドしておきたい場合は下記投稿を参考にしてください。

3. docker-compose.yml 作成 & ビルド

今回は下記内容で docker-compose.yml をつくりました。

過去にコンテナ名 myapp-web で Dockerfile をビルドしている場合は、そのイメージを削除してください。

Docker toolbox on windows の場合は volumes でマウントするために、VirtualBox の共有フォルダ設定で /path/to/your-dir/html を追加する必要があります。

設定方法は「docker toolbox windows volumes 共有」などで検索すると、みつかると思います。

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

services:
  # PHP-Apache
  myapp-web:
    container_name: myapp-web
    # ./myapp-web/Dockerfile でイメージをビルド
    build:
      context: ./myapp-web
      dockerfile: Dockerfile
    # myapp-db 起動後に myapp-web を起動
    depends_on:
      - myapp-db
    # 80 番ポートを割り当て
    ports:
      - "80:80"
    # ローカルの ./html フォルダを
    # コンテナの /var/www/html にマウント
    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"

Windows ユーザーの方で A5M2 を使いたい方は「Windows の A5M2 で Docker コンテナのデータベースに接続する方法」をご参照ください。

下記コマンドでコンテナのビルドと起動をします。

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

4. composer.phar 設置

myapp-web コンテナに入って composer.phar をインストールします。

今回は下記手順で進めます。

  1. composer.phar を /var/www にインストール
  2. composer create-project で /var/www/html に CakePHP 4 をインストール
  3. composer.phar を /var/www/html に移動
$ docker exec -it myapp-web 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');"

4. CakePHP 4 インストール & 設定

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

あとはデータベースの設定を行えば完了です。
myapp-web コンテナに入れた vim を使ってもいいですし、ローカル側で編集しても OK です。

設定方法については「CakePHP 4 で PostgreSQL を使う方法」でも紹介していますので、よろしければご覧ください。

/html/config/app.php
<?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, // ← 変更
            ...
        ],
/html/config/app_local.php
'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 でアクセス可能です。

6. おわりに

以前「Docker の Nginx + MySQL 環境で CakePHP 4 を動かす」では Nginx の環境構築をご紹介しましたが、Docker を覚えてから環境構築のコストが低くなり、様々な環境がすぐに用意できるようになったと感じます。

動作速度の面では XAMPP 等に軍配が上がりますが、Linux サーバが多く使われる中で OS を揃えられるのもメリットですよね。

今まで PostgreSQL を扱う機会が少なかったのですが、環境を簡単に作れるようにもなったので、これを機に色々と動かしながら勉強しようと思っています。