直接用php:8.2-apache镜像挂载代码即可运行,无需自编Dockerfile;定制时须注意扩展安装顺序(如pdo在pdo_mysql前)、opcache需显式启用、数据库连接必须用容器名而非localhost。

直接用 php:8.2-apache 镜像挂载代码就能跑通,别自己写 Dockerfile 编译 PHP;真要定制,重点是扩展安装顺序、opcache 显式启用、数据库连接用容器名而非 localhost。
docker run 一行启动 PHP8.2 Web 服务
最简验证方式不是构建镜像,而是直接运行官方镜像并挂载当前目录:
- 确保当前目录有
index.php(比如内容为) - 执行:
docker run -d -p 8080:80 -v $(pwd):/var/www/html --name php82 php:8.2-apache - 访问
http://localhost:8080,看到phpinfo()页面即成功 - 常见失败:页面空白 → 检查是否漏了
-v挂载,/var/www/html下没文件时 Apache 不报错但返回空响应
装扩展必须注意依赖和顺序
用 docker-php-ext-install 装扩展时,顺序错或缺系统依赖,PHP-FPM 启动不报错但请求直接 500 或 Class not found:
-
pdo_mysql必须在pdo之后安装:RUN docker-php-ext-install pdo pdo_mysql -
gd需先装系统库:RUN apt-get update && apt-get install -y libpng-dev libjpeg-dev && docker-php-ext-configure gd --with-jpeg --with-freetype && docker-php-ext-install gd -
opcache编译进 PHP 后默认不启用,必须显式开启:RUN docker-php-ext-enable opcache或写入 conf.d:RUN echo "opcache.enable=1" > /usr/local/etc/php/conf.d/opcache.ini - 别用
COPY php.ini全量覆盖 —— 会丢掉镜像自带的date.timezone、upload_max_filesize等关键默认值
docker-compose 中 PHP 连 MySQL 总是失败?检查 host 名
PHP 容器里连 MySQL 写成 localhost 或 127.0.0.1 必然失败,因为这是容器自己的回环地址,不是 MySQL 容器:
PHP 8.5.12 RC 1 候选版修复 BZ2、DOM、PDO、Opcache/JIT 和扩展内存安全问题,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 在
docker-compose.yml中定义 MySQL 服务名为mysql,PHP 服务里就用host=mysql - 连接字符串示例:
mysql:host=mysql;dbname=test - 确保
depends_on只控制启动顺序,不保证 MySQL 已 ready;加健康检查或应用层重试更可靠 - Alpine 镜像连 MySQL 8.0 常报 SSL 错误,因缺
libssl1.1;要么换debian基础镜像,要么手动apk add openssl
nginx + php-fpm 组合时通信失败的根源
用 php:8.2-fpm 镜像时,Nginx 容器里配 fastcgi_pass localhost:9000 一定不通 —— 容器间 localhost 不互通:
- Nginx 配置中必须写服务名:
fastcgi_pass php:9000(假设 PHP 服务名为php) - 两个容器必须在同一个自定义网络(
docker-compose默认创建),不能依赖bridge默认网段 - PHP-FPM 默认监听
127.0.0.1:9000,需改配置监听0.0.0.0:9000或 Unix socket;推荐后者:fastcgi_pass unix:/var/run/php/php8.2-fpm.sock,再挂载 socket 文件 - 权限问题常被忽略:Nginx worker 用户(如
www-data)需对 socket 文件有读写权,或统一 UID 启动两个容器
真正卡住人的从来不是“怎么启动”,而是扩展加载失败不报错、数据库连不上却无日志、Nginx 和 PHP-FPM 网络通但 FastCGI 协议层拒绝连接——这些都得看容器内实际运行态,而不是只盯 docker logs。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










