CakePHP2をDockerで環境構築する
calendar_today
2022-12-04
insights
views: 1018
thumbnail images

はじめに

業務で必要なプロジェクトを自分のPCに構築する。
SQLデータもプロジェクトファイルも大きなもので、構築にそこそこ苦労したので備忘録として残す。

環境

  • Windows 11
    • WSL2
  • Docker Desktop
    • PHP 5.6
    • MySQL 5.7
    • Apache

忙しい人のためのCakePHP環境構築手順

// 記述中...

詳細な手順

前提

Docker DesktopとWSL2をインストールしておこう。
こことかを参考に
https://www.kagoya.jp/howto/cloud/container/wsl2_docker/

フォルダの配置

基本的にフォルダはWSL2を導入した際に入れたUbuntuに入れる。
WSL2で立ち上げたUbuntuと、WSL2で立ち上げたdockerの間でやり取りする形となる。

最終的にはこんな感じ

{プロジェクト名}
├ backup/
│   └ {任意のsqlファイル}.sql
├ docker/
│   ├ apache/
│   │   ├ Dockerfile
│   │   └ site.conf
│   └ mysql/
│       ├ Dockerfile
│       ├ mysqld_charset.cnf
│       └ my.cnf
├ app/ // ここにproject fileが入る
└ docker-compose.yml

プロジェクトファイルを配置

今回はgitでcloneするのを想定する。

{プロジェクト名}$ git clone https://~~~~~~.git app

dockerコンテナの作成

ディレクトリ作成

まずはディレクトリ作成

{プロジェクト名}$ mkdir docker
{プロジェクト名}$ mkdir docker/apache
{プロジェクト名}$ mkdir docker/mysql

ファイル作成

apache

apache関連の設定

Dockerfile

FROM php:5.6-apache

RUN apt-get update -yqq \
  && apt-get install -yqq --no-install-recommends \
  git \
  zip \
  unzip \
  imagemagick \
  libmagickwand-dev \
  zlib1g-dev \
  libpng-dev \
  libwebp-dev \
  libzip-dev \
  webp \
  && pecl install imagick \
  && docker-php-ext-enable imagick \
  && docker-php-ext-configure gd --with-webp \
  && rm -rf /var/lib/apt/lists

# Enable PHP extensions
RUN docker-php-ext-install pdo_mysql mysqli -j$(nproc) gd intl mbstring zip

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer

# Add cake and composer command to system path
ENV PATH="${PATH}:/var/www/html/app/lib/Cake/Console"
ENV PATH="${PATH}:/var/www/html/app/app/Vendor/bin"

# COPY apache site.conf file
COPY ./docker/apache/site.conf /etc/apache2/sites-available/000-default.conf

# Copy the source code into /var/www/html/ inside the image
COPY . .

# Set default working directory
WORKDIR ./app

# Create tmp directory and make it writable by the web server
RUN mkdir -p \
  app/tmp/cache/models \
  app/tmp/cache/persistent \
  && chown -R :www-data \
  app/tmp \
  && chmod -R 770 \
  app/tmp

# Enable Apache modules and restart
RUN a2enmod rewrite \
  && service apache2 restart

EXPOSE 80

site.conf

<VirtualHost *:80>
	ServerName localhost:80
    DocumentRoot /var/www/html/app

    <Directory /var/www/html/app>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

apache

apache関連の設定

Dockerfile

FROM mysql:5.7-debian

RUN apt-get update
RUN apt-get -y install locales-all

ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

COPY ./docker/mysql/mysqld_charset.cnf /etc/mysql/conf.d/mysqld_charset.cnf
COPY ./docker/mysql/my.cnf /etc/mysql/conf.d/my.cnf

my.cnf

[mysqld]
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix
innodb_strict_mode = 0

docker

docker-compose.yml

version: "3"

services:
  app:
    build:
      context: .
      dockerfile: docker/apache/Dockerfile
    volumes:
      - .:/var/www/html
    ports:
      - 8000:80
    environment:
      TZ: "Asia/Tokyo"
    depends_on:
      - db

  db:
    build:
      context: .
      dockerfile: docker/mysql/Dockerfile
    volumes:
      - db-data:/var/lib/mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: database_db
      MYSQL_ROOT_PASSWORD: password
      TZ: "Asia/Tokyo"

volumes:
  db-data:
    external: false

ビルド

以上のファイルが揃ったところで、コンテナのビルドを行う。

{プロジェクト名}$ docker-compose up -d --build

SQLファイル移動

必要な場合は、SQLファイルをコンテナに移動。
今回は適当に/tmpに置いておく。

{プロジェクト名}$ docker cp ./backup {コンテナ名}:/tmp

これで、{project}-app{project}-db とかいうコンテナが出来ると思う。

コンテナ内での作業

dbコンテナ

dbコンテナに入る。
先程のように、1, 2どちらかのコマンドで入る

1: {プロジェクト名}$ docker container exec -it {コンテナ名} bash
2: {プロジェクト名}$ docker-compose exec {サービス名} bash

データベースの作成

/tmpに移動してすべてのsqlを実行する。
パスワードを聞かれるので入力すると、sqlのファイルの量によっては固まったように見えると思う。

/tmp$ cat *.sql | mysql -u root -p database_db
password:
ERROR 1273 (HY000) at line 13089: Unknown collation: 'utf8mb4_0900_ai_ci'

こちらの環境では、ERROR 1273 (HY000) at line 13089: Unknown collation: 'utf8mb4_0900_ai_ci'というエラーが発生した。

この場合は、各sqlファイルの中でcollationにutf8mb4_0900_ai_ciが指定されているのが原因。
ここをutf8mb4_general_ciに変更し、正常に実行されたsqlファイルを移動し、再度上記のコマンドを実行しよう。

appコンテナ

appコンテナに入る。
コンテナ名で入るには

{プロジェクト名}$ docker container exec -it {コンテナ名} bash

サービス名で入るには

{プロジェクト名}$ docker-compose exec {サービス名} bash

tmpの権限設定

apacheがアクセスできるよう権限変更

/var/www/html/app$ chmod -R 775 app/tmp

cakephpの各種設定

.htaccess

自分の場合、.htaccessにSSLの設定が入っていたせいで500エラーに小一時間悩まされていた。localではちゃんと削除しよう。
またAllowed memory size of *** bytes exhaustedというエラーが発生したため、{project}/app/.htaccessに設定を追加。
自分の環境は256Mでも512Mでもダメだった。メモリの多いPCを使おう。

php_value memory_limit 1024M
database.php

hostだけ、コンテナ名を指定するので注意。

class DATABASE_CONFIG {

    public $default = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'app-db', // コンテナ名が入る 
        'login' => 'root',
        'password' => 'root',
        'database' => 'database_db',
        'prefix' => '',
        'encoding' => 'utf8mb4',
    );
その他

必要に応じて、core.phpdatabase.phpの編集、tmp/cacheのキャッシュファイルクリアをしよう。

calendar_today
2022-12-04
insights
views: 1018