既存の CakePHP プロジェクトを Docker で動かす事例

既存の CakePHP プロジェクトを Docker で動かす事例

Docker

Docker は開発環境を構築するのにとても便利で、新しいプロジェクトを立ち上げる時はなるべく Docker で環境構築しています。それだけでは物足りず、最近は過去の開発環境も Docker への移行を進めています。

開発環境

今回、 次のようなサーバを Docker で用意したので、紹介させて頂きます。
  • Ubuntu20.04
  • Apache2
  • PHP7.2
  • CakePHP 3.8
  • MySQL (RDSを直接利用のため Docker には含まない)
また今回は既存のプロジェクトに Docker を後乗せするため、プロジェクト内に docker フォルダを作成し親フォルダを docker で作成した OS 内にマウントしています。docker コマンドだけでも実行は可能ですが、オプションの入力が面倒になるため、docker-composer を利用しています。

そのため今回のプロジェクトフォルダは次のようになっています。


Docker の準備・起動

それでは Docker に必要なファイルを確認しましょう。 docker フォルダの内部はシンプルです。


web フォルダは CakePHP を動作させるための Web サーバに必要なファイルが格納されています。また docker composer を利用してサーバを起動するので、 docker-composer.yml ファイルがあります。

docker-composer.yml の内容は次のようになっています。

docker-composer.yml

version: '3'
services:
  web:
    image: ubuntu:20.04
    container_name: web
    build: ./web
    ports: 
      - 8080:80
    volumes:
      - ../:/var/www/html/***
    command: >
      sh -c "
      composer install --no-interaction &&
      service apache2 restart &&
      tail -f /dev/null
      "
    tty: true
重要なのは、次の3点です。

1. build に web フォルダを指定します。
 先述の通り、web フォルダにはサーバを構築するためのファイル群が揃っています。

2. volume にマウントするフォルダとして、本ファイルの親フォルダを指定します。マウントする先は、/var/www/html/*** としています。適宜修正してください。

3. 起動時に composer install を実行し、CakePHP プロジェクトの実行に必要なプラグインをインストールします。その後サーバを再起動し、準備完了です。

それでは web フォルダの中身を確認しましょう。


web フォルダには 3 つのファイルがあります。最も重要なのは Dockerfile です。

Dockerfile

FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo

#リポジトリ追加
RUN apt update \
  && apt -y install software-properties-common \
  && add-apt-repository ppa:ondrej/php

#各種インストール
RUN apt update \
  && apt -y install tzdata apache2 php7.2 php7.2-dev php7.2-xml php7.2-mysql php7.2-intl php7.2-mbstring php7.2-zip php7.2-gd \
  && mkdir -p /var/www/html/***

#設定ファイルコピー
COPY 000-default.conf /etc/apache2/sites-enabled
COPY apache2.conf /etc/apache2

#composerインストール
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
  && php composer-setup.php \
  && php -r "unlink('composer-setup.php');" \
  && mv composer.phar /usr/local/bin/composer \
  && a2enmod rewrite

#Apache起動
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]
特筆すべき内容は次のとおりです。

1. 今回 PHP7.2 を利用するため、リポジトリを追加しています。

2. Apacheの設定のため、ファイルを2つコピーします。

3. CakePHP を利用するため、 composer をインストールします。このタイミングでは compose install できないので、それは docker-compser.yml において処理します。

サーバにコピーする Apache用の設定ファイル2つは次のとおりです。

000-default.conf

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/***
    ServerName ***.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
主に DocumentRoot の設定です。適宜変更してください。

apache2.conf

DefaultRuntimeDir ${APACHE_RUN_DIR}

PidFile ${APACHE_PID_FILE}

Timeout 300

KeepAlive On

MaxKeepAliveRequests 100

KeepAliveTimeout 5

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

HostnameLookups Off

ErrorLog ${APACHE_LOG_DIR}/error.log

LogLevel warn

IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

Include ports.conf

<Directory />
        Options FollowSymLinks
        AllowOverride All
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

AccessFileName .htaccess

<FilesMatch "^\.ht">
        Require all denied
</FilesMatch>

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

IncludeOptional conf-enabled/*.conf

IncludeOptional sites-enabled/*.conf
サーバの設定ファイルでは、主に /var/www の設定です。

上記でdocker-compose を起動しましょう。

docker-compose build
docker-compose up -d

これでCakePHP のプロジェクトを起動することができます。

まとめ

プロジェクトにより変更しなければいけない設定があると思いますが、一度設定すれば今後は苦労しないので非常に便利です。以前は Virtual PC を使っており不安定になることがありましたが、 Docker に移行した今では安定しています。ぜひ Docker を活用してください。
» エンジニア登録はこちら