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

この記事は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

  
- ./
  - .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実行環境を使いたいときに試してみてはいかがでしょうか。

Author

札幌でフロントエンドエンジニアとして働いています。好きな音楽はSIAM SHADE!
SIAM SHADEの六人目のメンバーとして日々ロックを愛し続けている。
HTML,CSS,JavaScriptをベースにCMS構築が得意です。
HAMWORKS社員 https://ham.works