核心是复用php:8.2-apache等官方镜像并用docker-compose.yml编排服务,挂载代码至/var/www/html、映射端口、配置depends_on与网络,执行docker-compose up -d即可一键启动全栈环境并验证。

用 Docker 部署 PHP 环境,核心不是从头写一堆配置,而是复用官方镜像 + 一份清晰的 docker-compose.yml,执行一条命令就能拉起 Apache/Nginx、PHP、MySQL 全栈服务。环境一致了,“在我电脑上能跑”就不再是玄学问题。
选对基础镜像,别自己折腾编译
开发阶段直接用 php:8.2-apache 这类带 Web 服务器的官方镜像,它已预装 pdo_mysql、mbstring、gd 等常用扩展,开箱即用。不需要手动装 Apache、配 PHP-FPM、改 php.ini。如果后续要换 Nginx,再切到 php:8.2-cli 或 php:8.2-fpm 配合独立 Nginx 容器更灵活。
代码挂载路径必须匹配 Web 服务器默认目录
这是页面空白或 403/500 错误最常见的原因:
- 用
php:8.2-apache时,必须把本地代码目录挂载到/var/www/html/,例如:volumes: - ./src:/var/www/html - 用 Nginx + PHP-FPM 组合时,Nginx 和 PHP 容器要挂载同一份代码(如都挂
./src:/var/www/html:ro),且 Nginx 的root指向该路径 - macOS/Windows 下挂载后文件常属
root,Apache 默认以www-data用户运行,需加--user www-data或在容器内修正权限
用 docker-compose.yml 编排服务,确保互通可用
不靠单个 docker run 命令硬凑,而是用 YAML 文件定义依赖关系和网络行为:
立即学习“PHP免费学习笔记(深入)”;
- MySQL 服务名设为
db,PHP 代码里数据库主机就写db(不是localhost) - PHP-FPM 容器暴露
9000端口,Nginx 的fastcgi_pass写成php:9000(对应 service 名) - 用
depends_on声明启动顺序,但真正等 MySQL 就绪还需脚本或健康检查 - 初始化 SQL 放
./mysql/init.sql,通过 volume 挂进/docker-entrypoint-initdb.d/目录自动执行
验证与调试:别只看浏览器,要查日志、进容器
跑起来只是第一步,快速确认各环节是否真通:
- 浏览器访问
http://localhost:8080看到phpinfo(),说明 Web 层正常 - 进 PHP 容器执行:
docker-compose exec php bash,再运行php -m | grep pdo查扩展,ls -l /var/www/html看文件是否挂载成功 - 连数据库:
docker-compose exec mysql mysql -uroot -prootpass appdb - 实时看错误日志:
docker-compose logs -f php或mysql,比反复刷新网页高效得多



















