随分前のことですが、ローカルでの開発環境構築でアホみたいに時間をかけてしまったことがありました。
これじゃ何も始まらんとぼやいていたとき先輩が、Dockerだったらこんなことないよね、超便利なんですよ、というお話をしてくださったので気になって調べてみました。
Dockerという言葉を聞いたそのときは何のことやらサッパリでしたが、ローカルでの開発環境の構築や共同編集者さんとの共有を超簡単にしてくれるものみたいでした(もっと色々な機能があるようですし、こんな簡単な言葉で終わらせたら誰かに殴られそうですが…)。

そしてこの度ようやくDockerを使ってCakePHP2の開発環境を作ることが出来たので、忘れないうちにまとめておきます。
DockerとDocker Composeのインストールについては既に多くの方がまとめて下さっておりますので、この記事では割愛します。事前にこの2つを使える状態にしてから記事の内容に臨んで下さい。
なお、この記事は「Setup CakePHP 2.x Application with Docker from Scratch」に掲載されている内容を元に、私にとって都合よくアレンジしたもの加えた内容となっております。

フォルダ・ファイルの保存場所
これから作成するファイルは、以下のような形式になるようにデータを保存していって下さい。

CakePHP
 ├ docker
 │ ├ Dockerfile
 │ └ apache
 │   └ site.conf
 ├ docker-compose.yml
 └ CakePHP2.xのプロジェクトファイルに含まれるファイルたち…

1.CakePHP2.xのプロジェクトファイルを用意する

CakePHP公式GitリポジトリからプロジェクトファイルをDLして任意のフォルダに解凍します。
今回は、このプロジェクトフォルダの名前を「CakePHP」とします。

2.Dockerfileの作成

1で解凍したフォルダの中に「docker」というフォルダを作り、その中に「Dockerfile」を作ります。
Dockerfileは次のように入力します。

FROM php:5.6-apache

RUN apt-get update -yqq \
  && apt-get install -yqq --no-install-recommends \
    git \
    zip \
    unzip \
  && rm -rf /var/lib/apt/lists

# Enable PHP extensions
RUN docker-php-ext-install pdo_mysql mysqli

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer

# Add cake and composer command to system path
ENV PATH="${PATH}:/var/www/html/lib/Cake/Console"
ENV PATH="${PATH}:/var/www/html/app/Vendor/bin"

# COPY apache site.conf file
COPY ./docker/apache/site.conf /etc/apache2/sites-available/000-default.conf

# Copy the source code into /var/www/html/ inside the image
COPY . .

# Set default working directory
WORKDIR ./app

# Create tmp directory and make it writable by the web server
RUN mkdir -p \
    tmp/cache/models \
    tmp/cache/persistent \
  && chown -R :www-data \
    tmp \
  && chmod -R 770 \
    tmp

# Enable Apache modules and restart
RUN a2enmod rewrite \
  && service apache2 restart

EXPOSE 80

3.Apache Site Confの作成

dockerフォルダの中に「apache」というフォルダを作り、「site.conf」を作ります。
site.confには次のように入力します。

<VirtualHost *:80>
    DocumentRoot /var/www/html/app/webroot/

    <Directory /var/www/html/app/webroot/>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

4.docker-compose.ymlの作成

cakephpフォルダの中に「docker-compose.yml」を作ります。
docker-compose.ymlには次のように入力します。

version: "3"

services:
  app:
    build:
      context: .
      dockerfile: docker/Dockerfile
    volumes:
      - .:/var/www/html
    ports:
      - 8000:80
    environment:
      TZ: "Asia/Tokyo"
    depends_on:
      - db

  db:
    image: mysql:5
    volumes:
      - db-data:/var/lib/mysql
    ports:
      - "3309:3306" # 3306ポートにするとローカルのMySQLと被るのでポートをずらす。
    environment:
      MYSQL_DATABASE: cakephp_db
      MYSQL_ROOT_PASSWORD: root_password
      
  mailhog:
    image: mailhog/mailhog
    ports:
      - "8025:8025"
      - "1025:1025"

volumes:
  db-data:
    external: false

5.CakePHP configの設定

core.phpのSecurity.saltの変更などについては割愛しますが、いつも通り行ってください。
DB接続設定は次のようにします。
app/Config/database.phpを次のように修正します。

	public $default = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'host' => 'db',
		'login' => 'root',
		'password' => 'root_password',
		'database' => 'cakephp_db',
		'prefix' => '',
		'encoding' => 'utf8',
	);

6.開発環境の立ち上げ

コマンドラインでcakephpフォルダに移動し、次のコマンドを順番に叩きます。

$ docker-compose build
$ docker-compose up -d

これでhttp://localhost:8000にアクセスするとcakePHPの画面が表示されるはずです。

7.CakePHP configの設定その2

このままではアプリケーションからメールを送信ができないので、MailHogを使ってローカル環境で作られたメールをローカル環境上で確認できるようにします。

次のコマンドを叩きます。

$ docker ps

そうすると今立ち上がっているdockerコンテナの一覧が確認できます。

CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                       PORTS                                            NAMES
178f5655d82d        mailhog/mailhog         "MailHog"                20 minutes ago      Up 7 seconds                 0.0.0.0:1025->1025/tcp, 0.0.0.0:8025->8025/tcp   cakephp_mailhog_1
6bfa1bfeb299        cakephp_app             "docker-php-entrypoi…"   4 hours ago         Up 6 seconds                 0.0.0.0:8000->80/tcp                             cakephp_app_1
52864d4d34cc        mysql:5                 "docker-entrypoint.s…"   4 hours ago         Up 7 seconds                 33060/tcp, 0.0.0.0:3309->3306/tcp                cakephp_db_1

この一覧の中からIMAGE「mailhog/mailhog」となっている行を探し、この中のNAMESの値をコピーします(ここでは「cakephp_mailhog_1」)。

app/Config/email.phpを次のように修正します。

	public $smtp = array(
		'transport' => 'Smtp',
		'from' => array('site@localhost' => 'My Site'),
		'host' => 'cakephp_mailhog_1', //docker psで確認したmailhugのコンテナ名を入力
		'port' => 1025,
		'timeout' => 30,
		'username' => 'user',
		'password' => 'secret',
		'client' => null,
		'log' => false,
		//'charset' => 'utf-8',
		//'headerCharset' => 'utf-8',
	);

この設定をした上で、http://localhost:8025(MailHogの画面)で送信したメールを読むことができます。

8.開発環境の削除・停止

コマンドラインでcakephpフォルダに移動してコマンドを叩きます。

停止

$ docker-compose stop

削除

$ docker-compose down

9.開発環境の共有

共同開発者にも、これと同じ環境を作って欲しいよ〜というときは、手順1〜4までに作ったファイルを共有して、その後の手順を共同開発者の方にやってもらえばOK…のはずです。というのもやったことがないので何とも言えないという状況です。

まだまだ不勉強で、今回紹介したものも、何をしているかよくわかっていない部分が大半です。
1つ1つを嚙み砕いて、楽々な開発ライフを送りたいと思っています。
Docker日頃から使ってるよ!という方がいたらアドバイスを頂けると嬉しいです!

The following two tabs change content below.

金子風月

犬と歯車がついたものと跨り移動系スポーツ(馬・自転車)が好きな駆け出しweb系エンジニア。 2018年2月より、株式会社凛の皆様のおかげで憧れのweb系エンジニアになることができました。