能直接跑起来的docker-compose.yml需确保:服务名互通(PHP连MySQL用'mysql'而非'localhost')、Nginx中fastcgi_pass写'php-fpm:9000'、volumes映射路径一致(如./www:/var/www/html)、PHP容器安装mysqli等扩展、Nginx配置显式设置SCRIPT_FILENAME,且MySQL加healthcheck避免启动即连失败。

直接能跑起来的 docker-compose.yml 就是好配置,不用改端口、不报 Connection refused、PHP 能连上 MySQL —— 关键在服务名互通、卷映射路径对、fastcgi_pass 地址写准。
服务名必须一致,否则 PHP 连不上 MySQL 或 Nginx 找不到 PHP-FPM
MySQL 容器启动后,其他容器只能通过 docker-compose.yml 里定义的 services 下的服务名访问它,不是 localhost,也不是 127.0.0.1。Nginx 转发 PHP 请求时同理。
-
mysql服务定义后,PHP 代码里必须用$host = 'mysql',不能写'localhost' -
php-fpm服务名一旦定为php-fpm,Nginx 配置中fastcgi_pass就得写php-fpm:9000(不是127.0.0.1:9000) - 如果把服务名写成
php,但 Nginx 配置里还写php-fpm:9000,就会报connect() failed (111: Connection refused)
volumes 映射路径要匹配容器内实际路径,尤其注意 /var/www/html 和 /usr/share/nginx/html 的区别
Nginx 官方镜像默认文档根目录是 /usr/share/nginx/html,而 PHP-FPM 镜像(如 php:8.2-fpm)默认工作目录是 /var/www/html。两个容器要共享 PHP 代码,必须映射到同一宿主机目录,且各自指向正确路径。
- 推荐统一用
./www:/var/www/html:Nginx 配置里root /var/www/html;PHP-FPM 自然读取该路径 - 若坚持用 Nginx 默认路径,就得改 Nginx 配置:
root /usr/share/nginx/html,同时volumes改为./www:/usr/share/nginx/html,否则index.php404 -
./nginx.conf:/etc/nginx/nginx.conf是覆盖整个主配置;更安全的做法是只挂载./nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
depends_on 不保证 MySQL 已就绪,PHP 启动前需加连接重试逻辑
depends_on 只控制容器启动顺序,不等 MySQL 初始化完成(比如等待 mysqld 接受连接)。PHP 应用一启动就尝试连 MySQL,大概率失败并崩溃退出。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
立即学习“PHP免费学习笔记(深入)”;
- PHP 容器可加启动脚本:循环执行
mysqladmin ping -h mysql -u root -prootpass --silent && break || sleep 2 - 或改用
healthcheck+restart: on-failure,但不如脚本直接可控 - MySQL 服务本身建议加
healthcheck,例如:healthcheck:<br> test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-prootpass"]<br> timeout: 20s<br> retries: 10
别漏掉 PHP 扩展和 Nginx fastcgi_param,否则 mysqli 找不到或 $_SERVER 变量为空
官方 php:xxx-fpm 镜像默认不带数据库扩展,Nginx 默认 fastcgi_params 文件也不传 SCRIPT_FILENAME —— 这俩漏一个,PHP 就要么连不上库,要么提示 No input file specified.
- PHP 容器必须启用扩展:用
docker-php-ext-install mysqli pdo pdo_mysql,或在Dockerfile中构建时安装 - Nginx 配置里
location ~ \.php$块中,必须显式写:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- 别依赖
include fastcgi_params—— 它不包含SCRIPT_FILENAME,要额外补上
最易被忽略的是:MySQL 初始化需要时间,但 depends_on 不等它;PHP 代码里硬写 localhost 而非服务名;以及 Nginx 挂载了整个 nginx.conf 却没删掉默认 server 块,导致自定义配置不生效。这三个点卡住的人最多。


















