【CakePHP 5】Dockerで環境を作成する

# はじめに

こんにちは、エンジニアのkeitaMaxです。

CakePHPの動作環境をDockerで作りたいと思っています。

以前Laravelで環境構築したのとほぼ同じように進めてみようと思います。

https://qiita.com/keitaMax/items/7bc51212a32a6418aa1c

# PHPのコンテナを起動する

まず作業用のフォルダを作成します。名前はcake-example-appにしました。

つぎに、Dockerの設定をしていきます。

cake-example-appフォルダ直下にdocker-compose.ymlファイルを置きます。

そしてdockerフォルダを用意し、その中にappフォルダ、その中にDockerfileファイルとphp.iniファイルを置きます。

現在のフォルダ構成は以下のようになります。

```:cake-example-app
├ docker
│    └ app
│        ├ Dockerfile
│        └ php.ini
│
└ docker-compose.yml
```

### Dockerfile

appフォルダの中のDockerfileにはPHPの設定を記述します。

以下のように記述しました。

```docker:Dockerfile
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

```ini: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
```yml: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コンテナを起動させるために、フォルダ構成を以下のように修正しました。

```:cake-example-app
├ docker
│    ├ app
│    │   ├ Dockerfile
│    │   └ php.ini
│    │   
│    └ nginx
│        ├ Dockerfile
│        └ default.conf
│
└ docker-compose.yml
```



### Dockerfile

```Dockerfile:Dockerfile
FROM nginx:1.25-alpine

ENV TZ Asia/Tokyo

COPY ./default.conf /etc/nginx/conf.d/default.conf

WORKDIR /app
```

### default.conf
```conf: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の修正

以下のように修正しました。

```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
```

### 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のコンテナを起動するために、以下のように修正しました。

```:cake-example-app
├ docker
│    ├ app
│    │   ├ Dockerfile
│    │   └ php.ini
│    │   
│    └ nginx
│    │   ├ Dockerfile
│    │   └ default.conf
│    │   
│    └ database
│        ├ Dockerfile
│        └ my.conf
│
└ docker-compose.yml

```

### Dockerfile

```Dockerfile:Dockerfile
FROM mysql:8.3

COPY ./my.conf /etc/my.conf
```

### my.conf

```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を修正しました。

```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/
```

![スクリーンショット 2024-06-08 11.48.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/37016e58-ccd4-2581-389a-4e42d26e17bb.png)


これで'CakePHP'の環境構築が完了しました！


# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 次の記事


https://qiita.com/keitaMax/items/77df412e05a537571549