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

はじめに
これまで Docker を用いた CakePHP 4 の動作環境構築について、
Apache、Nginx、MySQL、PostgreSQL の組み合わせで3つご紹介してきました。
- Docker で Apache + PostgreSQL 環境を作って CakePHP 4 を動かす
- Docker で Nginx + PostgreSQL 環境を作って CakePHP 4 を動かす
- Docker の Nginx + MySQL 環境で CakePHP 4 を動かす
今日はその最後の組み合わせで、これが最も一般的かとも思うのですが
Docker で構築した Apache + MySQL 環境で CakePHP 4 を動かす方法をご紹介します。
今回は MySQL 8.0 を使用していますが MySQL 5.7 や MariaDB を使う方法もご説明します。
- Docker
- 19.03.1
- Docker Compose
- 1.24.1
- CakePHP
- 4.1.4
- Apache
- 2.4.38
- PHP
- 7.4.9
- MySQL
- 8.0.21
1. 下準備
今回のファイル構成です。
/path/to/your-dir/
├ docker/
│ ├ initdb/
│ │ └ articles.sql
│ │
│ ├ myapp-web/
│ │ └ Dockerfile
│ │
│ └ docker-compose.yml
│
└ html/
/docker/initdb/articles.sql は articles テーブルを作る SQL で、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テスト');
/docker/myapp-web/Dockerfile は Web サーバコンテナに PHP 拡張や Composer などをインストールする処理を書きます。内容は後ほどご紹介します。
/html は Web サーバ のコンテナにマウントします。コンテナ上でそこに CakePHP 4 をインストールして、ローカルでも編集できるようにします。
この /html フォルダは事前に作っておいてください。
2. docker-compose.yml 作成
今回作った 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"
# MySQL
myapp-db:
container_name: myapp-db
image: mysql:8.0
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: root
PMA_PASSWORD: mu7ya9to
Docker toolbox on windows の場合は volumes でマウントするために、VirtualBox の共有フォルダ設定で /path/to/your-dir/html と initdb を追加する必要があります。
設定方法は「docker toolbox windows volumes 共有」などで検索すると、みつかると思います。
MySQL 5.7 や MariaDB を使いたい場合は image: mysql:8.0 の箇所を
image: mysql:5.7 や image: mariadb:10.5 などにしてください。
イメージ名は、下記 Docker Hub ページの「Tags」メニューで検索できます。
- mysql - Docker Hub
- https://hub.docker.com/_/mysql
- mariadb - Docker Hub
- https://hub.docker.com/_/mariadb
- phpmyadmin - Docker Hub
- https://hub.docker.com/_/phpmyadmin
- Compose file version 3 reference | Docker Documentation
- https://docs.docker.com/compose/compose-file/
3. Dockerfile 作成 & ビルド
Webサーバとする myapp-web コンテナ用に、PHP 拡張 や Composer などをインストールしたイメージを作るために、下記 Dockerfile を用意します。
FROM php:7.4-apache
# Composer のバージョン と ハッシュ値
ARG composer_ver=1.10.13
ARG composer_hash=5ca7445cfd48dd27c5a84aa005a47b4d9fd91132313830609875df3a6973708f
# Composer の保存先
ARG composer_path=/usr/local/bin/composer
RUN apt-get update \
# Composer インストール
&& php -r "copy('https://getcomposer.org/download/$composer_ver/composer.phar', '$composer_path');" \
&& chmod 755 $composer_path \
&& php -r "if (hash_file('sha256', '$composer_path') !== '$composer_hash') { \
echo '!!! Failed to install Composer !!!'; \
unlink('$composer_path'); \
} \
echo PHP_EOL;" \
# vim (省略可)
&& apt-get install -y vim \
# unzip コマンド (composer create-project で必要)
&& apt-get install -y unzip \
# PHP の intl 拡張 (CakePHP 4 で必要)
&& apt-get install -y libicu-dev \
&& docker-php-ext-install intl \
# PDO MySQL 拡張
&& docker-php-ext-install pdo_mysql \
# mod_rewrite 有効化
&& a2enmod rewrite
ベースのイメージは、PHP の公式イメージで Apache が導入済みの php:7.4-apache を選びました。
- php Tags - Docker Hub
- https://hub.docker.com/_/php?tab=tags
Composer インストール箇所に関しては、前回の「Docker 公式 PHP イメージに composer を導入する Dockerfile を作る」をご覧ください。
このイメージのビルドは docker-compose コマンドでコンテナ作成と同時に行いますが、事前にビルドしておきたい場合は「3. Dockerfile で 拡張モジュール導入済のイメージを作成 (Docker で PHP 7.4 と MariaDB 10.5 の LAMP + phpMyAdmin 環境を構築する方法)」を参考にして頂ければと思います。
Dockerfile を作ったら、下記コマンドでコンテナのビルドと起動をします。
既に docker_myapp-web:latest イメージがある場合は、ビルド前に削除してください。
$ cd /path/to/your-dir/docker
$ docker-compose up -d
4. CakePHP 4 インストール
下記コマンドで CakePHP 4 をインストールします。
$ docker exec -it myapp-web bash
root@123456789abc:/var/www/html# cd ../
root@123456789abc:/var/www# composer create-project --prefer-dist cakephp/app:4.* html
インストールが完了したら config/app_local.php のデータベース設定を変更します。
コンテナに vim をインストールしているのでそれを使っても良いですし、ローカル側で編集しても OK です。
// ↓必要に応じて変更してください
'App' => [
...
'defaultLocale' => env('APP_DEFAULT_LOCALE', 'ja_JP'),
'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'Asia/Tokyo'),
'Datasources' => [
'default' => [
'host' => 'myapp-db', // ← 変更
...
// ↓変更
'username' => 'sample-user',
'password' => 'hi2mi4i6',
'database' => 'sampledb',
...
以上で作業は完了です。
あとはブラウザでアクセスして動作を確認してください。
(URL は http://localhost/ や http://192.168.99.100/ など Docker の環境によります)
僕は bake all コマンドを使って確認しています。
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、 など)
5. おわりに
今回の環境構築では Composer を Dockerfile で自動インストールする形にして、より手間が少なくなるようにしました。
次の取り組みとして、本記事のように環境構築と CakePHP インストールを同時に行う場合に、そのインストールも自動化できないかなと考えています。
僕は「自動化」や「効率化」のための技術習得をついつい後回しにしていたのですが、身についてくると開発速度があがりますね。
学習コストをかける価値はあると感じています。