はじめに
業務で必要なプロジェクトを自分の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.php
やdatabase.php
の編集、tmp/cache
のキャッシュファイルクリアをしよう。