优先选用php:8.2-apache或php:8.2-fpm官方镜像;扩展安装需区分sapi类型,fpm需额外docker-php-ext-enable;配置调优宜挂载php.ini而非重建镜像;装gd等扩展前须先安装对应系统依赖;composer install必须在容器内执行并验证扩展是否生效。

直接用 php:8.2-apache 或 php:8.2-fpm 官方镜像起步,别从零写 Dockerfile——90% 的扩展需求靠预装或一行命令就能加,重点是搞清「什么时候该进容器装」「什么时候该挂配置」「什么时候必须重建镜像」。
docker-php-ext-install 装扩展前先确认 PHP SAPI 类型
扩展是否生效,取决于你用的是 Apache 还是 FPM 模式:
-
php:8.2-apache镜像里apache2和cli共享同一套php.ini,装完pdo_mysql后重启 Apache 即可生效 -
php:8.2-fpm镜像里fpm和cli的php.ini是分开的,docker-php-ext-install默认只改cli的配置,要让 FPM 加载,得额外执行:docker-php-ext-enable extname - 某些扩展(如
opcache)在 CLI 下默认禁用,但 FPM 必须启用,不手动开会导致性能掉一半
挂载 php.ini 比 rebuild 镜像更灵活
开发阶段频繁调参数(比如 memory_limit、display_errors、xdebug.mode),硬编码进镜像反而拖慢迭代:
- 把自定义
php.ini放本地(如./conf/php.ini),在docker-compose.yml里挂载:volumes: - ./conf/php.ini:/usr/local/etc/php/php.ini - 注意路径:官方镜像中
php.ini位置固定为/usr/local/etc/php/php.ini(不是/etc/php/) - 挂载后修改文件无需
docker-compose build,docker-compose restart php就 reload,但某些扩展(如redis)仍需重新加载模块
扩展依赖系统库时不能只 run docker-php-ext-install
像 gd、imagick、pgsql 这类扩展,光跑 docker-php-ext-install 会报错,因为缺编译工具或头文件:
- 先装系统依赖:
RUN apt-get update && apt-get install -y libpng-dev libjpeg-dev libfreetype6-dev(Debian/Ubuntu 基础镜像) - 再装 PHP 扩展:
RUN docker-php-ext-configure gd --with-freetype --with-jpeg && docker-php-ext-install gd - Alpine 镜像用
apk add,命令和包名全不同,比如libpng-dev在 Alpine 是libpng-dev,但libjpeg-dev是jpeg-dev - 没装对依赖就强行
install,日志里会卡在checking for jpeg_read_header in -ljpeg... no,然后静默失败
composer install 必须在容器内运行,不是宿主机
很多人在宿主机跑 composer install,再挂载整个 vendor 进去,结果报 Class not found 或扩展缺失错误:
-
vendor里的 autoloader 会检测当前 PHP 版本、扩展是否可用;宿主机 PHP 环境 ≠ 容器内环境 - 正确做法:在
docker-compose.yml的php服务里加command: ["sh", "-c", "composer install && php-fpm"],或构建时用多阶段 COPYvendor - 若项目用了
ext-redis,而宿主机没装,composer install会跳过redis相关包,导致容器里也缺依赖
最常被忽略的一点:扩展装完不验证。别只看 docker-compose logs php 有没有报错,进容器跑 php -m | grep redis 和 php -i | grep 'gd support' 才算真正落地。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











