はじめに
こんにちは、エンジニアのkeitaMaxです。
CakePHPの動作環境をDockerで作りたいと思っています。
以前Laravelで環境構築したのとほぼ同じように進めてみようと思います。
PHPのコンテナを起動する
まず作業用のフォルダを作成します。名前はcake-example-appにしました。
つぎに、Dockerの設定をしていきます。
cake-example-appフォルダ直下にdocker-compose.ymlファイルを置きます。
そしてdockerフォルダを用意し、その中にappフォルダ、その中にDockerfileファイルとphp.iniファイルを置きます。
現在のフォルダ構成は以下のようになります。
├ docker
│ └ app
│ ├ Dockerfile
│ └ php.ini
│
└ docker-compose.yml
Dockerfile
appフォルダの中のDockerfileにはPHPの設定を記述します。
以下のように記述しました。
FROM php:8.3-fpm
ENV TZ Asia/Tokyo
RUN apt-get update && \
apt-get install -y git unzip libzip-dev libicu-dev libonig-dev && \
docker-php-ext-install intl pdo_mysql zip bcmath
COPY ./php.ini /usr/local/etc/php/php.ini
COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer
WORKDIR /app
php.ini
zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64M
post_max_size = 128M
memory_limit = 256M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /var/log/php/php-error.log
default_charset = UTF-8
[Date]
date.timezone = Asia/Tokyo
[mysqlnd]
mysqlnd.collect_memory_statistics = on
[Assertion]
zend.assertions = 1
[mbstring]
mbstring.language = Japanese
docker-compose.yml
version: "3.9"
services:
app:
build:
context: ./docker/app
dockerfile: Dockerfile
volumes:
- ./src/:/app
PHPコンテナを起動
各ファイルができたので、以下のコマンドでDockerを起動します。
docker compose up -d --build
以下のように出てきたら成功です。
[+] Running 1/2
⠙ Network cake-example-app_default Created 0.2s
✔ Container cake-example-app-app-1 Started
ちゃんと起動できているか 以下のコマンドを叩いてみます。
docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
cake-example-app-app-1 cake-example-app-app "docker-php-entrypoi…" app 31 seconds ago Up 30 seconds 9000/tcp
このようにake-example-app-app
が無事起動できていることが確認できました。
Nginxのコンテナを起動する
Nginxコンテナを起動させるために、フォルダ構成を以下のように修正しました。
├ docker
│ ├ app
│ │ ├ Dockerfile
│ │ └ php.ini
│ │
│ └ nginx
│ ├ Dockerfile
│ └ default.conf
│
└ docker-compose.yml
Dockerfile
FROM nginx:1.25-alpine
ENV TZ Asia/Tokyo
COPY ./default.conf /etc/nginx/conf.d/default.conf
WORKDIR /app
default.conf
server {
listen 80;
server_name example.com;
root /app/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
docker-compose.ymlの修正
以下のように修正しました。
version: "3.9"
services:
app:
build:
context: ./docker/app
dockerfile: Dockerfile
volumes:
- ./src/:/app
# ------以下を追記------
nginx:
build:
context: ./docker/nginx
dockerfile: Dockerfile
ports:
- 8081:80
depends_on:
- app
volumes:
- ./src/:/app
Nginxコンテナを起動
以下のコマンドでNginxコンテナを起動します。
docker compose up -d --build
以下のようになれば成功です。
[+] Running 1/2
✔ Container cake-example-app-app-1 Started 0.0s
⠹ Container cake-example-app-nginx-1 Starting
MySQLのコンテナを起動する
MySQLのコンテナを起動するために、以下のように修正しました。
├ docker
│ ├ app
│ │ ├ Dockerfile
│ │ └ php.ini
│ │
│ └ nginx
│ │ ├ Dockerfile
│ │ └ default.conf
│ │
│ └ database
│ ├ Dockerfile
│ └ my.conf
│
└ docker-compose.yml
Dockerfile
FROM mysql:8.3
COPY ./my.conf /etc/my.conf
my.conf
[mysqld]
# character
character_set_server = utf8mb4
collation_server = utf8mb4_0900_ai_ci
# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM
# Error Log
log-error = mysql-error.log
# Slow Query Log
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = 0
# General Log
general_log = 1
general_log_file = mysql-general.log
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
docker-compose.ymlの修正
以下のようにdocker-compose.ymlを修正しました。
version: "3.9"
services:
app:
build:
context: ./docker/app
dockerfile: Dockerfile
volumes:
- ./src/:/app
nginx:
build:
context: ./docker/nginx
dockerfile: Dockerfile
ports:
- 8081:80
depends_on:
- app
volumes:
- ./src/:/app
# ------以下を追記------
database:
build:
context: ./docker/database
dockerfile: Dockerfile
ports:
- 3306:3306
environment:
MYSQL_DATABASE: database
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: password
TZ: "Asia/Tokyo"
volumes:
- mysql-volume:/var/lib/mysql
volumes:
mysql-volume:
MySQLコンテナを起動
以下のコマンドを実行してMySQLコンテナを起動します。
docker compose up -d --build
成功すると以下のように表示されます。
[+] Running 2/4
⠸ Volume "cake-example-app_mysql-volume" Created 0.3s
✔ Container cake-example-app-database-1 Started 0.3s
✔ Container cake-example-app-app-1 Running 0.0s
⠙ Container cake-example-app-nginx-1 Starting
PSコマンドで立ち上がっているか確認します。
cake-example-app % docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
cake-example-app-app-1 cake-example-app-app "docker-php-entrypoi…" app 16 minutes ago Up 9 minutes 9000/tcp
cake-example-app-database-1 cake-example-app-database "docker-entrypoint.s…" database About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, 33060/tcp
cake-example-app-web-1 cake-example-app-web "/docker-entrypoint.…" web 11 minutes ago Up 10 minutes 0.0.0.0:8081->80/tcp
無事全て起動することができました。
CakePHPのインストール
最後にCakePHPをインストールして初期画面をブラウザで見れるようにします。
下記コマンドでappのコンテナの中に入ります。
docker compose exec app bash
入ることができたら、以下のコマンドでCakePHPを入れましょう。
composer create-project --prefer-dist cakephp/app:~5.0 .
インストールが終わって以下のURLにブラウザでアクセスするとCakePHPの初期画面が見えていると思います。
http://localhost:8081/
これで'CakePHP'の環境構築が完了しました!
おわりに
この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。
最後まで読んでいただきありがとうございました!
次の記事