この記事では、dockerでcakePHP4の環境構築の手順を解説します。
今回構築する環境は以下です。
PHP 8.1
mysql 8.0
cakePHP4.3.6
apache2.4.52
composer1.10.13
phpmyadmin
この記事では、dcakePHP4環境をdockerで構築し、cakePHP4の
- 初期画面の表示
- 最初の設定
- DBへの接続
- テストでマイグレーション作成してテーブルを作成
まで解説します。
まずは作業するディレクトリを作成しましょう。
どこでもいいですが、自分の環境(Mac)では、デスクトップにcakephpディレクトリを作成し、その中にcakephp4_testsというディレクトリを作成しています。
cakephp4_tests % pwd
.../Desktop/cakephp/cakephp4_tests
cakephp4_tests %
まずは事前準備として、dockerDesktopをインストールしておきましょう。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
【docker×cakePHP4】ファイル構成
作成するファイル構成は以下のようになっています。
ファイルを用意しましょう。
├── docker
│ ├── mysql
│ │ └── my.cnf
│ └── php
│ └── Dockerfile
├── .env
├── .gitignore
└── docker-compose.yml
【docker×cakePHP4】PHP8とapacheのDockerfile
まずは、PHP8とapacheを導入するために、docker > php > Dockerfileに内容を書き出していきます。
FROM php:8.1-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;" \
&& apt-get install -y vim \
&& apt-get install -y unzip \
&& apt-get install -y libicu-dev \
&& docker-php-ext-install intl \
&& docker-php-ext-install pdo_mysql \
&& a2enmod rewrite
apt-get install -y unzipやdocker-php-ext-install intlはcakephp4で必要なので、こちら忘れずに記載しましょう。
【docker×cakePHP4】my.cnf-mysqlの設定
mysqlの設定をするために、docker > mysql > my.cnfに以下のように書きます。
# MySQLサーバーへの設定
[mysqld]
# 文字コード/照合順序の設定
character-set-server = utf8mb4
collation-server = utf8mb4_bin
# タイムゾーンの設定
default-time-zone = SYSTEM
log_timestamps = SYSTEM
# mysqlオプションの設定
[mysql]
# 文字コードの設定
default-character-set = utf8mb4
# mysqlクライアントツールの設定
[client]
# 文字コードの設定
default-character-set = utf8mb4
【docker×cakePHP4】docker-compose.yml
dockerコンテナの設計書でもあるdocker-compose.ymlを書いていきます。
version: '3'
services:
php:
build:
context: ./docker/php
dockerfile: Dockerfile
depends_on:
- db
volumes:
- ./:/var/www
ports:
- ${WEB_PORT}:80
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
environment:
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASS}
- MYSQL_ROOT_PASSWORD=${DB_PASS}
ports:
- ${DB_PORT}:3306
restart: always
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=db
- PMA_USER=${PMA_USER}
- PMA_PASSWORD=${PMA_PASS}
links:
- db
ports:
- ${PMA_PORT}:80
volumes:
- ./docker/phpmyadmin/sessions:/sessions
mysql5.7とmysql8は認証方法が異なります。なので、mysql8を導入する際は、docker-compose.ymlにもあるように、
command: –default-authentication-plugin=mysql_native_password
を忘れずに記載しておきましょう。
MYSQL_DATABASE=${DB_NAME}のように、${DB_NAME}が気になったかと思いますがこれは環境変数です。
DB名やパスワードなどの知られたくない情報は直接記載せずに、${DB_NAME}などとし、.envファイルに書いていきます。
【docker×cakePHP4】.envに環境変数を書く
MYSQL_DATABASE=${DB_NAME}のように環境変数を使っているので、.envに対応する環境変数を書きましょう。
${WEB_PORT}
${DB_NAME}
${DB_USER}
${DB_PASS}
${PMA_USER}
${PMA_PASS}
${PMA_PORT}
に対応する環境変数を.envに書く必要があります。
書き方は、以下のように${WEB_PORT}ならWEB_PORT、${DB_NAME}ならDB_NAMEとすればOKです。
WEB_PORT=
DB_NAME=
DB_USER=
DB_PASS=
DB_PORT=
PMA_USER=
PMA_PASS=
PMA_PORT=
↓
ユーザー名やパスワードはそれぞれで設定してください。
WEB_PORT=9811
DB_NAME=cakephp4_tests
DB_USER=ユーザー名を設定する(ex.cake)
DB_PASS=パスワードを設定する(ex.password)
DB_PORT=9821
PMA_USER=ユーザー名を設定する
PMA_PASS=パスワードを設定する
PMA_PORT=9831
.envの記載ができました。
ただ、このままでは.envがgit管理されてしまいソースが上がってしまうので、git管理から外します。
※ついでにdockerを立ち上げるにもphpmyadminのsessionのファイルができるのでそちらも外しておきます。
.env
docker/phpmyadmin/sessions
【docker×cakePHP4】コンテナを立ち上げる
dockerファイルの記載ができたので、dockerコンテナを立ち上げていきます。
まずは、そもそもdocker-compose.ymlをもとにコンテナをビルドする必要があります。
cakephp4_tests % docker-compose up -d
...
Creating cakephp4_tests_db_1 ... done
Creating cakephp4_tests_php_1 ... done
Creating cakephp4_tests_phpmyadmin_1 ... done
上記のように立ち上がりました。
dockerDesktopも確認すると、こちらでも問題なく立ち上がっています。
現段階では、http://localhost:9831にアクセスすると、phpmyadminにログインできることが確認できます。
【docker×cakePHP4】cakePHP4をインストールする
cakePHP4のインストールをしていきます。
そのために、PHPコンテナに入り、そこでcakePHP4のインストールを実行しましょう。
// コンテナの情報を見る
cakephp4_tests % docker ps
// CONTAINERIDやIMAGEやNAMEなどのコンテナ情報が出てきくるので、
// コンテナにはdocker exec -it CONTAINERIDまたはコンテナ名 bashで入れる
cakephp4_tests % docker exec -it cakephp4_tests_php_1 bash
:/var/www/html#
// var/wwwに一つ上の階層にするのは後で説明します。
:/var/www/html# cd ../
root@95f71b8688e6:/var/www#
コンテナにログインしたことで、自動的に空のhtmlファイルが作成されていると思います。
├── docker
│ ├── mysql
│ │ └── my.cnf
│ ├── php
│ │ └── Dockerfile
│ └── phpmyadmin
│ └── sessions
├──html
├──.env
├──.gitignore
└── docker-compose.yml
/var/wwwでcakephp4のインストールを実行します。cakephp/app:4.*の後にhtmlと名前を指定することで、先ほど自動的に作られたhtml配下にcakePHP4のファイルたちがインストールされます。
※cakePHP4のインストールは5〜10分ぐらいかかります。
:/var/www# composer create-project --prefer-dist cakephp/app:4.* html
...(途中で以下のようにパーミッションを聞かれるので、Yにしてenterボタン)
Set Folder Permissions ? (Default to Y) [Y,n]? Y
...
Updated Security.salt value in config/app_local.php
/var/www#
無事にインストールができると上記のようになります。
html配下にcakePHP4のソースたちが入ってきます。
【docker×cakePHP4】cakePHP4の設定
インストールもできたので、初期画面の表示もできるようになります。
http://localhost:9811にアクセスすると、cakePHP4の初期画面が表示されます。
次に、cakePHP4の初期設定、DB接続、マイグレーションでテーブル作成までしていきます。
cakePHP4の初期設定
初期設定といっても、タイムゾーンの変更ぐらいです。
'App' => [
'namespace' => 'App',
'encoding' => env('APP_ENCODING', 'UTF-8'),
'defaultLocale' => env('APP_DEFAULT_LOCALE', 'ja_JP'),
'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'Asia/Tokyo'),
デフォルトではLocale(場所)とTimezone(時間)がアメリカになっているので、日本に変更しました。
cakePHP4のDB接続
http://localhost:9811にアクセスし、cakePHP4の初期画面の下の方にデータベースとの接続情報があります。
現在は以下のように何も設定していないので、not able to connectとなっており、接続できていません。
DB接続するには、app_local.phpを編集します。
'Datasources' => [
'default' => [
'host' => 'db',
/*
* CakePHP will use the default DB port based on the driver selected
* MySQL on MAMP uses port 8889, MAMP users will want to uncomment
* the following line and set the port accordingly
*/
//'port' => 'non_standard_port_number',
'username' => '.envに書いたユーザー名',
'password' => '.envに書いたパスワード',
'database' => 'cakephp4_tests',
DB接続できました。
cakePHP4でマイグレーションを作成し、テーブルを試しに作る
最後にマイグレーションファイルを作って、テーブルができるか確認します。
cakePHP4では、マイグレーションやモデル、コントローラーの作成は、bin/cakeコマンドが使えるのでこちらを活用しましょう。
bin/cakeコマンドが実行できるのは、PHPコンテナのcakePHP4がインストールされている箇所です。
※/var/www/htmlになります。
コンテナの入り方は、すでに先ほど解説済みなので、そちらを参考にしてください。
// ここでbin/cakeコマンドが打てる
/var/www/html#
マイグレーションファイルを作成します。
root@95f71b8688e6:/var/www/html# bin/cake bake migration CreateUsers
config > Migrations配下にマイグレーションファイルが作成されます。
<?php
declare(strict_types=1);
use Migrations\AbstractMigration;
class CreateUsers extends AbstractMigration
{
/**
* Change Method.
*
* More information on this method is available here:
* https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method
* @return void
*/
public function change()
{
$table = $this->table('users');
$table->addColumn('name', 'string', [
'default' => null,
'limit' => 255,
'null' => true,
]);
$table->create();
}
}
ファイルの編集ができたので、実行します。
/var/www/html# bin/cake migrations migrate
using migration paths
- /var/www/html/config/Migrations
using seed paths
- /var/www/html/config/Seeds
using environment default
using adapter mysql
using database cakephp4_tests
ordering by creation time
== 20220305034822 CreateUsers: migrating
== 20220305034822 CreateUsers: migrated 0.1288s
All Done. Took 0.1981s
Dumps the current schema of the database to be used while baking a diff
using migration paths
- /var/www/html/config/Migrations
using seed paths
- /var/www/html/config/Seeds
Writing dump file `/var/www/html/config/Migrations/schema-dump-default.lock`...
Dump file `/var/www/html/config/Migrations/schema-dump-default.lock` was successfully written
実行が成功しました。
phpmyadminに接続(私の環境では、localhost:9831)し、usersテーブルが作成できているか確認します。
無事にテーブルも作成できていることが確認できました。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
コメント