核心是选对基础镜像、装好必要扩展、配好web服务器代理,并确保权限与路径合理:优先用php:8.x-fpm-alpine,安装pdo_mysql、opcache等扩展,nginx通过fastcgi_pass转发php请求并正确设置script_filename,采用多阶段构建和非root用户运行,统一uid避免权限问题。

配置 PHP 8 的 Docker 运行环境,核心是选对基础镜像、装好必要扩展、配好 Web 服务器代理,并确保权限与路径合理。不追求一步到位,而要分清构建与运行职责。
选准基础镜像并安装关键扩展
优先使用官方 php:8.x-fpm-alpine 或 php:8.x-fpm-slim-bookworm 镜像(如 php:8.2-fpm-alpine),体积小、更新及时、适合生产。避免用 php:apache 或 php:cli 直接跑 Web 请求——FPM 才是容器内 PHP 的标准模式。
- 用
RUN docker-php-ext-install安装必需扩展:常见如pdo_mysql、mbstring、opcache、gd、xml - 禁用开发扩展:不要装
xdebug或apcu到生产镜像;OPcache 必须启用且预热,加opcache.enable_cli=1和opcache.preload配置可进一步提速 - 若需 Redis、Swoole 等第三方扩展,先
pecl install再docker-php-ext-enable
用 Nginx 做反向代理,别让 PHP 暴露 HTTP
PHP-FPM 本身不处理 HTTP 请求,只响应 FastCGI 协议。必须搭配 Nginx(或 Apache)做前端代理,否则无法被浏览器访问。
- Nginx 配置中定义
location ~ \.php$块,把请求转发到 PHP-FPM 容器(如fastcgi_pass php-fpm:9000) - 务必设置
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name,否则$_SERVER['SCRIPT_FILENAME']会为空,Laravel/Symfony 路由可能失效 - 静态资源(CSS/JS/图片)由 Nginx 直接服务,不走 PHP,减少 FPM 压力
多阶段构建减体积,非 root 启动保安全
单阶段构建容易把 composer、gcc、git 全塞进最终镜像,既大又危险。
- 构建阶段用
composer:2或php:8.x-cli-slim安装依赖,生成vendor/ - 运行阶段只 COPY
/app/vendor、/app/public等实际需要的目录,不要COPY . /app - 运行镜像中执行
adduser -u 1001 -S www && USER www,禁止以 root 启动 PHP-FPM - 最终镜像大小可压至 120–280MB,比单阶段减少 60%+,启动更快、攻击面更小
挂载与权限要匹配宿主机 UID
Docker 容器内外用户 UID 不一致,会导致写日志、缓存、上传文件失败。
- 在
docker-compose.yml中为 PHP 服务显式指定user: "1001:1001"(与容器内www用户 UID/GID 一致) - 宿主机项目目录用
chown -R 1001:1001 ./src预设权限,或通过volume挂载时加:z(SELinux)或:Z(强制 chcon) -
/var/www/html或/app目录属主设为www:www,storage/、bootstrap/cache/等可写目录额外加chmod -R 775
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











