You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker+Apache+MySQL环境下PHP脚本显示Hello后遇连接拒绝错误

排查思路与解决建议

1. 检查MySQL容器的端口监听配置

MySQL默认绑定127.0.0.1,仅允许容器内部访问,同网络的其他容器无法连接。修改步骤:

  • 进入MySQL容器:docker exec -it [mysql容器名/ID] bash
  • 编辑配置文件(路径可能因镜像不同略有差异,比如/etc/mysql/mysql.conf.d/mysqld.cnf),找到bind-address项,改为bind-address = 0.0.0.0
  • 重启MySQL容器:docker restart [mysql容器名/ID]

2. 修正MySQL用户的远程访问权限

root用户默认仅允许localhost登录,需授权允许从Apache容器所在网络访问:

  • 进入MySQL命令行:docker exec -it [mysql容器名/ID] mysql -uroot -p
  • 执行授权语句(替换your_password为实际root密码,%表示允许任意IP,也可指定Apache容器的IP段):
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    
  • 退出命令行后重启MySQL容器生效。

3. 用容器名代替IP地址连接(更稳定)

Docker容器IP可能随重启变化,直接用MySQL容器名称作为连接地址更可靠:

  • 修改PHP脚本中的$server为MySQL容器的名称,例如:
    $server = "mysql-container"; // 替换为你的MySQL容器实际名称
    
  • 确保两个容器处于同一Docker网络中(docker-compose启动默认在同一网络,手动启动需创建并加入同一网络)。

4. 确认MySQL服务完全就绪

容器启动后MySQL需要几秒初始化,直接连接会失败:

  • 查看MySQL容器日志:docker logs [mysql容器名/ID],确认出现ready for connections字样后再测试连接。
  • 也可以在PHP脚本中添加简单的重试逻辑,避免因服务未就绪导致的连接失败。

5. 检查PHP的mysqli扩展是否安装

虽然报错是连接拒绝,但如果Apache容器的PHP未安装mysqli扩展也会引发异常:

  • 进入Apache容器:docker exec -it [apache容器名/ID] bash
  • 执行php -m | grep mysqli,无输出则说明未安装,根据镜像系统安装扩展:
    • Debian/Ubuntu系:apt-get update && apt-get install php-mysqli
    • Alpine系:apk add php-mysqli

6. 测试3306端口连通性

ping通不代表端口开放,在Apache容器内测试端口:

  • 执行telnet 172.17.0.3 3306(替换为你的MySQL容器IP),连接失败则回到步骤1检查MySQL的bind-address配置。
  • 或用nc -zv 172.17.0.3 3306查看端口状态。

内容的提问来源于stack exchange,提问作者Unknown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:52:48