docker非常方便, 使用docker构建php镜像后, 以后就能重复使用.

构建php镜像和直接安装在linux系统上没区别, 重点在于扩展的安装. 我打算在官方构建好的镜像基础上, 因为官方已经帮我们配置好了很多工具, 更加方便构建.

三种安装扩展的方式

内置扩展安装(只是帮我们下载了源码, 还没有安装)

官方已经帮我们存放了很多未编译的扩展, 我们不需要下载源码, 可以进行快速安装.

下面是官方安装示范, 这个示范比较复杂,

  1. 首先去远程下载gd的三个依赖扩展,

  2. 然后通过docker-php-ext-configure对gd进行配置, 主要是告诉gd依赖扩展的位置, 该命令类似于phpize+./configure

  3. 最后通过docker-php-ext-install真实安装, 该命令类似于make+make install, -j$(nproc)是固定写法, 安装扩展就固定这样写.

    FROM php:7.4-fpm RUN apt-get update && apt-get install -y
    libfreetype6-dev
    libjpeg62-turbo-dev
    libpng-dev
    && docker-php-ext-configure gd --with-freetype --with-jpeg
    && docker-php-ext-install -j$(nproc) gd

PECL扩展安装

pecl是php安装包的中央仓库, 类似于java的maven, node的npm.

下面也是官方示例

  1. 首先使用pecl命令直接安装redis和xdebug, pecl已经内置在了该镜像中, 有一点需要注意, 安装时必须指定具体版本, 因为pecl不会检测版本, 不指定的话会安装最新版本, 容易导致不兼容.

  2. 然后使用docker-php-ext-enable命令开启redis和xdebug, 这个相当于在php.ini配置文件中打开这两个配置项.

    FROM php:7.4-fpm RUN pecl install redis-5.1.1
    && pecl install xdebug-2.8.1
    && docker-php-ext-enable redis xdebug

其他扩展安装

有很多扩展没有被收入到PECL中, 那么就需要我们自己下载源码, 编译安装.

下面还是官方示例, 如果你原来在linux上面编译安装过php扩展, 就有种熟悉的感觉.

  1. 首先去远程下载xcache源码包, 意思是使用重定向下载, 如果出错不生成记录错误的html文件, 下载时不显示进度信息, 但会显示错误提示.

    curl的参数解释: f表示fail, 当有错误时, 默认会返回包含错误信息的html文件, 使用了该参数后, 当发生错误时, 丢弃该错误信息文件. s表示不输出错误和进度信息 S表示只输出错误信息, 一般和s连用 L表示跟随重定向. o表示把服务器响应内容保存为文件, 等同于wget命令.

  2. 然后就是正常解压编译安装.

    tar参数解析: x表示extract, 提取文件的意思. f表示提取哪个文件. C表示指定解压到哪个文件夹. --strip-components=n表示解压后去除n层目录结构

  3. 最后使用docker-php-ext-enable激活php.ini配置选项.

    FROM php:7.4-fpm RUN curl -fsSL 'https://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz' -o xcache.tar.gz
    && mkdir -p xcache
    && tar -xf xcache.tar.gz -C xcache --strip-components=1
    && rm xcache.tar.gz
    && (
    cd xcache
    && phpize
    && ./configure --enable-xcache
    && make -j "$(nproc)"
    && make install
    )
    && rm -r xcache
    && docker-php-ext-enable xcache

如果大家能用内置安装就用内置, 不能用内置就用pecl, 都不能用就外部编译安装.

内置变量

官方镜像除了内置了脚本命令外, 还内置了几个环境变量, 我们可以直接拿来用.

PHP_INI_DIR: php.ini配置文件目录

PHPIZE_DEPS: 包含gcc, g++等编译辅助软件名称

TZ: 时区

需要的扩展

redis: 生产环境都要用到缓存提高速度, 这个很有必要. opcache: 这个是文件缓存, 生产环境也有必要. gd: 图片处理库, 必装. pdo_mysql: mysql链接库, 必装. mbstring: 对字符串的很多操作, 必装.

构建准备

我们把一些单独扩展的配置放入conf.d文件夹, 然后让php.ini引入, 方便以后修改, 学习nginx的做法.

date.ini

date.timezone = Asia/Shanghai

opcache.ini

# OPCACHE_ENABLE用来控制是否开启opcache, 0不开启, 1开启
opcache.enable=${OPCACHE_ENABLE}
enable_clopcache.enable_cli=1
opcache.revalidate_freq=60
opcache.max_accelerated_files=100000
opcache.validate_timestamps=1

开始构建

我使用的是7.3.28-fpm-alpine3.14基础镜像作为构建.

安装内置扩展 gd pdo_mysql opcache mbstring

首先是安装内置扩展, 使用docker run 7.3.28-fpm-alpine3.14 php -m命令就能看到内置了哪些扩展. 这个命令不能显示内置的ZEND Module.

20210626101353-2021-06-26-10-13-54

RUN apk add --no-cache freetype libpng libjpeg-turbo freetype-dev libpng-dev libjpeg-turbo-dev \
    && apk update \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd pdo_mysql opcache mbstring

安装PECL扩展 redis

这个就要去https://pecl.php.net/找, 常用的都有.

  1. 记住一定要使用确定的版本, pecl不会检测版本号的兼容性.

  2. 我们能发现PECL需要安装$PHPIZE_DEPS编译包, 而内置的不需要, 是因为docker-php-ext-install命令已经集成了

  3. 安装完成后别忘了卸载编译包, 该动作也被docker-php-ext-install集成了, 但docker-php-ext-enable没集成

    RUN apk add --no-cache $PHPIZE_DEPS
    && apk update
    && pecl install redis-4.3.0
    && docker-php-ext-enable redis
    && apk del $PHPIZE_DEPS

完整代码

FROM php:7.3.28-fpm-alpine3.14
# 设置容器时区, 世界时间+8
ENV TZ "Asia/Shanghai"
# 设置是否开启opcache缓存, 0表示不开启, 1表示开启
ENV OPCACHE_ENABLE=0
# www.conf配置路径
ENV WWW_CONF_PATH="/usr/local/etc/php-fpm.d/www.conf"

# 配置apk包国内地址, 下载慢就开启. 不过开启了还是慢, 最好用vpn
# RUN echo 'https://mirrors.aliyun.com/alpine/v3.9/main/' > /etc/apk/repositories && \
#     echo 'https://mirrors.aliyun.com/alpine/v3.9/community/' >> /etc/apk/repositories

# 安装内置扩展 gd pdo_mysql opcache mbstring
RUN apk add --no-cache freetype libpng libjpeg-turbo freetype-dev libpng-dev libjpeg-turbo-dev \
    && apk update \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd pdo_mysql opcache mbstring

# 安装PECL扩展 redis
RUN apk add --no-cache $PHPIZE_DEPS \
    && apk update \
    && pecl install redis-4.3.0 \
    && docker-php-ext-enable redis \
    && apk del $PHPIZE_DEPS

# 获取php.ini
RUN cp "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"

# 配置php.ini
COPY ./conf.d/ $PHP_INI_DIR/conf.d/

# 配置php-fpm.conf
RUN sed -i 's/;emergency_restart_threshold.*/emergency_restart_threshold = 10/' php-fpm.conf \
    && sed -i 's/;emergency_restart_interval.*/emergency_restart_interval = 1m/' php-fpm.conf \
    && sed -i 's/;process_control_timeout.*/process_control_timeout = 10s/' php-fpm.conf

# 配置www.conf, 这个自己配置, 服务器不同配置不同
# COPY ./www.conf $WWW_CONF_PATH

# END

# 大家以这个镜像构建时, 有两个变量能用:
# OPCACHE_ENABLE, 0不开启opcache, 1开启opcache
# WWW_CONF_PATH, www.conf的路径, 用来被你的配置覆盖

总结

构建一次, 终生使用, 还等什么, 快到碗里来.

参考资料

制作一个生产环境可用的PHP基础镜像 Docker Official Images description php编译安装gd扩展 curl 的用法指南

THE END
开启精彩搜索

历史搜索

用户名或邮箱
密码
用户名
密码
重复密码
邮箱
注册
找回密码
注册 登录
邮箱
邮箱验证码
发送验证码
59秒后可重发
新密码
重复密码
请选择支付方式
余额支付

购买将消耗【10

微信支付
微信扫码支付 0 元
[ 04分50秒 ]
请使用微信扫一扫
扫描二维码支付
支付宝支付
支付宝扫码支付 0 元
[ 04分50秒 ]
请使用支付宝扫一扫
扫描二维码支付
已完成支付
未完成支付

请输入验证码

点击验证码可以刷新

你确认吗?

确认

2024年10月1日

新增

新增