根本原因是php文件未正确挂载或路径不匹配,需将代码挂载到web服务器默认目录(如apache的/var/www/html),确保权限正确、扩展启用,并通过日志和命令验证;docker-compose中需配置服务互联、端口暴露及共享卷;dockerfile应使用多阶段构建、分层配置环境变量。

docker run 启动 PHP 容器时页面空白或 500 错误
根本原因通常是 PHP 文件没挂载进去,或者 index.php 不在 Web 服务器默认路径下。Nginx 默认找 /usr/share/nginx/html/index.php,Apache 找 /var/www/html/,但你本地项目根目录直接 -v ./myapp:/app,Web 服务根本看不到它。
实操建议:
- 用官方
php:8.2-apache镜像时,把代码挂载到/var/www/html/,不是随便一个路径 - 确认
index.php文件权限是 644,且所有者能被www-data用户读取(本地 macOS/Windows 挂载后常变成 root:root,得加--user www-data) - 别跳过日志:运行时加
-v /path/to/logs:/var/log/apache2,出错立刻看error.log - 临时验证是否加载成功:进容器执行
ls -l /var/www/html/和php -m | grep pdo(扩展是否启用)
docker-compose.yml 里怎么配 PHP + MySQL + Nginx 三件套
不能只写三个 service 就完事。PHP 容器必须能连上 MySQL,Nginx 必须能把请求反向代理给 PHP-FPM,这两步漏一个就 502 或连接拒绝。
实操建议:
- MySQL 服务名设为
db,PHP 代码里数据库主机就写db,不是localhost或127.0.0.1 - PHP 容器要暴露
9000端口(PHP-FPM 默认),但不映射到宿主机;Nginx 的fastcgi_pass写成php:9000(对应 service 名) - 共享代码卷要统一:Nginx、PHP 都挂载同一份代码,比如
./src:/var/www/html:ro,避免改了文件却没生效 - MySQL 初始化 SQL 要放
./init.sql并挂载进/docker-entrypoint-initdb.d/,否则每次重启都空库
Dockerfile 里 RUN apt-get install 扩展总失败
常见错误是没换源、没清理缓存、或装错包名。比如想装 pdo_mysql,但只写 apt-get install php-mysql 在 Debian 系镜像里可能不生效——因为 PHP 扩展在 php8.2-mysql 这类包里,且依赖 php8.2-common。
实操建议:
- 优先用
docker-php-ext-install装核心扩展(如pdo,mysqli,opcache),它自动编译并注册.ini文件 - 第三方扩展(如
redis,gd)先pecl install,再docker-php-ext-enable - 每条
RUN合并操作:用&&连起来,最后加&& rm -rf /var/lib/apt/lists/*减小镜像体积 - 别在生产镜像里留
vim、curl—— 有些安全扫描会直接标红
本地开发用 docker-compose up,上线部署却不敢直接 push 镜像
因为本地 docker-compose.yml 通常带 build: 和 volumes:,这些在生产环境要么无效,要么有风险。镜像一旦打包,代码和配置就得固化,不能靠挂载覆盖。
实操建议:
- 生产 Dockerfile 用多阶段构建:第一阶段装依赖、跑测试、编译前端;第二阶段只复制
/var/www/html和php.ini到精简镜像 - 敏感配置(数据库密码、API key)绝不用
ENV写死,改用docker run --env-file .env.prod或 Kubernetes Secret - 入口脚本用
ENTRYPOINT ["docker-entrypoint.sh"],里面检查DB_HOST是否为空,空则报错退出,不静默失败 - 上线前必做:
docker run -it --rm your-app:latest php -t /var/www/html验证语法,再curl -I http://localhost:8080测健康端点
最麻烦的从来不是写 Dockerfile,而是让 PHP 的 opcache.revalidate_freq、date.timezone、upload_max_filesize 这些值,在容器里和本地开发、测试、生产三套环境保持一致又可维护。硬编码在镜像里不行,全扔环境变量又太散——得靠分层配置文件+启动时注入,这个细节多数人部署完才踩到。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











