copy_people copy_things copy_matter copy_heart copy_txt ttl_topics ico_blank ico_facebook ico_twitter ico_hatebu ico_index

2018/08/17

DockerでMovableType7インストール

Written by Shunsuke Okoshi

  • docker
  • Movable Type

INDEX

    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 コマンド概要 で確認してください。

    参考資料

    CONTACT

    お仕事のご相談や、弊社についてのご質問や
    ご要望など、お気軽にお問い合わせください。

    View