Docker中PHP容器安装扩展有两种方式
- 通过pecl方式安装
- 通过php 容器中自带的几个特殊命令来安装,这些特殊命令可以在Dockerfile中的RUN命令中进行使用
这里说第二种方式,也是安装redis扩展演示
命令介绍
- docker-php-source
- docker-php-ext-install
- docker-php-ext-enable
- docker-php-ext-configure
查看并进入PHP容器
docker ps
docker exec -it 容器id或容器名 /bin/bash
docker-php-source
此命令,实际上就是在PHP容器中创建一个/usr/src/php的目录,里面放了一些自带的文件而已。我们就把它当作一个从互联网中下载下来的PHP扩展源码的存放目录即可。事实上,所有PHP扩展源码扩展存放的路径: /usr/src/php/ext 里面。
docker-php-source extract | delete
参数说明:
- extract :创建并初始化 /usr/src/php目录;
- delete :删除 /usr/src/php目录。
# 此时,并没有php目录
root@474d87735499:/usr/src# pwd
/usr/src
root@474d87735499:/usr/src# ls
php.tar.xz php.tar.xz.asc
# 执行命令之后再次查看多了php文件夹,里面还有一些文件
root@474d87735499:/usr/src# docker-php-source extract
root@474d87735499:/usr/src# ls
php php.tar.xz php.tar.xz.asc
# 执行命令删除,查看已经没有php文件夹了
root@474d87735499:/usr/src# docker-php-source delete
root@474d87735499:/usr/src# ls
php.tar.xz php.tar.xz.asc
docker-php-ext-install
这个命令,是用来安装并启动PHP扩展的。
docker-php-ext-install "源码包目录名"
说明
- "源码包"需要放在 /usr/src/php/ext 下;
- 默认情况下,PHP容器没有 /usr/src/php这个目录,需要使用 docker-php-source extract来生成;
- docker-php-ext-install 安装的扩展在安装完成后,会自动调用docker-php-ext-enable来启动安装的扩展;
- 卸载扩展,直接删除/usr/local/etc/php/conf.d 对应的配置文件即可。
# 把刚才删掉的php文件夹再创建下
root@474d87735499:/usr/src# docker-php-source extract
root@474d87735499:/usr/src# ls
php php.tar.xz php.tar.xz.asc
# 默认是没有php扩展的,php -m查看一下
root@474d87735499:/usr/src# php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
...
# 先下载redis扩展,放到目录/tmp
root@474d87735499:/usr/src# cd /tmp
root@474d87735499:/tmp# curl -L -o /tmp/reids.tar.gz https://codeload.github.com/phpredis/phpredis/tar.gz/5.0.2
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 237k 0 237k 0 0 40132 0 --:--:-- 0:00:06 --:--:-- 68541
root@474d87735499:/tmp# ls
pear reids.tar.gz
root@474d87735499:/tmp#
# 解压
root@474d87735499:/tmp# tar -xzf reids.tar.gz
root@474d87735499:/tmp# ls
pear phpredis-5.0.2 reids.tar.gz
# 移动redis扩展到源码目录,查看成功没有
root@474d87735499:/tmp# mv phpredis-5.0.2 /usr/src/php/ext/phpredis
root@474d87735499:/tmp# ls /usr/src/php/ext | grep redis
phpredis
# 通过docker-php-ext-install安装redis扩展
root@474d87735499:/tmp# docker-php-ext-install phpredis
Configuring for:
PHP Api Version: 20180731
Zend Module Api No: 20180731
Zend Extension Api No: 320180731
...
# 检查redis 扩展已安装上,并且是启动的
root@474d87735499:/tmp# php -m | grep redis
redis
# 删除扩展,只需要把对应配置文件删除
root@474d87735499:/tmp# ls /usr/local/etc/php/conf.d
docker-php-ext-opcache.ini docker-php-ext-redis.ini docker-php-ext-sodium.ini
root@474d87735499:/tmp# rm -rf /usr/local/etc/php/conf.d/docker-php-ext-redis.ini
docker-php-ext-enable
这个命令,就是用来启动 PHP扩展 的。我们使用pecl安装PHP扩展的时候,默认是没有启动这个扩展的,如果想要使用这个扩展必须要在php.ini这个配置文件中去配置一下才能使用这个PHP扩展。而 docker-php-ext-enable 这个命令则是自动给我们来启动PHP扩展的,不需要你去php.ini这个配置文件中去配置。
# 查看现有可以启动的扩展
root@474d87735499:/tmp# ls /usr/local/lib/php/extensions/no-debug-non-zts-20180731/
opcache.so redis.so sodium.so
# 查看redis扩展是否已启动
root@474d87735499:/tmp# php -m | grep redis
redis
# 已经启动了,这里不演示了,如果有未启动的,用这个命令就可以启动了,比如启动redis
root@474d87735499:/tmp# docker-php-ext-enable redis
docker-php-ext-configure
docker-php-ext-configure 一般都是需要跟 docker-php-ext-install搭配使用的。它的作用就是,当你安装扩展的时候,需要自定义配置时,就可以使用它来帮你做到。
DockerFile案例
FROM php:7.1-fpm
RUN apt-get update \
# 相关依赖必须手动安装
&& apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
# 安装扩展
&& docker-php-ext-install -j$(nproc) iconv mcrypt \
# 如果安装的扩展需要自定义配置时
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
最后php-fpm需要重启容器才能生效
docker restart php容器id或名称