DockerでMovable Type用のローカル環境を構築してみた

Posted on:2018-12-05

この記事はMovable Type Advent Calendar 2018の5日目の記事です。
今日は結婚記念日だったのでこの日にしました。結婚して5年立ちました。(意外と早いものですね)
今月27日で子供も二歳( クリスマスと誕生日は一緒にしたい。。 )になるので色々とやることが多い and 出費が多い年末です。

今年は、Dockerのハンズオンに初めて参加してみたりDockerを本格的に使い始めた年でした。
今まではMovable TypeをVagrantで動かしてテーマを作ってましたが、ハンズオン後から色々触ってみて自分用のDocker環境を構築し動かすようにしてみました。

リポジトリは以下からダウンロードして使うことが可能です。
Mac環境でDocker for Macがあれば動きます。
未検証ですが、Windows環境の方はDocker for Windowsかもしくは仮想環境内であれば動くかと思います。

Directory Structure

  • docker-mt-lamp

  • ./

    • .env.sample 環境変数(envにリネームして使用してください)
    • .gitignore 除外ファイルの設定
    • README.md ドキュメント
    • docker-compose.yml
    • docker/
      • Dockerfile // Dockerfile サーバのセットアップインストールなど記述
      • httpd/
        • virtualhost.conf // VirtualHostの設定
      • mt-data/ MT本体を格納するディレクトリ
    • mt-settings/
      • mt-static/
        • mtml/ テーマで使用する静的ファイル
        • plugins/ プラグインで使用する静的ファイル
      • mt-config.cgi Movable Typeの設定ファイル
    • mtml/ テーマ本体(開発用テーマなど同梱)
    • sql/ DBのsqlデータ保存先
    • www/
      • html/ Movable Typeでファイルが出力されるドキュメントルート
      • logs/ Apacheのログ出力先

セットアップ

githubにアップされてるdocker環境をcloneもしくは下記URLからダウンロードします。

git clone git@github.com:redamoon/docker-mt-lamp.git project-name
cd project-name/

envファイルの編集

環境変数用の .env.sampleenv にリネームしてDBの情報とPORTを編集します。

MYSQL_ALLOW_EMPTY_PASSWORD=yes MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=movabletype MYSQL_USER=movabletype MYSQL_PASSWORD=movabletype
PORT=10080:80

Movable Type セットアップ

  1. MT本体を取得
  2. MT本体ディレクトリを MT-7.0 に変更しzipにする(MT-7.0.zip)
  3. MT-7.0.zipdocker/mt-data に格納
  4. mt-settings/mt-config.cgi のDB情報を env で設定した値に変更
  5. mtml/mt-static/mtml/ に必要なテーマを格納(無ければ飛ばしてください)
  6. mt-settings/plugins/mt-settings/mt-static/plugins/ に必要なプラグインを格納(無ければ飛ばしてください)
  7. 格納したテーマとプラグインを docker-compose.yml に追記する(無ければ飛ばしてください) ※追記の仕方は後述
  8. ルートディレクトリで docker-compose up -d --build で起動をビルドを行う
  9. ビルド完了後、 http://localhost:{{設定したPORT}}/cgi-bin/mt/ でアクセスをしてMT管理画面にアクセス
  10. 次回起動時はビルド不要で docker-compose up -d でアクセス可能(Dockerfile編集した場合は再度ビルドする)

格納したテーマとプラグインを docker-compose.yml に追記について

格納したテーマとプラグインをコンテナ側と紐づけるには、 webvolumes にマウントさせます。
以下が設定した volumes にマウントした例になります。
./mtml/project-name-themes:/var/www/local/cgi-bin/mt/themes/project-name-themes から下がテーマとプラグインを追記した例になります。(名前をお使いの環境に合わせてください)
マウントしている状態で、テーマやプラグインを調整しつつ http://localhost:設定したPORT で開発が可能になります。

web:
  container_name: ${CONTAINER_BASE_NAME}-apache
  build: ./docker
  ports:
    - "${PORT}"
  volumes:
    - ./www/html:/var/www/local/html
    - ./www/logs:/var/www/local/logs
    - ./mt-settings/mt-config.cgi:/var/www/local/cgi-bin/mt/mt-config.cgi
    - ./docker/httpd/virtualhost.conf:/etc/httpd/conf.d/virtualhost.conf
    - ./mtml/project-name-themes:/var/www/local/cgi-bin/mt/themes/project-name-themes
    - ./mt-settings/mt-static/mtml/project-name-themes:/var/www/local/cgi-bin/mt/mt-static/themes/project-name-themes
    - ./mt-settings/plugins/project-name-plugin:/var/www/local/cgi-bin/mt/plugins/project-name-plugin
    - ./mt-settings/mt-static/plugins/project-name-plugin:/var/www/local/cgi-bin/mt/mt-static/plugins/project-name-plugin
  depends_on:
    - mysql

Tips:データの共有について

複数人で開発したり、本番データをローカルで再現させたりしたいケースがあったりします。
Git上では出力されたファイルやディレクトリなどは共有せず ( www/html など ) 開発を行っています。
他の人に共有したり本番データに差し替えたい場合は、私の場合は以下の方法で共有をしています。

必要ファイル

  • ローカルまたは本番のダンプしたSQL
  • www/html/ 配下の画像データ(MTの場合はテンプレートで出力されるファイルは不要)

手順

  1. www/html/ 配下の出力された画像などをzipにまとめる
  2. git経由でzipデータを共有する(共有先は任意)
  3. 本番からダンプデータを取得(ローカルの場合は以下コマンドを参照)
  4. git経由でバックアップしたsqlを共有(共有先は任意)
  5. zipを解凍してドキュメントルート www/html/ へ配置する
  6. sqlをリストアしてデータベースを上書きする
# Backup
docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql

# Restore
cat backup.sql | docker exec -i CONTAINER /usr/bin/mysql -u root --password=root DATABASE

今後のアップデートについて

  • READMEのアップデート
  • MTのセットアップをシェルで実行できるように改良
  • 初期実行用の必要テーマの自動取得できるように調整
  • その他リファクタリング

まだまだ改良する部分がありますが、このような形でDocker環境以降してMT案件を進めています。
release/2.0以降までには一通りの開発環境構築の手順のアップデートやMTのセットアップをシェルに変更したものをリリース出来ればと思っています。
まずは、さくっとMT7実行環境を使いたいときに試してみてはいかがでしょうか。