直接用 docker run 启动 PHP 应用常失败,因 php:8.2-cli 镜像默认执行交互式终端并退出,不带 Web 服务;应选 php:8.2-apache 或 php:8.2-fpm 镜像,配合正确挂载、网络配置与权限管理。

直接用 docker run 启动 PHP 应用,90% 的情况会失败——不是缺扩展,就是 Web 服务没起来,或者代码挂载后权限不对。核心问题不在“能不能跑”,而在于“怎么让 PHP 进程真正响应 HTTP 请求并稳定存活”。
为什么不能直接 docker run php:8.2-cli?
php:8.2-cli 镜像默认执行 php -a(交互式终端),容器启动即退出。它不带 apache2 或 php-fpm,也不监听任何端口。
- CLI 镜像只适合跑脚本,不适合当 Web 服务器
- 想跑 Web,必须选带
apache或fpm的变体,比如php:8.2-apache或php:8.2-fpm - 即使用了
-p 8080:80,如果 Apache 没启用mod_rewrite或 DocumentRoot 指向错误,也会返回 403 或 404
推荐组合:php:8.2-apache + -v 挂载 + 自定义 .htaccess
这是最快能跑通 Laravel、WordPress 等常见 PHP 应用的方式,无需改代码、不额外写 Dockerfile。
- 用
php:8.2-apache镜像,它已预装 Apache 和常用扩展(pdo_mysql、curl、json) - 通过
-v $(pwd):/var/www/html把当前目录映射为网站根目录 - 确保项目里有
index.php,且/var/www/html/.htaccess存在(Apache 默认开启AllowOverride All) - 启动命令示例:
docker run -d -p 8080:80 -v $(pwd):/var/www/html --name myapp php:8.2-apache
如果要用 Nginx + PHP-FPM,必须分两个容器
单容器硬塞 Nginx 和 PHP-FPM 容易失控(进程管理混乱、日志混杂、升级困难)。官方推荐用 php:8.2-fpm 配合独立 Nginx 容器。
Docker Hub (hub.docker.com)。此技能适用于所有 Docker Hub 操作,包括读取、创建、更新和删除数据。只要任务涉及 Docker Hub,就使用此技能。
- Nginx 容器需配置
fastcgi_pass php:9000,指向 PHP-FPM 容器名(Docker 网络自动解析) - 两个容器必须在同一自定义网络(如
docker network create phpnet),不能用默认 bridge - PHP 容器的
/var/www/html和 Nginx 的root必须挂载同一宿主机路径,否则文件不同步 - 常见报错
connect() to php:9000 failed:要么 PHP 容器没启动,要么网络没连对,要么 PHP-FPM 监听的是127.0.0.1:9000(应改0.0.0.0:9000或用 socket)
权限问题比想象中更常导致白屏或 500 错误
Linux 宿主机用户 UID 和容器内 www-data(UID 33)不一致时,Composer install 或 Laravel storage 写入会失败。
- 临时解决:启动时加
--user $(id -u):$(id -g),让容器内进程以当前用户身份运行 - 长期方案:在 Dockerfile 中
useradd -u 1001 -m app,并把/var/www/html所属组设为www-data - Mac 上挂载卷默认是 root 权限,
chmod -R 775 storage bootstrap/cache可能无效,得进容器用chown -R www-data:www-data /var/www/html
最常被跳过的一步是验证 PHP 扩展是否真加载成功——别只看 php -m | grep pdo,要进容器用 php -i | grep 'pdo_mysql' 确认 ini 文件路径和启用状态。很多“扩展已安装”的假象,源于配置没生效或被覆盖。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










