返回
Docker 环境下 Symfony 应用连接 MySQL 服务“Access Denied”问题排查
mysql
2024-04-06 09:05:06
Docker环境中Symfony应用连接MySQL服务的“Access Denied”问题排查指南
问题
在Docker环境中运行的Symfony应用无法连接到同一容器内部运行的MySQL服务,并收到"Access Denied"错误。
解决步骤
1. 检查凭证
- 确认数据库URL中使用的用户名和密码与MySQL容器配置中的信息匹配。
2. 检查Docker容器IP地址
- 使用
docker inspect
命令查看MySQL容器的IP地址。 - 在数据库URL中将
localhost
替换为容器的IP地址。
3. 检查防火墙设置
- 确保防火墙未阻止MySQL服务监听端口3306。
4. 重新启动容器
- 停止并重新启动MySQL容器。
5. 允许远程连接
- 在MySQL容器中运行命令,允许远程连接:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' FLUSH PRIVILEGES;
6. 修改MySQL配置
- 在MySQL容器配置文件中添加:
bind-address = 0.0.0.0
- 重新启动MySQL容器。
7. 重置Docker
- 执行命令:
docker system prune -a
- 重新构建并启动容器。
8. 使用正确的主机名
- 在数据库URL中,使用Docker容器的主机名替换
localhost
。
9. 其他解决方案
- 确保禁用Docker Desktop中的"Kubernetes"选项。
- 尝试使用
host.docker.internal
作为主机名。 - 检查MySQL容器日志以获取错误信息。
示例代码
// 数据库连接配置
$dsn = 'mysql://root:root@172.19.0.3:3306/symfony6-test';
$conn = new PDO($dsn);
- 替换
172.19.0.3
为MySQL容器的正确IP地址。
常见问题解答
1. 如何获取MySQL容器的IP地址?
docker inspect <container-name> | grep IPAddress
2. 如何重置Docker?
docker system prune -a
3. 如何使用正确的主机名?
docker inspect <container-name> | grep Hostname
4. 为什么在修改MySQL配置后需要重新启动容器?
重新启动容器将应用配置更改。
5. 如何在Symfony应用中使用正确的数据库连接配置?
将数据库连接配置添加到.env
文件中:
DATABASE_URL="mysql://root:[email protected]:3306/symfony6-test?serverVersion=10.8.3-MariaDB&charset=utf8mb4"