1
/
5

1日でSaaSの開発環境を構築!Docker × CakePHPによる環境構築の舞台裏

近年、サブスクリプションビジネスに注目が集まるなか、新規事業でSaaSを開発する機会が増えてきました。しかし、新規事業でSaaSを開発する際に、はじめの開発環境の構築に時間がかかりがちです。そこで、新規事業のSaaSを始めるにあたって、私たちが具体的にどのようにして最短で開発環境を構築したかを振り返ってみました。

新規事業立ち上げは突然に(リリースまで2ヶ月!)

正月明けの初日、2019年1月7日(月)10時10分。

新規事業として、サブスクリプションビジネスの成長とともに顕在化する請求業務の課題を解決するSaaS「KIMERA(キメラ)」を立ち上げるためのキックオフミーティングをしました。

自社のサブスクリプションビジネスで請求業務に課題があったので、まずは自社の請求業務をKIMERAで置き換えていくことに。請求業務は毎月発生するため、最初の請求書発行機能のリリースを2019年2月末(リリースまで2ヶ月!)に設定しました。

実際のKIMERAのロードマップ

技術選定は慎重に

今回の新規事業では、SaaSとして展開できる技術を選定する必要がありまして、以下の基準で技術を選定していました。

枯れた技術

  • 技術的な安全性や安定性を確保する

開発スピード

  • ドキュメントが多く公開されていて学習コストが低い
  • 世の中の先駆者たちが残してくれているノウハウが豊富

フレームワークやインフラの拡張性

  • 今後の機能拡充や負荷対策への拡張性を確保する

技術選定の結果、KIMERAの技術スタックを以下のように定めて開発していくことにしました。

技術スタック

環境構築に使える時間は1日のみ

技術選定が終わったあとは、急ピッチで開発環境を整えて、開発をスタートしなければなりません。最初となる請求書発行機能のリリース予定が2019年2月末のため、残り時間が刻一刻と減っていきます。

リリース日から逆算すると、開発環境の構築に使えるのは、本日1日のみ。ゼロベースで環境構築していると間に合いません。

そこで、Dockerを利用して、CakePHPの開発環境をつくることにしました。

Dockerで環境構築を最短で

それでは、Docker環境を構築していきましょう。

ディレクトリ構成

ディレクトリとファイルは、以下の方針で作成します。

  • 小回りがきくようにコンテナをWebとDB、phpMyAdminで分ける。
  • 各コンテナ定義ファイルのディレクトリ配下で必要なファイル群を配置する。
├── app
   └── index.php
├── dokcer
   ├── web
      ├── Dockerfile
      ├── conf.d
         └── conf.d/000-default.conf
   ├── db
      ├── Dockerfile
   └── phpmyadmin
      ├── Dockerfile
├── docker-compose.yml

Dockerコンテナのベースイメージ

Dockerコンテナのイメージをゼロから作ると時間がかかりますので、WebとDB、phpMyAdminのそれぞれで以下のベースイメージを利用します。

Webコンテナ(Apache):ベースイメージ php:7.0-apache

DBコンテナ(MySQL):ベースイメージ mysql:5.6

phpMyAdminコンテナ:ベースイメージ phpmyadmin/phpmyadmin

具体的なDockerファイルを作り込む

docker-compose.yml

WebとDB、phpMyAdminでコンテナを分けるため、コンテナ同士の依存関係をdepends_onで指定しておきます。

version: "2"

services:

  web:
    container_name: "kimera_web"
    build: ./docker/web
    links:
      - db
    depends_on:
      - db
    ports:
      - "8765:8765"
    volumes:
      - ./:/var/www/html
      - ./docker/web/conf.d/000-default.conf:/etc/apache2/sites-enabled/001-default.conf
    working_dir: /var/www/html
    environment:
      DATABASE_URL: "mysql://kimera:kimera@db/kimera?timezone=Asia/Tokyo"
      APP_DEFAULT_LOCALE: "ja_JP"
      AWS_ACCESS_KEY_ID: ""
      AWS_SECRET_ACCESS_KEY: ""
      XDEBUG_CONFIG: remote_port=9001
    hostname: webhost

  db:
    container_name: "kimera_db"
    build: ./docker/db
    ports:
      - "3306:3306"
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/conf.d:/etc/mysql/conf.d
      - ./config/schema:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: kimera
      MYSQL_USER: kimera
      MYSQL_PASSWORD: kimera
    hostname: db

  phpmyadmin:
    container_name: "kimera_phpmyadmin"
    build: ./docker/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=db
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - db
    depends_on:
      - db
    ports:
      - 8080:80
    volumes:
      -  ./docker/phpmyadmin/sessions:/sessions

web/Dockerfile

ベースイメージから作成されるコンテナに、事前にインストールしたいライブラリを指定しておくことで、開発に必要な環境を一気に作成できます。

FROM php:7.0-apache

RUN apt-get update && apt-get install -y vim git unzip libicu-dev \
  && a2enmod rewrite \
  && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev libgd-dev \
  && docker-php-ext-configure intl \
  && docker-php-ext-install mbstring gettext intl pdo_mysql \
  && docker-php-ext-install -j$(nproc) iconv mcrypt \
  && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
  && docker-php-ext-install -j$(nproc) gd \
  && curl -sS https://getcomposer.org/installer | php \
  && mv composer.phar /usr/local/bin/composer \
  && rm -rf /var/cache/apk/*

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

ENV CAKEPHP_ENV development

EXPOSE 8765 9001

web/conf.d/000-default.conf

Listen 8765
NameVirtualHost *:8765


    ServerAdmin webmaster@test.com

    DocumentRoot /var/www/html/app

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    
				Options FollowSymLinks
				AllowOverride All
        Require all granted
    
    DirectoryIndex index.php


    BrowserMatch "MSIE [2-6]" \
                  nokeepalive ssl-unclean-shutdown \
                  downgrade-1.0 force-response-1.0
    # MSIE 7 and newer should be able to use keepalive
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown


SetEnv CAKEPHP_ENV development

db/Dockerfile

FROM mysql:5.6

phpmyadmin/Dockerfile

FROM phpmyadmin/phpmyadmin

Docker x CakePHPの構築〜起動までは3ステップ

ここまででDocker環境の準備が整いましたので、最後に、CakePHPのソースコードを取得して、Dockerのコンテナを起動します。

(1)CakePHPの環境構築

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

(2)Dockerコンテナのビルド

$ docker-compose build --no-cache

(3)サーバーの起動

$ docker-compose up -d

ブラウザで以下のURLを開きます。


CakePHPのWebサイト http://localhost:8765/
phpMyAdmin http://localhost:8080

CakePHPの初期画面

SaaSの開発環境を約3時間で構築完了!

無事にDockerでCakePHPの開発環境を構築できまして、実際のファーストコミットは同日の12時48分でしたので、SaaSの開発環境を約3時間で構築できました!

実際のGitHubのコミットログ

TOWN株式会社からお誘い
この話題に共感したら、メンバーと話してみませんか?
TOWN株式会社では一緒に働く仲間を募集しています
1 いいね!
1 いいね!

同じタグの記事

今週のランキング

長澤 成啓さんにいいねを伝えよう
長澤 成啓さんや会社があなたに興味を持つかも