直接用官方php:8.2-apache镜像启动却页面空白,根本原因是未挂载代码到/var/www/html目录,需通过-v指定本地含index.php的目录映射至此路径,并配-p暴露端口;扩展应使用docker-php-ext-install安装,时区和上传限制须通过echo追加配置文件。

直接用 php:8.2-apache 或 php:8.2-fpm 官方镜像构建 PHP 8.2 环境,比自己写完整 Dockerfile 更快、更稳——前提是挂载对目录、暴露对端口、扩展装得准,否则容器跑起来也看不到 phpinfo()。
docker run 一行启动 php:8.2-apache 却访问空白页?
这是最常见卡点:镜像本身没问题,但 /var/www/html 是空的。官方镜像不自带 index.php,也不自动读你当前目录的文件。
- 必须加
-v $(pwd):/var/www/html(macOS/Linux)或-v %cd%:/var/www/html(Windows CMD),把含index.php的本地目录挂进去 -
index.php要放在挂载路径根下,比如$(pwd)/index.php→ 容器内就是/var/www/html/index.php - 别漏
-p 8080:80,否则宿主机打不开http://localhost:8080 - 命令示例:
docker run -d -p 8080:80 -v $(pwd):/var/www/html --name myphp php:8.2-apache
需要 pdo_mysql、gd、opcache 怎么装?
官方镜像默认只开核心扩展,docker-php-ext-install 是唯一可靠方式,不能靠 pecl install 替代所有场景(比如 gd 依赖系统库)。
- 在
Dockerfile里写:RUN apt-get update && apt-get install -y libpng-dev libjpeg-dev libfreetype6-dev && docker-php-ext-configure gd --with-freetype --with-jpeg && docker-php-ext-install gd pdo_mysql opcache - alpine 镜像换用
apk add --no-cache libpng-dev jpeg-dev freetype-dev && docker-php-ext-install gd pdo_mysql opcache -
opcache启用后建议配opcache.enable=1到/usr/local/etc/php/conf.d/opcache.ini,否则可能不生效 - 装完别忘
docker build -t myphp . && docker run -d -p 8080:80 -v $(pwd):/var/www/html myphp
为什么推荐 php:8.2-fpm 而不是 php:8.2-apache?
因为 php:8.2-fpm 更贴近生产结构,且和 Nginx 分离后调试、升级、日志隔离都更可控;php:8.2-apache 只适合单容器快速验证。
- FPM 容器不暴露 HTTP 端口,只监听
9000(默认),必须搭配 Nginx 才能响应请求 - Nginx 配置里要写
fastcgi_pass php-fpm:9000,其中php-fpm是 FPM 容器名,不是localhost - 数据库连接写
mysql:host=mysql,而不是localhost——容器间通信靠的是 Docker 网络别名 - 多服务必须用
docker-compose.yml编排,否则手动--link已被弃用,且网络不通
Composer 该不该装进运行镜像?
不该。运行时镜像里留着 composer.phar 和 dev 依赖,既增大体积又带来安全风险。
- 开发阶段用
php:8.2-cli单独跑:docker run --rm -v $(pwd):/app -w /app php:8.2-cli composer install - CI/CD 构建时用多阶段:第一阶段装 Composer 并
composer install --no-dev --optimize-autoloader,第二阶段只 COPY/app和/app/vendor到php:8.2-fpm-alpine - 如果硬要进镜像,务必用
RUN curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer,并确认php -m | grep composer不报错(其实它不进模块列表,只是可执行)
真正容易被忽略的是时区和上传限制:PHP 容器默认是 UTC 时区,date() 出来的时间不对;upload_max_filesize 默认 2M,大文件上传直接 500。这两项必须通过 RUN echo "date.timezone=Asia/Shanghai" >> /usr/local/etc/php/conf.d/timezone.ini 和 RUN echo "upload_max_filesize = 64M" >> /usr/local/etc/php/conf.d/uploads.ini 注入,挂载配置文件反而容易覆盖其他设置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











