とある事情で「WordPressのサイトを短期間で複数立ち上げる」という案件がありまして、何とか楽する方法がないかと調べていたら、この秋から冬にかけて PHP7 や MySQL5.7 がリリースされたりしていて、だったら全部まとめてやったれ!ということで、まとめてみました。ごった煮になってしまい分かりにくい点もあると思いますが、ご了承ください。また、説明では /tmp ディレクトリで作業をしていますが、時間が経ったり再起動したりするとファイルが消えてしまう場合があります。消したくない場合は違うディレクトリで作業してください。
Dockerの環境を作る
詳しくはこちらにまとめましたので、こちらを参照ください。Dockerの環境があればこの作業は不要です。
nginx-proxy を立ち上げる
サイトを複数立ち上げるとなると、ポート番号でアクセス先を切り替えたりするのは、ごちゃごちゃして大変です。ドメインを使えるようにする場合は、Docker + nginx-proxy で管理するのが楽そうです。こちらを参考にして、nginx および nginx-gen コンテナを立ち上げました。
[docker-op@docker-base ~]$ docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx
(出力略)
[docker-op@docker-base ~]$ mkdir -p /tmp/templates && cd /tmp/templates
[docker-op@templates]$ curl -o nginx.tmpl https://raw.githubusercontent.com/jwilder/docker-gen/master/templates/nginx.tmpl
(出力略)
[docker-op@templates]$ docker run -d --name nginx-gen --volumes-from nginx \
-v /var/run/docker.sock:/tmp/docker.sock \
-v /tmp/templates:/etc/docker-gen/templates \
-t jwilder/docker-gen:0.3.4 -notify-sighup nginx -watch \
--only-published /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
Dockerのプロセスを確認して、2つのプロセスが立ち上がっているのが確認できれば、準備オッケーです。
OPCache と GD (と mbstring)入りの PHP7 on Apache イメージの作成
※2016年8月14日追記
最新のWordPressのDockerfileを見ると、OPCacheとGDを別にインストールする記述が追加されていました。以下の手順は冗長のようです。ただ、そのDockerfileにmbstringの追加はありませんので、日本語環境の場合はmbstringはインストールしておいた方が良いと思います。
PHP7 で WordPress を動かす場合、OPCache(キャッシュ使用で高速化)と GD(画像の投稿時にサイズの変更)の拡張は組み込みたいところです。PHPの公式からイメージを落として再ビルドし、OPCache と GD 入りの PHP7 Dockerのイメージを作成します。こちらを参考しながらやってみました。他に必要なのもあるかもしれませんが、たぶんこれと同じ方法でできると思います。
基本的には、以下のような Dockerfile を任意のディレクトリ内に作成して、ビルドします。
[docker-op@~]$ mkdir -p /tmp/php7-build && cd /tmp/php7-build
[docker-op@/tmp/php7-build]$ vi Dockerfile
FROM php:7-apache
RUN apt-get update && \
apt-get install -y libpng12-dev libjpeg-dev && \
rm -rf /var/lib/apt/lists/* && \
docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr && \
docker-php-ext-install gd opcache mbstring
CMD ["apache2-foreground"]
※2015年12月13日追記
mbstring を追加しました。検索時に使うようですね。これ以外にも必要なライブラリあるかもしれませんね…
[docker-op@/tmp/php7-build]$ docker build -t abe-local/php7-gd-opcache .
(出力略)
[docker-op@/tmp/php7-build]$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
abe-local/php7-gd-opcache latest 593598d2a27b 3 minutes ago 533.4 MB
php 7-apache f5f858022dc5 3 days ago 521.4 MB
何をやっているかややこしいですかね。「abe-local/php7-gd-opcache」と指定しているところは、「今回作成するイメージ名」ですので、任意の好きな名前をつけてください。後ほど利用します。
やってることは、公式の php:7-apache のイメージを落としてきて、そのまま docker-php-ext-install で gd をインストールすると libpng や lib-jgeg がなくてビルドが通りません。なので、apt-get で先に libpng12-dev と libjpeg-dev を落としてきて、さらに docker-php-ext-configure で ライブラリパスを設定してから gd をインストールするとビルドが通るようになります。apt-get なんて書くのは普段 ubuntu とかに触ることがほとんどない自分にとっては久々でした。
PHP7 + OPcache + GD 入りの WordPress イメージの作成
こちらもWordPress公式のDockerイメージを使用しますが、2015年12月9日現在では PHP5.6 を使用していますので、こちらを先ほど作ったイメージ名(ここでは「abe-local/php7-gd-opcache」)に差し替えて、ビルドを行います。
[docker-op@~]$ mkdir -p /tmp/wordpress-build && cd /tmp/wordpress-build
[docker-op@/tmp/wordpress-build]$ git clone https://github.com/docker-library/wordpress/
[docker-op@/tmp/wordpress-build]$ vi wordpress/apache/Dockerfile
FROM php:5.6-apache
↓
FROM abe-local/php7-gd-opcache
[docker-op@/tmp/wordpress-build]$ docker build -t abe-local/wordpress-php7 ./wordpress/apache
(出力略)
[docker-op@/tmp/wordpress-build]$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
abe-local/wordpress-php7 latest 0401735c8900 18 seconds ago 561.9 MB
abe-local/php7-gd-opcache latest 593598d2a27b 28 minutes ago 533.4 MB
「abe-local/wordpress-php7」というのも任意の名前です。自分の好きな名前をつけてください。後ほど利用します。
長くなってきたので、その2へ続きます。
Docker + nginx-proxy + PHP7 on Apache + MySQL5.7 で WordPress の環境を作る その2