PHP
Redis
docker

PHPオフィシャル Dockerコンテナに redis exension を追加するメモ

PHPのアプリサーバーのクラスタを組んで、Redisで、セッションを共有させたいと思ったのですが、課題があったので、備忘録です。

Dockerコンテナで実現したいことは、この図の内容です。 もちろん、redisのクラスタ化も別途検討しますが、PHPとredisの接続をDockerコンテナ上で、どの様に設定するか? 自動化して何度でも、同じソフトウェア構成を作れる様にするか?という課題です。

スクリーンショット 2017-09-18 9.20.32.png

課題

Docker Store の PHPオフィシャル・リポジトリ にある コンテナイメージに、redis エクステンションを追加しようと次の様に書くと失敗する。

RUN docker-php-ext-install redis

エラーメッセージを読むと、追加できる対象として redis が入っていない事が解ります。

Step 4/6 : RUN docker-php-ext-install mcrypt pdo_mysql redis
 ---> Running in 6a2e232a0958
error: /usr/src/php/ext/redis does not exist

usage: /usr/local/bin/docker-php-ext-install [-jN] ext-name [ext-name ...]
   ie: /usr/local/bin/docker-php-ext-install gd mysqli
       /usr/local/bin/docker-php-ext-install pdo pdo_mysql
       /usr/local/bin/docker-php-ext-install -j5 gd mbstring mysqli pdo pdo_mysql shmop

if custom ./configure arguments are necessary, see docker-php-ext-configure

Possible values for ext-name:
bcmath bz2 calendar ctype curl dba dom enchant exif fileinfo filter ftp gd gettext gmp hash iconv imap interbase intl json ldap mbstring mcrypt mysqli oci8 odbc opcache pcntl pdo pdo_dblib pdo_firebird pdo_mysql pdo_oci pdo_odbc pdo_pgsql pdo_sqlite pgsql phar posix pspell readline recode reflection session shmop simplexml snmp soap sockets spl standard sysvmsg sysvsem sysvshm tidy tokenizer wddx xml xmlreader xmlrpc xmlwriter xsl zip
ERROR: Service 'app' failed to build: The command '/bin/sh -c docker-php-ext-install mcrypt pdo_mysql redis' returned a non-zero code: 1

そこで、グーグル先生に聞いてみると、Stackoverflow に How to install php-redis extension using the official PHP Docker image approach? というピッタリの記事を発見した。 しかし、色々な方法がありました。

解決策

いくつかの方法を試して、一番シンプルにかけて、分かりやすい方法が、以下のDockerfileでした。 余分なところも入っているけど(笑)
php redis extentionを クローンしておいて、docker-php-ext-install に追記すると、あとはコンパイル、インストール、そして、設定ファイルを書き出してくれます。 これだけでいけるとは、なかなか気が利いてますね。

Dockerfile
FROM php:7-fpm

RUN apt-get update \
    && apt-get install -y libmcrypt-dev mysql-client \
    && apt-get install -y zip unzip git \
    && apt-get install -y vim

RUN git clone -b php7 https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis 

RUN docker-php-ext-install mcrypt pdo_mysql session json mbstring redis

RUN curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer

WORKDIR /var/www

感想

Dockerコンテナをビルドするには、サーバー構築とは違うノウハウが必要ですね。とほほ