推荐用 docker-compose 一键部署 PHP-FPM + Nginx 分离架构,PHP 容器安装 pdo_mysql 等扩展,Nginx 通过 fastcgi_pass php:9000 代理,共享代码卷并基于自定义网络通信。

用 Docker 部署 PHP 环境,推荐用 docker-compose 一次性拉起 PHP + Nginx(或 Apache)+ MySQL(可选)组合,比手动 run 多个容器更清晰、易维护。
基础结构:PHP-FPM + Nginx 分离部署
现代 PHP 容器化推荐「Nginx 负责静态文件和反向代理,PHP-FPM 单独容器处理动态请求」,职责分离、便于扩缩容和日志隔离。
- Nginx 容器挂载你的 PHP 项目代码,并通过
fastcgi_pass指向 PHP-FPM 容器(如php:9000) - PHP 容器基于
php:8.2-fpm(或其他版本),安装常用扩展(pdo_mysql、gd、mbstring 等),并挂载相同代码目录 - 两者通过自定义 Docker 网络通信,无需暴露 PHP-FPM 端口到宿主机
docker-compose.yml 关键配置示例
以下是最小可用的 docker-compose.yml(含 PHP-FPM 和 Nginx):
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./src:/var/www/html # 本地代码映射
- ./nginx/conf.d:/etc/nginx/conf.d # 自定义 nginx 配置
depends_on:
- php
php:
image: php:8.2-fpm
volumes:
- ./src:/var/www/html
- ./php/php.ini:/usr/local/etc/php/php.ini environment:
- TZ=Asia/Shanghai
注意:
– Nginx 的 conf.d/default.conf 需配置 fastcgi_pass php:9000(不是 127.0.0.1:9000),因跨容器通信靠服务名
– PHP 容器默认监听 9000/tcp,且只绑定在 0.0.0.0:9000(Docker 内部可直接访问)
让 PHP 支持 MySQL 或其他扩展
如果项目需连接数据库,不建议在 PHP 镜像里装 mysql-client,而应:
立即学习“PHP免费学习笔记(深入)”;
- 单独加一个
mysql或mariadb服务(用官方镜像),通过depends_on和环境变量连接 - 在 PHP 容器中启用扩展:可写 Dockerfile 继承官方镜像,例如:
FROM php:8.2-fpm RUN docker-php-ext-install pdo_mysql mysqli gd mbstring exif pcntl RUN pecl install xdebug && docker-php-ext-enable xdebug
然后在 compose 中用 build: . 替代 image:,构建带扩展的定制镜像。
快速验证与常见问题
启动后执行:docker-compose up -d,再访问 http://localhost:8080。
- 若看到
File not found.:检查 Nginx 配置中root和fastcgi_param SCRIPT_FILENAME路径是否匹配挂载路径 - 若 PHP 文件被下载而非执行:确认 Nginx 已正确将
.php请求 proxy 到php:9000,且 PHP 容器内有对应文件 - 修改 PHP 配置(如 upload_max_filesize)后,需重启 PHP 容器:
docker-compose restart php











