使用 Docker Compose 编排 PHP 8.3 环境需基于 php:8.3-fpm、nginx:alpine 和 mysql:8.0 官方镜像,通过自定义网络、统一挂载路径与正确 fastcgi_pass 配置实现服务协同;推荐用 Dockerfile 预装 pdo_mysql、gd、mbstring 等扩展,确保环境可复现、跨平台一致。

用 Docker Compose 编排 PHP 8.3 环境,核心是让 PHP-FPM、Nginx 和可选数据库(如 MySQL)协同工作,同时确保 PHP 版本准确、扩展齐全、路径一致、网络互通。整个过程不依赖手动安装,靠配置驱动,一次写好,随处运行。
明确服务分工与版本选择
PHP 8.3 是当前稳定主力版本(截至 2026 年),推荐使用官方镜像 `php:8.3-fpm` 作为基础。不要混用 `latest` 或低版本标签,避免插件兼容问题(例如 Flarum 插件在 PHP 8.0 下常报错)。Nginx 用 `nginx:alpine` 轻量可靠;MySQL 可选 `mysql:8.0` 或 `mariadb:11`。所有服务需定义在同一自定义网络中,靠服务名通信。编写最小可用 docker-compose.yml
以下为生产就绪的精简模板(适配 Linux/macOS/Windows WSL):version: '3.8'
services:
php:
image: php:8.3-fpm
container_name: php83-app
volumes:
- ./src:/var/www/html
- ./php/php.ini:/usr/local/etc/php/php.ini
environment:
- TZ=Asia/Shanghai
restart: unless-stopped
nginx:
image: nginx:alpine
container_name: nginx-php83
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
- php
restart: unless-stopped
db:
image: mysql:8.0
container_name: mysql80
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: myapp
MYSQL_USER: appuser
MYSQL_PASSWORD: apppass
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro
ports:
- "3306:3306"
restart: unless-stopped注意几点:
立即学习“PHP免费学习笔记(深入)”;
-
./src是你的 PHP 项目根目录,必须存在且含index.php - Nginx 的
conf.d/default.conf需配置fastcgi_pass php:9000(不是127.0.0.1) - PHP 容器无需暴露端口到宿主机,只对 Nginx 开放内部
9000 -
depends_on控制启动顺序,但不等待 PHP 就绪;如需健康检查,可加healthcheck
补充 PHP 扩展与自定义构建(按需)
官方 `php:8.3-fpm` 镜像不含 `pdo_mysql`、`gd`、`mbstring` 等常用扩展。有两种方式启用:-
快速方式(适合开发):进入容器手动安装
docker exec -it php83-app sh -c "docker-php-ext-install pdo_mysql gd mbstring && docker-php-ext-enable pdo_mysql gd mbstring"
-
推荐方式(适合复现与部署):用自定义 Dockerfile 构建
创建./docker/php/Dockerfile:FROM php:8.3-fpm RUN apt-get update && apt-get install -y \ libpng-dev libjpeg-dev libfreetype6-dev \ && rm -rf /var/lib/apt/lists/* RUN docker-php-ext-configure gd --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd pdo_mysql mbstring COPY php.ini /usr/local/etc/php/php.ini
然后修改 docker-compose.yml 中 php 服务:
php:
build:
context: .
dockerfile: ./docker/php/Dockerfile
# 其余保持不变启动与验证流程
确保已安装 Docker 和 Docker Compose(v2.20+),执行:# 启动全部服务(后台) docker compose up -d # 查看状态 docker compose ps # 查看 PHP 日志(确认扩展加载) docker logs php83-app | grep -i "extension" # 浏览器访问 http://localhost:8080 —— 应显示 index.php 输出
若页面空白或 502,重点检查:
- Nginx 配置中
root和fastcgi_param SCRIPT_FILENAME路径是否匹配/var/www/html -
./src/index.php是否存在且权限正常(容器内用户需有读取权限) -
php.ini中display_errors = On和error_log = /var/log/php-error.log是否开启便于调试
不复杂但容易忽略。



















