CakePHP3をDocker上で簡単に動くようにする

概要

CakePHPを使って何かしらのウェブサービスを作ろうかと思った時、最初の環境構築が面倒。 ローカル環境でMySQLを建てるのも面倒くさいし、環境が汚れるのも嫌だし、最近だとやっぱりDockerを使って開発したい。 この記事では、CakePHP3のプロジェクトを作成してからDocker上でアプリを表示できるまでの手順を記す。

CakePHPプロジェクトの作成

まずはCakePHPプロジェクトの作成を行う。Dockerコンテナの中にcomposerを入れてそこでプロジェクトを作成する方法もあるが、Macにおいてコンテナ内とのファイルの共有処理はとても遅いため、今回はMacにcomposerを入れて、それを使ってプロジェクトを作成することとした。

composer create-project --prefer-dist cakephp/app app

Docker環境の準備

これからの作業は全てプロジェクトのディレクトリで行う。

mkdir app

まず、Dockerfileを作成する

cd app
vim Dockerfile

中身はこんな感じ。

FROM php:7.3.11-fpm

# Install some libraries and extensions
RUN apt-get update && apt-get install -y \
    libicu-dev \
    unzip \
    git \
    curl \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
RUN docker-php-ext-install intl pdo pdo_mysql

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

RUN mkdir -p /app
WORKDIR /app

ベースとしているのは php:7.3.11-fpm イメージ。別のバージョンが使いたければ変えれば良し。 その後CakePHPを動かすために必要なPHPの拡張をインストールしている。 このイメージでは docker-php-ext-install を使うことで簡単に導入可能である。 その前段でインストールに必要なパッケージを apt で入れているが、同じ RUN 内で apt-get cleanrm -rf /var/lib/apt/lists/* することでDockerイメージを小さくしている。

続いて docker-compose.yml を準備する

vim docker-compose.yml

内容は以下の通り

version: "3"
services:
  app:
    build: .
    depends_on:
      - mysql
    volumes:
      - ./:/app
    environment:
      DEBUG: "true"
      APP_DEFAULT_LOCALE: ja_JP
      APP_DEFAULT_TIMEZONE: Asia/Tokyo
      DATABASE_URL: mysql://root:root@mysql/database?encoding=utf8
  web:
    image: nginx
    depends_on:
      - app
    ports:
      - 8001:80
    volumes:
      - ./:/app
      - ./.docker/nginx.conf:/etc/nginx/nginx.conf
  mysql:
    image: mysql:8.0.18
    volumes:
      - ./.docker/mysqld_add.cnf:/etc/mysql/conf.d/mysqld_add.cnf
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database

CakePHP環境変数を渡したい場合は appenvironment に追記すれば良し。 今回はローカル開発ということで、DBパスワードも適当にしているが、公開する場合等は注意すること。 nginxの待ち受けるポートは 8001 にしているが、ここは自由に変えてまったく問題がない

続いて nginxmysql 用のコンフィグファイルを配置する。 Dockerで使うファイルを置くディレクトリとして .docker フォルダを作成し、その中に置くこととする。

mkdir .docker
vim .docker/mysqld_add.cnf
vim .docker/nginx.conf

.docker/myqsld_add.cnf には下記のように書いておく。 MySQL8からログイン方法のデフォルト値が変わった関係で、この設定を入れておかないとPHP側から接続することができないようだ。これを mysqld コンテナの /etc/mysql/conf.d/ 以下にマウントすることで反映させている。

[mysqld]
default_authentication_plugin=mysql_native_password

続いて .docker/nginx.conf の設定をする。

user  nginx;
worker_processes auto;

error_log   /var/log/nginx/error.log warn;
pid         /var/run/nginx.pid;

worker_rlimit_nofile 150000;

events {
    worker_connections  65535;
    multi_accept on;
    use epoll;
}

http {
    server_tokens off;
    sendfile off;
    etag off;
    if_modified_since off;

    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 10;

    include /etc/nginx/mime.types;
    default_type text/html;
    charset UTF-8;

    access_log  /var/log/nginx/access.log;
    types_hash_max_size 2048;
    server_names_hash_bucket_size 64;

    gzip on;
    gzip_http_version 1.0;
    gzip_disable "msie6";
    gzip_proxied any;
    gzip_min_length 1024;
    gzip_comp_level 6;
    gzip_types      text/plain text/css application/javascript application/x-javascript
                    text/xml application/atom+xml application/xml+rss application/xml
                    application/json text/json text/javascript+json text/javascript ;

    server {
        listen 80 default;
        root /app/webroot;

        location / {
            try_files $uri /index.php?$args;
        }

        location ~ \.php$ {
            try_files $uri =404;
            include /etc/nginx/fastcgi_params;
            fastcgi_pass app:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
}

ここまででDocker周りの準備は完了。 さっそくビルドと起動をしてみる。

docker-compose build
docker-compose up -d

確認

http://localhost:8001 にアクセスして下の画像のように各種状態が緑になっていたら問題なし。

f:id:riosu:20191123130458p:plain