DOCKERでPHPだけ動かす

閲覧数: 68(0)

今さら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を稼働させた事による速度向上と、そもそも仮想レイヤが一つ増えることのオーバーヘッドでの相殺って感じで、オススメされるほどの効果はあまり感じられませんでした。いつも言うようにこのサーバーはスペックが低すぎるので(笑)

【最終更新日: 2019年6月16日】
カテゴリーIT閑話, 公開タグ, , , , ,
関連記事
パンくずリスト詳細
blank
2020年5月12日

テーマの「マイナーチェンジ」に伴って「パンくずリスト」の仕様を若干変更しました。一つ前のテーマではパ  続きを読む

カテゴリーを制限する
blank
2020年5月11日

過去に何度も書いた「カテゴリー制限」の話、元はと言えば初期に書かれた「非公開」の記事が原因です。トッ  続きを読む

マイナーチェンジ
blank
2020年3月23日

かれこれ一年近くほったらかしだったので、気合をいれて「テーマ変更」と思っていたのですが、、、いろいろ  続きを読む

6月の検索ワードまとめ
blank
2019年6月30日

6月の検索ワードのまとめです。 意外なところで「zabbixダウングレード」が複数回検索され、単独の  続きを読む

アクセシビリティ対策
blank
2019年6月23日

テーマカスタマイズの一環で、トップページに一覧表示されている「写真を左右交互に表示する」ようにした際  続きを読む

dockerとproxy
blank
2019年6月18日

dockerやdocker-composeをプロキシ環境下で使うのに苦労したので忘れないようにメモし  続きを読む

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください