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.0 でPHPのビルトインサーバによる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.php の Datasources あたりを次のように修正して,
データベース接続のエラーは解消できます.
'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 があるディレクトリをカレントディレクトリにして実行する必要があります.
すべてのサブコマンドがちゃんと使えるか確認できていません.
docker-compose run するときにコンテナが作られる
プロジェクト作成時にも使う docker-compose run コマンドを実行すると,
そのたびにコンテナが作られてしまいます.
--rm オプションをつけておくと, コンテナが作られなくなります.
実行例は次のようになります.
# docker-compose run --rm web app/bin/cake