构建生产级 PHP Docker 镜像

PHP Docker 镜像构建要点:选择 Debian 或 Alpine 基础镜像、安装扩展、配置 PHP-FPM、管理 Composer 依赖及迁移。示例为起点,需补齐多阶段构建与生产安全配置。

最佳实践
容器模块与编排港口插画

本文依据官方文档整理,未执行运行验证或性能基准。代码片段展示局部用法,业务函数、数据和环境需按项目补齐;版本与配置以所引文档为准。

直接回答:生产级 PHP 镜像的核心决策——基础镜像选官方 php:fpm(Debian 系,兼容性稳)或 php:fpm-alpine(小);架构用 Nginx + PHP-FPM 双进程;扩展用 docker-php-ext-install;Composer 依赖多阶段构建装入;最终镜像剔除构建工具瘦身。

先懂 PHP 运行机制

PHP 请求生命周期:Web 服务器(Nginx)收到请求 → 经 FastCGI 转给 PHP-FPM 的 worker 进程 → 执行脚本返回响应。FPM 是进程管理器,worker 池大小(pm.max_children)直接决定并发能力——容器化后这个参数按容器内存限额算,不是越大越好。

基础镜像怎么选

镜像 特点
php:8.x-fpm Debian 基底,扩展兼容性最好,体积大
php:8.x-fpm-alpine 基于 musl,体积与扩展兼容性取决于具体镜像和依赖
php:8.x-apache Apache 内嵌,传统部署平移用

先核对扩展及依赖的 libc 支持;已有 Debian 运维体系可继续使用 Debian 版。不能只按基础镜像体积决定。

扩展与自定义构建

FROM php:8.3-fpm-alpine
RUN apk add --no-cache libpng-dev libzip-dev oniguruma-dev \
    && docker-php-ext-install pdo_mysql gd zip opcache
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www
COPY composer.json composer.lock ./
RUN composer install --no-dev --prefer-dist --no-scripts --no-autoloader
COPY . .
RUN composer dump-autoload --no-dev --optimize --no-scripts

这是构建骨架,不是已经瘦身的最终多阶段镜像。composer.lock 先 COPY 利用缓存;代码拷入后再生成优化 autoload,按框架要求显式执行必要的 Composer scripts。最终阶段还需复制扩展及其运行库、vendor 和源码,并去掉 Composer/开发包。不要盲目删除扩展所需动态库。

数据库迁移不进镜像

迁移是部署动作不是构建动作:在经审核的单独 CI 部署步骤里跑 php artisan migrate --force,绝不写进 Dockerfile 的 RUN。

瘦身清单

  • 多阶段构建,最终镜像不含 Composer 与构建工具链
  • apk/apt 装完即清缓存(--no-cache / rm -rf /var/lib/apt/lists/*)
  • .dockerignore 排除 node_modules、.git、.env、本机 vendor 等;按构建需求决定 tests 是否进入测试阶段

常见问题(FAQ)

Q:php-fpm 的 pm.max_children 怎么算?
A:从容器限额扣除主进程、共享内存和安全余量,再按代表性请求下的 worker 内存峰值估算。避免简单相加含共享页的 RSS;通过自己的压测及 OOM/队列指标调整,不套用固定 worker 数。

Q:alpine 遇到扩展装不上怎么办?
A:先查该扩展是否依赖 glibc 特性;无解的扩展直接换回 Debian 基底,体积换稳定。

Q:要不要把 Nginx 打进同一个镜像?
A:不推荐。通常按一容器一个主要服务拆分(FPM 本身会有多个 worker 进程),Nginx 独立容器——扩缩与日志采集都更清晰。

官方参考

资料核对日期:2026-09-29。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台