プロダクトを育てる役目を担う仕事をしていて、気軽にPowerCMS Xを操作できる環境が欲しい時があります。例えば画像の管理にデータベースのBLOBを使うのではなくファイル出力する設定のようなインパクトの大きい事を試したい時です。そこでDockerを利用してPowerCMS X環境を構築してみました。
構築と書きましたが実はLAMP環境は既にsprintcube/docker-compose-lampで「LAMP stack built with Docker Compose」が公開されており、ほんの少し手を加えるだけでPowerCMS Xを動作させる環境が用意できました。MySQLのデータ等はホストのdata
ディレクトリに、コンテンツはホストのwww
ディレクトリに保存されるので、コンテナを停止してもデータは維持されますし、gitで環境を管理したり他のマシンにも簡単に移したりすることができます。社内でハンズオン形式の勉強会を開催する際も手軽に環境が用意できますね。
事前準備
- DockerとDocker Composeをインストールします
- sprintcube/docker-compose-lampをcloneします
ホストとコンテナのディレクトリ対応表
持田さん(@motchie)にアドバイスをいただき追記しました。sprintcube/docker-compose-lampのマッピング設定は以下のようになっています。(ホストの各ディレクトリはプロジェクトのディレクトリ内に存在します。)
ホスト | コンテナ |
---|---|
www | /var/www/html |
logs/apache2 | /var/log/apache2 |
config/php/php.ini | /usr/local/etc/php/php.ini |
data/mysql | /var/lib/mysql |
logs/mysql | /var/log/mysql |
アプリとコンテンツを別けるための設定
アプリ(PowerCMS X)を保存するディレクトリとコンテンツディレクトリ(ホストのwww
)を分けたいので設定ファイルを編集しました。
bin/webserver/Dockerfile
末尾に以下を追記します。
# PowerCMS X
RUN mkdir /var/www/app
docker-compose.yml
volumes
欄にPowerCMS Xのディレクトリを追記します。ホストのapp
ディレクトリがコンテナの/var/www/app
にマウントされるようになります。
services:
webserver:
build:
context: ./bin/webserver
container_name: '7.2.x-webserver'
restart: 'always'
ports:
- "${HOST_MACHINE_UNSECURE_HOST_PORT}:80"
- "${HOST_MACHINE_SECURE_HOST_PORT}:443"
links:
- mysql
volumes:
- ${DOCUMENT_ROOT-./www}:/var/www/html:delegated
- ${PHP_INI-./config/php/php.ini}:/usr/local/etc/php/php.ini
- ${VHOSTS_DIR-./config/vhosts}:/etc/apache2/sites-enabled
- ${LOG_DIR-./logs/apache2}:/var/log/apache2:delegated
- ${PCMSX_ROOT-./app}:/var/www/app:cached
.env
PowerCMS Xを設置するホストのディレクトリ名を指定します。app
以外にしたい場合はここを変更します。
PCMSX_ROOT=./app
config/vhosts/default.conf
Alias
を用いて/app
へアクセスがあった場合に参照すべきディレクトリを指定します。PowerCMS Xのディレクトリを/var/www/app
にマウントするので下記のように記述します。
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot "/var/www/html"
ServerName localhost
Alias /app /var/www/app
<Directory "/var/www/html">
AllowOverride all
</Directory>
</VirtualHost>
app/db-config.phpの設定
PowerCMS Xのdb-config.phpにデータベースの設定を記述しますが、ホスト名はMySQLのコンテナ名を指定することにより、コンテナ間通信で上手く動作するようになります。
define( 'PADO_DB_HOST', 'mysql' );
コンテナの起動
コンテナの起動コマンドはdocker-compose up -d
です。一度イメージがビルドされると次回からは数秒で起動するようになるのでとても快適です。