XAMPP的PHP无法连接Docker Compose的MySQL,根本原因是网络隔离:PHP运行在宿主机,localhost指向127.0.0.1,而MySQL容器默认不监听该地址;必须通过ports映射(如"3307:3306")、设置--bind-address=0.0.0.0、创建'root'@'%'用户并刷新权限,且PHP连接时显式使用127.0.0.1:3307而非localhost。

XAMPP 和 Docker Compose 不能“配合”成一个统一服务栈——它们运行在互斥的网络模型和进程空间里。你真正能做的,是让 XAMPP 的 PHP 应用(比如本地写的测试脚本)安全调用 Docker 容器提供的服务(如 MySQL、API),而不是让 Apache 或 MySQL 在两者间共享配置或端口。
为什么 XAMPP 的 PHP 连不上 docker-compose 启动的 MySQL
常见错误现象:mysqli_connect(): (HY000/2002): Connection refused 或 PDOException: SQLSTATE[HY000] [2002] Connection refused。根本原因不是密码错,而是网络层不通:XAMPP 的 PHP 进程运行在宿主机上,localhost 指向的是宿主机自己的 127.0.0.1,而 Docker 容器默认不监听宿主机的 127.0.0.1 接口(除非显式映射)。
- docker-compose.yml 中 MySQL 服务若只写了
image: mysql:8.0,没配ports,那它只在内部 Docker 网络开放,XAMPP 根本看不见 - 即使配了
ports: ["3307:3306"],PHP 也必须连127.0.0.1:3307,不能写localhost:3307(Windows 下localhost可能走 IPv6 或被 hosts 干扰) - MySQL 容器默认绑定
127.0.0.1内部地址,需加command: --bind-address=0.0.0.0才允许外部连接
docker-compose.yml 中如何暴露服务供 XAMPP 调用
关键不是“让 XAMPP 接入 Docker 网络”,而是把容器服务显式映射到宿主机端口,并确保服务本身接受外部连接。以 MySQL + API 为例:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- MySQL 必须同时满足三件事:映射端口(如
ports: ["3307:3306"])、允许远程登录(environment: MYSQL_ROOT_HOST: "%")、放开绑定地址(command: --bind-address=0.0.0.0) - HTTP 服务(如 Laravel API)若用
php:8.2-apache镜像,需确认ports: ["8001:80"],且 Apache 配置中Listen 80未被注释;XAMPP 的 PHP 用file_get_contents("http://127.0.0.1:8001/endpoint")调用 - 避免使用
network_mode: host:它会让容器直接复用宿主机网络栈,但会破坏 Docker Compose 的隔离性,且在 macOS/Windows 上行为不一致
XAMPP 的 PHP.ini 怎么适配 Docker 服务调用
这不是改 php.ini 的问题,而是确保扩展已启用、SSL 验证不干扰、超时设置合理:
-
extension=mysqli和extension=pdo_mysql必须在 XAMPP 的php.ini中开启(路径通常是XAMPP\php\php.ini),改完重启 Apache - 调用 HTTPS 接口时,XAMPP 的 cURL 默认不信任 Docker 容器自签证书,需在代码中加
stream_context_create(['http' => ['verify_peer' => false, 'verify_peer_name' => false]]),或全局禁用(不推荐) - 容器启动慢(尤其首次拉镜像),XAMPP 的
default_socket_timeout建议设为 30 秒以上,否则连接 MySQL 或 API 时容易超时
实际调用时最容易忽略的细节
真正卡住人的往往不是技术点,而是路径和权限错位:
- Docker Compose 启动后,用
docker-compose ps确认状态是Up,不是Restarting或Exit 1;查日志用docker-compose logs -f mysql - XAMPP 的 PHP 进程 UID 是 Windows 用户或 macOS 当前用户,而 Docker 容器内 MySQL 数据目录若挂载了宿主机路径,需确保该路径对容器 UID(如
mysql用户)可读写 - 防火墙或杀毒软件可能拦截宿主机端口映射(尤其 Windows Defender Firewall),临时关闭测试比反复查配置更高效
复杂点不在 Docker Compose 编排本身,而在两端网络视角的割裂:XAMPP 看世界用 127.0.0.1,Docker 容器看世界用服务名。一旦混淆这两者,所有调试都变成猜谜。

















