読者です 読者をやめる 読者になる 読者になる

座敷牢日誌

都落ちした元SEがソフトウェアやネット関連のことを書いています

Docker Compose で CakePHP の開発環境を作る

Docker Compose のドキュメントに Django, Rails, Wordpress の開発環境にDocker Compose を利用する例が載っています.

PHPのWebアプリケーションフレームワークCakePHPにどう適用するのか試してみました.

結論からいうと, ちょっと手直しすると, 他のフレームワークへの転用も簡単そうです.

アプリケーションとフォルダの構成

OSはUbuntu, データベースにMySQL, デバッグ用のWebサーバにはPHPのビルトインサーバを使う構成としています.

以下で述べる Dockerfile と docker-compose.yml は,同じフォルダ cakephp-app のなかに置いてあるものとします.

Dockerfile

Dockerfileの記述例を示します.

FROM ubuntu
RUN apt-get update \
&&  apt-get install -y \
        composer \
        curl \
        php \
        php-intl \
        php-mbstring \
        php-mysql \
        unzip \
        zip
RUN mkdir /code
WORKDIR /code
ADD . /code/

ベースイメージにはUbuntuを選択しています.

FROM ubuntu

ベースイメージを指定する FROM にはタグを指定することができて, 未指定なら :latest が付与され, 基本的にDocker Hubに登録されているイメージの最新版が適用されます.

開発環境を作るにあたって全般的に言えることですが, バージョン指定したほうがいいかもしれません.

パッケージのデータベースを更新し, CakePHPを使うために必要なパッケージをインストールします.

RUN apt-get update \
&&  apt-get install -y \
        composer \
        curl \
        php \
        php-intl \
        php-mbstring \
        php-mysql \
        unzip \
        zip

CakePHPのソース等を置くフォルダを作ります. このへんは, Docker Compose のドキュメントのDjangoの例に倣いました.

RUN mkdir /code
WORKDIR /code
ADD . /code/

docker-compose.yml

docker-compose.yml の記述例を示します.

version: '2'
services:
        db:
                image: mysql
                environment:
                        - MYSQL_ROOT_PASSWORD=secret
                        - MYSQL_DATABASE=cakephp
                        - MYSQL_USER=cakephp
                        - MYSQL_PASSWORD=secret
        web:
                build: .
                command: app/bin/cake server -H 0.0.0.0
                volumes:
                        - .:/code
                ports:
                        - "8765:8765"
                depends_on:
                        - db

MySQLイメージへの設定の指定を環境変数にて行っています. 指定可能な変数に何があるかは, MySQLイメージのドキュメント を参照してください.

ここにある db は識別子で, Webサーバからサーバ名として認識します.

        db:
                image: mysql
                environment:
                        - MYSQL_ROOT_PASSWORD=secret
                        - MYSQL_DATABASE=cakephp
                        - MYSQL_USER=cakephp
                        - MYSQL_PASSWORD=secret

Webサーバのコンテナを記述しています. これも公式ドキュメントのDjangoの例にだいたい倣っています.

        web:
                build: .
                command: app/bin/cake server -H 0.0.0.0
                volumes:
                        - .:/code
                ports:
                        - "8765:8765"
                depends_on:
                        - db

build: . でカレントディレクトリにあるDockerfileをビルドします.

command: app/bin/cake server -H 0.0.0.0PHPのビルトインサーバによるCakePHPプロジェクトのデバッグサーバを起動します. app は後述するCakePHPプロジェクトを作成するときに指定するフォルダ名です.

                volumes:
                        - .:/code

これでカレントディレクトリの内容をコンテナのディレクト/code に共有させています.

ports: による指定でポート転送し, 実際のブラウザを使ったデバッグには, Dockerホストのブラウザから, http://127.0.0.1:8765 へアクセスして行うことができるようになります. コンソールでの作業の効率化を考えたら, DBサーバ側のポートも転送しておいたほうがいいかもしれないです.

depents_on: は依存関係の指定です.

プロジェクトを作成する

Composer を使って, CakePHPのプロジェクトを作成します.

次のコマンドを実行することで, 現在のディレクトリにCakePHPプロジェクトが作られます.

# docker-compose run web composer create-project --prefer-dist -n cakephp/app app

実行後に app ディレクトリが作られていることを確認します.

このフォルダの所有者が root になっていて使いづらいので, chown -R username:groupname app で, 所有をユーザへ変更しておいたほうがいいです.

デバッグ用Webサーバーを起動

次のコマンドでデバッグ用のWebサーバーを起動します.

# docker-compose up

停止する場合は, Ctrl+Cで割り込めばOK.

一度 up で立ち上げたあとは, docker-compose start/stop コマンドで開始/停止できます.

デバッグサーバが立ち上がったら, ブラウザから http://127.0.0.1:8765 へアクセスして, CakePHPのウェルカムメッセージが出ている画面を確認します.

データベース設定を作成

データベース設定を行っていない現時点では, Databaseのセクションに次のようなエラーメッセージが出ているはずです.

CakePHP is NOT able to connect to the database.

Connection to database could not be established: SQLSTATE[HY000] [2002] No such file or directory

app/config/app.phpDatasources あたりを次のように修正して, データベース接続のエラーは解消できます.

    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'db', # DBサーバ名
            /**
             * CakePHP will use the default DB port based on the driver selected
             * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
             * the following line and set the port accordingly
             */
            //'port' => 'non_standard_port_number',
            'username' => 'cakephp', # DBユーザ名
            'password' => 'secret', # DBユーザ パスワード
            'database' => 'cakephp', #データベース名
            'encoding' => 'utf8',
            'timezone' => 'Asia/Tokyo', # タイムゾーン
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false,

修正したら, http://127.0.0.1:8765 を開き直して, エラーが無くなっていることを確認してください.

まとめ

ここまでの手順で作ったコンテナで, CakePHPのブログチュートリアルまで行えることを確認できました.

複数のメンバーで作業が必要な場合は, ここまでで作成した Dockerfile, docker-compose.yml, app ディレクトリをシェアすれば, 概ね同じ環境で作業できると思います.

補足

ちょっと調べきれてませんが, 有用と思われるネタです.

cakeコマンドの実行方法

コマンドでCakePHPプロジェクトを操作する cake コマンドは, docker-compose run web app/bin/cake で実行できます. docker-compose.yml があるディレクトリをカレントディレクトリにして実行する必要があります.

すべてのサブコマンドがちゃんと使えるか確認できていません.

(ちょっと追記) 動作確認できたcakeコマンド

実際に動かしてみて, 期待通りに動作した cake コマンドを挙げておきます. 何でも動くんじゃないかな.

  • cake bake all
  • cake bake model
  • cake bake controller
  • cake bake template
  • cake bake migration
  • cake bake seed
  • cake bake plugin
  • cake migrations migrate
  • cake migrations seed

docker-compose run するときにコンテナが作られる

プロジェクト作成時にも使う docker-compose run コマンドを実行すると, そのたびにコンテナが作られてしまいます.

--rm オプションをつけておくと, コンテナが作られなくなります.

実行例は次のようになります.

# docker-compose run --rm web app/bin/cake
広告を非表示にする