DOCKERでPHPだけ動かす

閲覧数: 116(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

はい、またテーマ変えました。ガラッと。パソコンとスマホで表示の統一感を持たせるのに一苦労、MacとW  続きを読む

トリミング3
blank

先日から投稿ページ下部に、関連記事を表示するプラグインを導入しました。人気プラグインである、Word  続きを読む

テスト系その2
blank

このサイトは個人用ブログだけど、ローカルにテスト系を持っている。個人ブログ運営者なら、記事のバックア  続きを読む

検索に悩む
blank

インターネットを使って情報を入手する時、得られた情報の品質は、検索サイトの精度というよりは、検索に使  続きを読む

Mediawikiのバージョンアップ
blank

サーバーは同じでも別ドメインでやっている、Tsubopediaのベースソフトウェアである、Media  続きを読む

カテゴリーを制限する
blank

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

スポンサーリンク

コメントを残す

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