docker环境下php安装扩展步骤 以mysqli为例

1.0 前言

最近在折腾服务器的时候,希望一个 web 应用可以实现对数据库的操作,很容易就想到用 php 来实现,因为php 有方便的 mysql 数据库支持(php7 后应为 mysqli )。但是 run 的时候发现 docker 的 php-fpm 镜像生成的容器没有安装 mysqli 扩展,需要手动配置。故有此笔记。

2.0 php 扩展安装原理

PHP扩展实际上是用C语言编写的动态链接库,用以增强PHP的功能。所以安装 php 扩展就是布置例如 mysqli.so 这样的动态链接库文件,并告知 php 文件位置,使其能够找到就成功了。
那么很显然的一种方法就是下载 mysqli 的源码并编译,然后在 php.ini 中配置相关信息。(可见从源码安装还是挺方便的,apt 的安装方式是方便,但是配置起来不太自由。)

然而 docker 里 php-fpm 镜像是已经安装好的,我们最好在此基础上进行安装,并且进入容器内部不算很方便,有时我们希望可以通过 dockerfile 或者 docker compose 的方式直接搞定扩展的事情。docker 镜像为我们提供了这样方便的选择,那就是一系列自带的安装脚本:

docker-php-source
docker-php-ext-enable 
docker-php-ext-install  
docker-php-ext-configure  

利用这些脚本我们就可以方便的配置 php 扩展,无需再去修改 php.ini 文件了;同时也使得我们可以通过 dockerfile 或者 docker compose 的方式在容器创建之初就配置好环境。

3.0 docker 环境下 php 扩展安装

以进入容器的方式安装 mysqli 为例。
首先我们可以通过命令 docker exec -it php-fpm_container bash 进入容器内部,运行命令 php -m 查看已经安装配置过的扩展。
此时显然列表里面没有 mysqli

3.1 docker php 容器扩展安装路径及原理

容器内和扩展安装有这么几个关键的文件路径

  • /usr/src/
    存放 php 源码。在初始状态只有源码压缩包,安装过程会生成 ./php 源码文件夹。
  • /usr/src/php/ext/
    生成的源码文件夹里各种扩展的源码文件所在处,以 mysqli 为例,源码就在 /usr/src/php/ext/mysqli 路径下。
  • /usr/local/lib/php/extensions/no-debug-non-zts-20xxxxxx
    安装扩展后,生成的动态链接库文件所在的位置,php 需要知道这个位置以便调用扩展。
  • /usr/local/bin
    docker-php 扩展安装脚本文件所在处。

整个安装原理就是:
解压获得扩展源码编译源码并把动态链接库文件放在指定位置配置php文件使其成功链接库文件

3.2 docker php 扩展脚本安装过程

Step 1 docker-php-source
虽然在容器内任意位置都可以运行这些脚本,但是我们还是去脚本所在的目录下看一下

$ cd /usr/local/bin
$ ls
docker-php-entrypoint     docker-php-ext-enable   docker-php-source  pear     pecl  phar.phar  php-config
docker-php-ext-configure  docker-php-ext-install  flask          peardev  phar  php        phpize

这里面就包含用到的所有脚本了。

第一步就是解压出所需的mysqli扩展源码。

$ docker-php-source extract
$ cd /usr/src
$ ls
php  php.tar.xz  php.tar.xz.asc
$ cd php/ext/
$ ls
...    mysqli    ...

进入路径 /usr/src/php/ext/ 能看到 mysql 源码文件夹,第一步就完成了。
注:docker-php-source delete 可以删除源码文件夹。

Step 2 docker-php-ext-install
mysqli 扩展是 php 源码里面就有的扩展,所以我们执行完第一步就有源码了,对于小众一些的非自带源码,我们就需要手动把源码文件夹布置在 /usr/src/php/ext/ 下,即可进行下一步。

$ docker-php-ext-install mysqli     # 后面参数是扩展源码的目录名
$ php -m
[PHP Modules]
...
mysqli
...

[Zend Modules]

查看已安装扩展,就已经能看到 mysqli 扩展了。

Step 3 docker-php-ext-enable
这个命令实际上在上一步 install 后已经自动运行过了,所以新安装的扩展无需运行此步。对于有时不需要有时需要的扩展,可以通过 enable 来使能扩展功能。

$ docker-php-ext-enable mysqli      # 后面参数是扩展源码的目录名

实际意义可以类比为在 php.ini 文件中配置了相关扩展的功能。

Step 4 docker-php-ext-configure
当安装扩展的时候,如果需要自定义配置时,则可以在 docker-php-ext-install 后面使用。具体用法就看不同扩展的需求了。 mysqli 无需此步。

$ docker-php-ext-configure .........

安装完成。