php docker部署报错八成出在三处:容器内权限、服务间网络、mysql用户授权。需依次检查:1. 目录属主是否为www-data;2. php连接mysql时host填容器名、授权用'%'而非'localhost';3. nginx的fastcgi_pass是否指向php容器名及内部端口,且服务在同一自定义网络下。

PHP Docker部署报错,八成出在三处:容器内权限、服务间网络、MySQL用户授权。先别改代码,按顺序查这三块。
mkdir() 权限被拒绝:不是0777不够,是属主不对
即使你写了 mkdir($path, 0777, true),只要 /var/www/html 目录属主是 root,而 PHP-FPM 是以 www-data 身份运行,就一定会失败。
- 必须在
Dockerfile的COPY指令之后、镜像构建完成前,加一行:RUN chown -R www-data:www-data /var/www - 不要在
docker-compose.yml里用user:覆盖运行用户——它只改启动时 UID,不递归修复已有目录权限 - 验证是否生效:运行
docker exec -it <php-container> ls -ld /var/www/html</php-container>,输出中第二、三列应为www-data www-data
PHP连不上MySQL:localhost不是万能钥匙
报错 Access denied for user 'user01'@'10.10.10.10' 就说明问题不在密码,而在 MySQL 用户授权范围。Docker 容器间走的是 TCP,'user01'@'localhost' 根本不匹配。
- 进 MySQL 容器执行:
DROP USER IF EXISTS 'user01'@'localhost'; CREATE USER 'user01'@'%' IDENTIFIED BY 'password123'; GRANT ALL ON myDB.* TO 'user01'@'%'; FLUSH PRIVILEGES; - PHP 连接字符串里,
host必须填容器名(如db),不是localhost或127.0.0.1;端口填容器内端口(如3306),不是宿主机映射端口 - 确认
docker-compose.yml中 PHP 和 MySQL 服务在同一个自定义网络下,且没写错depends_on——它只控制启动顺序,不保证网络就绪
502 Bad Gateway:Nginx 和 PHP-FPM 没对上频道
Nginx 报 502,基本等于它发出了请求,但没收到 PHP-FPM 的响应。常见于 fastcgi_pass 地址或端口错配。
- 检查 Nginx 配置里的
fastcgi_pass:必须是 PHP 容器名 + 容器内监听端口,例如fastcgi_pass php-fpm:9000(不是localhost:9000) - 确认 PHP 容器确实在监听 9000(或你指定的端口):进容器执行
ss -tlnp | grep :9000,看有没有php-fpm进程绑定 - 挂载卷别搞混:Nginx 的
root和 PHP-FPM 的doc_root必须指向同一物理路径,但挂载点不同——比如 Nginx 挂/opt/app:/usr/share/nginx/html,PHP-FPM 挂/opt/app:/var/www/html
最常被忽略的点:所有配置都对了,但容器启动后没等 MySQL 完全就绪,PHP 就开始连接——这时会静默失败或超时。别依赖 depends_on,改用健康检查或启动脚本做重试。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











