DockerでMovableType7インストール

Blog

Power Mode が動くから、VS code に乗り換えました。
そういうわけでオオコシです。
VS code用のPower ModeはXP世代にはおなじみのアイツも使えます。イルカじゃない方。

で、エディタの話は置いといて、そうです。Docker です。
なんとなくいつかはやらなきゃなーとは思っていたものの、Webアプリやってるわけじゃないし、Wordpressは Local by Flywheel でサクッと環境つくれるし、MAMPBrowserSync もあるし、できればそっとしておきたかったんですが、昨今の開発環境の話をみているとどうにも避けて通れないようで。

というわけで、Docker試してみました。
せっかくだから毎回ImageMagickのインストールとかで躓くMovable Typeで。

Docker をインストール

まずはDockerのインストールです。
弊社は全員Macなので Docker Desktop で Download for Macをクリックしてダウンロード。

もしくは、Homebrew Caskで brew cask install docker を実行。Homebrew Caskについてはこちらの記事を参考に。

サーバー構成

今回はMovable Typeクラウド版サービス仕様 のApache版を参考に、下記の内容で組んでみようと思います。

  • CentOS 7
  • Apache 2.4系
  • MySQL 5.7
  • php 5.6

これに加え、DB操作に phpMyAdmin、メールの確認に MailCatcher も使います。

ファイル構成

/
└ htdocs/(ドキュメントルート)
    └mt-static/(MT用静的ファイル)
└ db/
    └data/(MySQLデータ保存場所)
    └init/(DB初回起動時読み込みファイル)
└ cgi-bin/(cgi実行環境)
    └mt/(MT本体)
└ docker-compose.yml
└ Dockerfile
└ httpd.conf
└ mt-config.cgi(MT設定ファイル)

コンテナ内で MTのGithubリポジトリ をクローンして〜みたいなのも見かけたんですが、プラグインとテーマは管理したいのでMT本体も永続化させます。
DBも永続化しておきます。

複数人で作業する場合に都度インストール画面を出したくないので mt-config.cgi は共通化します。
必要がなければインストール時に自動生成されるものを使ってください。

MTの構成は公式の Movable Type の設置 (Linux, BSD, Mac OS X) に則って、/cgi-bin/ 配下にインストールするパターンにしてみました。( /mt-static/ は手動で移動してください。)

ちなみに MT本体のダウンロードですが、個人ライセンスを作成/商用ライセンスを購入/Githubからクローン の他に、MovableType開発者登録 で開発者ライセンスを作成し シックス・アパート ユーザーサイト からダウンロードすることもできます。

今回は開発者ライセンスで Movable Type 7 r.4208 をダウンロードして使っています。

※ MTの商用利用は有償なのにソースがGithubにある件についてはこちら。Movable Type 6 の新しいライセンスについて

各設定ファイルについて

docker-compose.yml

version: '2'

services:
  web:
    build: .
    container_name: app
    volumes:
     - "./htdocs:/var/www/html"
     - "./cgi-bin:/var/www/cgi-bin"
     - "./mt-config.cgi:/var/www/cgi-bin/mt/mt-config.cgi"
     - "./httpd.conf:/etc/httpd/conf/httpd.conf"
    ports:
      - "1234:80"
    links:
     - "db:db"

  db:
    image: mysql:5.7
    container_name: db
    ports:
      - "3306:3306"
    volumes:
      - "./db/init:/docker-entrypoint-initdb.d"
      - "./db/data:/var/lib/mysql"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=db
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - db
    ports:
      - 1235:80
    volumes:
      - /sessions

  smtp:
    image: schickling/mailcatcher
    container_name: smtp
    ports:
      - "1080:1080"
      - "1025:1025"

Apacheの入ったapp、MySQLのdb、phpMyAdmin、MailCatcherの入ったsmtpを立てます。

container_name:app について

appはDockerFileを使います。PSGIを使わない&サムネイルにImageMagickを使用する想定でApacheとperlモジュールなどをインストールしています。phpは5.6を指定したいので Remiリポジトリから指定します。ブロッコリーを立てる人ではないです。

VolumesではApacheの設定を記載した httpd.conf と、そこで指定したドキュメントルート/cgi実行ディレクトリをローカルのディレクトリと紐付け、mt-config.cgi を本来あるべき場所にリンクさせています。

portは左側をローカルで使いたいものにしてください。サンプルなので1234。右側はコンテナ内なのでデフォルトの80です。(httpd.confで変えた場合はそちらに合わせる)

Dockerfile

FROM centos:7
RUN yum install -y httpd httpd-devel

RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm yum-utils
RUN yum-config-manager --enable remi-php56

RUN yum install -y php perl gcc \
        libxml2-dev \
        libssl-dev \
        libexpat1-dev \
        cpan \
        make \
        perl-HTML-Parser \
        perl-Digest-MD5 \
        perl-DBD-MySQL \
        perl-IO-Socket-SSL \
        perl-Net-SSLeay.x86_64 \
        perl-XML-LibXML.x86_64 \
        ImageMagick-perl.x86_64 \
        perl-Crypt-SSLeay

RUN curl -L http://cpanmin.us | perl - App::cpanminus
RUN cpanm CGI Image::Size CGI::Cookie LWP::UserAgent parent HTML::Entities \
          Archive::Tar \
          Archive::Zip \
          Cache::Memcached \
          Mozilla::CA \
          XML::Parser \
          XML::SAX::Expat \
          XML::SAX::ExpatXS \
          YAML::Syck

RUN chown -R apache:apache /var/www/html/
RUN chown -R apache:apache /var/www/cgi-bin/
RUN chmod -R 755 /var/www/cgi-bin/

EXPOSE 80

CMD ["httpd", "-DFOREGROUND"]

httpd.conf

ServerRoot "/etc/httpd"

Listen 80

Include conf.modules.d/*.conf

User apache
Group apache

ServerAdmin root@localhost

<Directory />
    AllowOverride none
    Require all denied
</Directory>

DocumentRoot "/var/www/html"

# ドキュメントルート設定
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

# cgi-binのエイリアス設定
ScriptAlias /cgi-bin /var/www/cgi-bin

# /var/www/cgi-bin/ 設定
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

<Files ".ht*">
    Require all denied
</Files>

ErrorLog "logs/error_log"

LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    CustomLog "logs/access_log" combined
</IfModule>

<IfModule mime_module>
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz

    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>

AddDefaultCharset UTF-8

<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>

EnableSendfile on

IncludeOptional conf.d/*.conf

mt-config.cgi

#======== REQUIRED SETTINGS ==========

CGIPath        /cgi-bin/mt/
StaticWebPath  /mt-static/
StaticFilePath /var/www/html/mt-static

#======== DATABASE SETTINGS ==========

ObjectDriver DBI::mysql
Database mt
DBUser root
DBPassword root
DBHost db

#======== MAIL =======================
MailTransfer smtp
SMTPServer smtp
SMTPPort 1025

DefaultLanguage ja

ImageDriver ImageMagick

container_name:db について

dbでは公式のmysqlイメージを使用します。

どうやら Volumesで /docker-entrypoint-initdb.d に指定したディレクトリに初回起動時に読み込ませたい .sh .sql .sql.gz ファイルを入れておくとインポートしてくれるようです。 なので、db/init  にサンプルサイトのsqlデータをエクスポートして入れておきました。

MYSQL_ROOT_PASSWORDではルートのパスワードを指定しています。ちなみに、MYSQL_DATABASE という項目で、初回に作成しておくデータベース名も指定できるんですが、照合順序が latin1_swedish_ci になっていました。

ポートはデフォルトの3306を指定しておきます。

MTインストール画面(またはmt-config.cgi)では下記のように指定します。ポートを3306以外のものにした場合はポート番号も入力してください。

項目名 内容
データベースの種類 MySQLデータベース(推奨)
データベースサーバ db
データベース名 (任意のデータベース名:mtなど)
ユーザ名 root
パスワード root

container_name:phpmyadmin について

上記dbと連携させて、ログイン情報等を入力します。
ポートは適当です。(1235)
初回起動時に読み込ませるsqlがない場合は起動後、localhost:1235でphpMyAdminにアクセスしてutf8_general_ci のMT用データベースを作るといいと思います。

container_name:smtp について

MailCatcher は実際には送信されない簡易SMTPサーバーみたいなやつです。

デフォルトでは localhost:1050 にアクセスすることで、送信されたメールを確認することができるとのこと。

MTのインストール画面では下記のように設定するとテストメールが届いているのが確認できます。

項目名 内容
メール送信プログラム SMTPサーバー
送信メールサーバー smtp ※docker-compose.ymlでmailcatcherに設定した名前
SMTPサーバーのポート番号 1025 ※docker-compose.ymlでmailcatcherに設定したポート番号

使い方

以上のデータを用意したら、docker-compose.yml のあるディレクトリに移動して、下記コマンドを実行します。

$ docker-compose up -d

インストールするものが多いので時間はかかりますが、全部のサーバーが done になったら localhost:1234/cgi-bin/mt/ で管理画面にアクセスできます。
インポートするsqlデータがない場合は phpMyAdminでデータベースを作成してインストールを進めてください。

コンテナの起動がうまくいかない場合は、Dockerfileやdocker-compose.ymlの設定を見直してビルドし直してみてください。

$ docker-compose build --no-cache

止める時は

$ docker-compose stop

再開するときは

$ docker-compose start

要らなくなったら

$ docker-compose down

その他のコマンドは docker-compose --help
docker-compose コマンド概要 で確認してください。

参考資料