DOCKERでPHPだけ動かす
今さらdockerの話かよと思ったあなた、これが意外な事にWordpressの環境全てをdockerで構築する話はググるとゴマンと出てくるものの、Wordpressに必要な環境のうちPHPのみをdockerで動かす話はなかなか見つけられません。というか皆無です。ましてや稼働環境は千差万別じゃ無いですか。と言う事でここでは「EC2(Amazon Ubuntu 18.04 LTS + NGINX)上にWordpress用のPHPをdockerで動かして「Amazon VPS(MariaDB + Elasticsearch)」に繋ぐお話です。そもそも何でPHPをdockerで動かしたいかというと、以前も話した通りWordpressのサイトヘルスでPHP環境が最新じゃないと指摘された事に起因します。OSの最新は7.2なのでPHP7.2-fpmで動かしていました。Wordpressの推奨はPHP7.3らしいので試しにdockerで動かしてみる事にしました。dockerで試す分には直ぐに旧環境に戻せると踏んで(笑)
まずはdockerをインストールしない事には始まりません。参考にしたのは「ここ」ここが一番わかり易くて自分の環境に合っていました。ググればいくらでも情報が出てくるのですが、あまりにも多すぎてどれが自分にフィットするのか確認するだけで結構な時間がかかりました。dockerが入ってしまえばあとは設定するだけ、と思ったけど意外に時間かかったな(笑)
dockerの動作確認を兼ねてお目当のPHPバージョンをpullしてみます。コンテナのイメージが正常にダウンロード出来ればOKです。PHP公式のdockerコンテナを落とします。
docker pull php:7.3.6-fpm
ここからはググるとさらに沢山の情報が出てきますが、前述のようにいずれの情報も「NGINX + PHP + MariaDB」などを一つのコンテナにして動かすというもので、今回試してみたいような「PHPだけdockerで動かす」情報はかなり少ないように思えました。探し方が悪のかもしれませんが。
PHPだけを動かすのでdockerの関連ファイルは至ってシンプルです。
ubuntu@linux-ubx:/etc/docker$ tree . ├── docker-compose.yml ├── key.json └── php-fpm ├── Dockerfile └── php.ini 1 directory, 4 files ubuntu@linux-ubx:/etc/docker$
まずは「docker-compose.yml」から。と言っても20行。「volumes」で物理フォルダとコンテナ上のフォルダを紐付けます。先に物理フォルダ:後がコンテナ上のフォルダです。「ports」では物理ポートとコンテナ上のポートを紐付けます。こちらも物理ポート:コンテナ上のポートの形式です。物理ポートの9000番はMediawiki用のHHVMが使っているのでコンテナ上のPHP:7.3.6-fpmは9001番に紐付けます。「netwoks」はOS上のインタフェース名を固定するための設定です。詳細は「dockerとiptables」を参照下さい。
version: '3' services: app: build: ./php-fpm image: php-fpm_app networks: - docker-net ports: - 9001:9000 volumes: - /var/www/html/wp:/var/www/html/wp networks: docker-net: driver: bridge ipam: driver: default config: - subnet: 172.18.0.0/16 driver_opts: com.docker.network.bridge.name: bridge0
そして「Dockerfile」です。これは参考にしたサイトが多すぎて列挙出来ません。WordpressはGD(imagick含む)と、MariaDBの場合mysqliが必須になるのでその辺りに苦労しました。
FROM php:7.3.6-fpm # Replace shell with bash so we can source files RUN rm /bin/sh && ln -s /bin/bash /bin/sh ENV TZ='Asia/Tokyo' # make sure apt is up to date RUN apt-get update --fix-missing RUN apt-get install -y curl RUN apt-get install -y build-essential libssl-dev zlib1g-dev libpng-dev libjpeg-dev libfreetype6-dev RUN apt-get update && apt-get install libmagickwand-dev -y --no-install-recommends \ && pecl install imagick-3.4.3 \ && docker-php-ext-enable imagick RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install gd RUN docker-php-ext-install pdo pdo_mysql mysqli bcmath exif COPY php.ini /usr/local/etc/php/php.ini
dockerの作業ディレクトリ(/etc/docker)で以下のコマンドを使ってコンテナをビルドします。メッセージは長いので割愛しました。「php-fpm_app」と言うコンテナが作成されます。
docker-compose build
無事ビルドが完了するとコンテナを起動する準備が整います。Dockerfileの最後の行で物理php.iniファイルをコンテナにコピーしていますので、このフォルダのphp.iniに必要な設定を書き込みます。
post_max_size = 5M upload_max_filesize = 5M memory_limit = 256M date.timezone = Asia/Tokyo
コンテナを起動してみます。「-d」でコマンドラインからデタッチします。「docker ps」コマンドで起動が確認できます。停止は「stop」です。systemdによる自動起動の設定は「こちらの記事」を参照下さい。
$ docker-compose up -d $ docker-compose stop $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b3597e57a377 php-fpm_app "docker-php-entrypoi…" 4 minutes ago Up 4 minutes 0.0.0.0:9001->9000/tcp php-fpm_app_1
nginxの設定ファイルをコンテナ上の「PHP:7.3.6-fpm」に合わせて調整します。dockerの設定でコンテナ上のPHP:7.3.6-fpmのポート:9000をホストOSのポート:9001にマップしているので、nginxはホストOS上で動いていますが指定は「127.0.0.1:9001」となります。
location @wordpress { fastcgi_index index.php; fastcgi_pass 127.0.0.1:9001; fastcgi_param SCRIPT_FILENAME $DOCUMENT_ROOT/index.php; include fastcgi_params; }
注意する点は、コンテナの上のWordpressからMariaDBへのアクセスです。もし「localhost」接続していた場合、コンテナのIPアドレスへの変更とmysqlコマンドによる「アクセス元(コンテナの仮想アドレス)」への権限付与が必要です。つまりホストOS上のコンテナはVMの1つの「guest」のような扱いが必要という事です。また「Elasticsearch」は「ElasticPress」によるインデックスの再作成が必要です。MariaDBの時と同じようにlocalhost接続していた場合にはIP指定に変更する必要があります。
PHPのバージョンを上げたらサイトヘルスから褒められました。パフォーマンス的には「docker」と言うLinuxカーネルベースの軽量仮想環境上で最新のPHPを稼働させた事による速度向上と、そもそも仮想レイヤが一つ増えることのオーバーヘッドでの相殺って感じで、オススメされるほどの効果はあまり感じられませんでした。いつも言うようにこのサーバーはスペックが低すぎるので(笑)