在添加 redis 扩展到 PHP 官方 Docker 容器中的备注
我想搭建一个PHP应用服务器的集群,并通过Redis共享会话,但由于遇到了一些问题,所以这是我的备忘录。
在Docker容器中实现的目标是这个图的内容。当然,我们还需要考虑将Redis进行集群化,但问题是如何在Docker容器中设置PHP和Redis的连接?如何自动化地创建相同的软件配置,以便多次使用?
问题
当尝试向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
于是我向Google老师提问,发现了Stackoverflow上一篇完美的文章:“如何使用官方的PHP Docker镜像来安装php-redis扩展?” 然而,有很多种不同的方法。
解决方案
尝试了几种方法后,最简单并且易于理解的方法是使用以下的Dockerfile。虽然里面有些多余的内容(笑)。先克隆php redis extension,然后在docker-php-ext-install中进行修改,接下来进行编译、安装,最后会生成配置文件。仅需这些步骤就可以完成,真是非常方便。
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容器需要与服务器搭建不同的技能,这是肯定的。