つかびーの技術日記

(情報)工学修士, 元SIer SE, 現Web系 SEの技術blogです。Scala, Java, JS, TS, Python, Ruby, AWS, GCPあたりが好きです。

WordPressをdockerで構築してみた

   

こんにちは、@s_tsukaです。

今回はWordPressをdocker containerとして構築して、Immutableにする話です。

もともとこのblogはとあるサーバ(VPS)上に普通にインストールして動かしていたのですが、サーバ移転することになって、折角だからdockerにしようとしたときの話です。

WordPressをdockerで動かす意味

別に普通に他のサーバ上にWordPressなりPHPなりMySQLなりをインストールして動かしても良いのですが、dockerでやっておけば、いつでもどこでも簡単に移行できるようになります。

とあるVPSだろうが、オンプレ(自宅)のサーバだろうが、Google、Amazonのインスタンス上だろうが、dockerさえインストールされていれば動かすことができます。

WordPressをdockerで構築する為に必要なもの

以下の物をDockerfileで構築する必要があります。結構骨が折れます

  • Apache
  • PHP
  • MySQL

骨が折れますが、実はある程度は楽ができます。公式のImageが既に用意されています・・・!

wordpress

これを直接動かすか、カスタマイズしたければDockerfileでFROMすればOKです。

直接動かしても良いのですが、pluginなどを入れておかないと話になりません。また、テーマなども場合によっては必要でしょう。という訳でカスタマイズすることにします。

自分用のDockerfileを書く

結論を言うと、以下のようなDockerfileを書けばOKです。(直接書いても動きませんので、適宜変更してください)

FROM wordpress

ENV WORDPRESS_DB_HOST example.com:3306
ENV WORDPRESS_DB_USER root
ENV WORDPRESS_DB_PASSWORD password
ENV WORDPRESS_DB_NAME myblog

# Install tools
RUN apt-get update
RUN apt-get -y --force-yes -o Dpkg::Options::="--force-confdef" install wget curl unzip python python-pip libapache2-mod-php5 php5-mysql php5-curl
RUN pip install awscli

# Install plugins
WORKDIR /tmp/wp-plugins
RUN wget https://downloads.wordpress.org/plugin/svg-support.2.1.7.zip
RUN wget https://downloads.wordpress.org/plugin/crayon-syntax-highlighter.zip
RUN wget https://downloads.wordpress.org/plugin/crazy-bone.0.5.5.zip
RUN wget https://downloads.wordpress.org/plugin/easy-fancybox.1.5.7.zip
RUN wget https://downloads.wordpress.org/plugin/google-analytics-for-wordpress.5.4.2.zip
RUN wget https://downloads.wordpress.org/plugin/google-sitemap-generator.4.0.8.zip
RUN wget https://downloads.wordpress.org/plugin/php-text-widget.zip
RUN wget https://downloads.wordpress.org/plugin/tinymce-advanced.4.1.9.zip
RUN wget https://downloads.wordpress.org/plugin/wp-multibyte-patch.2.3.1.zip
RUN wget https://downloads.wordpress.org/plugin/nephila-clavata.0.2.2.zip
RUN wget https://downloads.wordpress.org/plugin/amazon-web-services.0.2.2.zip
RUN wget https://downloads.wordpress.org/plugin/amazon-s3-and-cloudfront.0.8.2.zip
RUN wget http://blog.openmedialabo.net/wp_plugin/wp-tmkm-amazon1.5.2.zip

RUN unzip './*.zip' -d /usr/src/wordpress/wp-content/plugins

# Install themes
WORKDIR /tmp/themes
RUN wget https://s3-ap-northeast-1.amazonaws.com/tsukaby.techblog/stinger5ver20150505b.zip
RUN unzip './*.zip' -d /usr/src/wordpress/wp-content/themes

# Download lang files
WORKDIR /usr/src/wordpress/wp-content/
RUN wget https://s3-ap-northeast-1.amazonaws.com/tsukaby.techblog/languages.zip
RUN unzip languages.zip && rm languages.zip


# Change owner
RUN chown -R www-data:www-data /usr/src/wordpress/wp-content

WORKDIR /var/www/html

まず始めにWORDPRESS_DB_HOSTなどの変数設定を行います。外部から与えても良いですが、今回は内部で直接指定することにしました。これらはwordpress imageが必要としています。詳細はDockerhubのwordpress imageのドキュメントを見ると良いと思います。

wordpress imageはUbuntuだかDebianだかで構築されているので、aptで色々入れています。ここも適宜変更してください。

Install pluginの部分ではプラグインを公式からDLして、解凍しています。基本これだけです。足したり引いたり適宜変更してください。

その次にテーマと言語ファイルを入れています。これらは使わない人は消しても良いです。自分は現在はstingerというテーマを利用させてもらっていますので、このようにインストールしています。

最後に色々とwp-content以下にファイルを追加したりしたので、所有者を変更してApacheが読めるようにしてやります。WORKDIRをwordpress imageが想定している場所である/var/www/htmlに戻してあげれば完了です。

この状態でdocker runすれば、指定したMySQLに接続に行きますし、WordPress自体もちゃんと動きますし、blogを見られるようになります。

注意点(ここはImmutableじゃない)

実は上記の設定だけではまだ不完全です。

WordPressは投稿データや設定データはMySQLに持っていますが、以下はサーバ内部に持っています。

  • プラグインファイル
  • テーマファイル
  • 言語ファイル
  • wp_configなどの追加の設定ファイル
  • アップロードした画像

なので、プラグインやテーマをWordPress管理画面上で追加しても使えはしますが、dockerを再起動したら消えてしまいます。追加したプラグインやテーマはちゃんとDockerfileに書いておきましょう。

wp_configもそうです。もし現在稼働させているWordPressでwp_configに追加設定をしている場合はちゃんとDockerfileを変えておきましょう。一度稼働させたWordPressでも同様です。wp_configはまあまあ変更する場合もあるかと思いますので、注意が必要です。

最後に最も重要なのが画像です。メディア機能でアップロードしたファイルはwp-content/uploads以下に保存されます。ですが、これはdockerを再起動したら当然消えます。なので、これについては画像をS3に保存して永続化するなどの対策が必要です。画像の扱いについては以下にまとめていますので、併せてみて頂くと良いかと思います。

WordPressの画像ファイルをS3に保存する(メディア機能連携)

まとめ

  • WordPressをdockerで構築する方法やDockerfileを解説しました
  • WordPressをdockerで構築するときの注意点を解説しました

実は画像周りとか色々あって1ヶ月くらいかかりました・・・苦労した・・・

宜しければ参考にしてくださいー

 - サーバ ,