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
- Debian/Ubuntu系:
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
相关产品推荐
相关产品推荐

