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 clean
と rm -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に環境変数を渡したい場合は app
の environment
に追記すれば良し。
今回はローカル開発ということで、DBパスワードも適当にしているが、公開する場合等は注意すること。
nginxの待ち受けるポートは 8001
にしているが、ここは自由に変えてまったく問題がない
続いて nginx
と mysql
用のコンフィグファイルを配置する。
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
にアクセスして下の画像のように各種状態が緑になっていたら問題なし。