返回

Docker 环境下 Symfony 应用连接 MySQL 服务“Access Denied”问题排查

mysql

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:[email protected]: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"