10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

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

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

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

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の設定を記述します。

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

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

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

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
FROM nginx:1.25-alpine

ENV TZ Asia/Tokyo

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

WORKDIR /app

default.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の修正

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

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
FROM mysql:8.3

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

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

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

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

おわりに

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

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

次の記事

10
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?