Php Docker Symfony Mysql:SQLSTATE[HY000][2002]连接被拒绝

Php Docker Symfony Mysql:SQLSTATE[HY000][2002]连接被拒绝,php,mysql,symfony,docker,Php,Mysql,Symfony,Docker,所以我是docker的新手,这是我尝试使用它运行的第一个项目。我遇到的问题是,我的php apache容器无法连接到我的mysql容器,而只能在浏览器中连接。我可以做到: docker exec -it <php container id> bash 所有的 php bin/console doctrine:<> 参数.yml parameters: database_driver: pdo_mysql database_host: db da

所以我是docker的新手,这是我尝试使用它运行的第一个项目。我遇到的问题是,我的php apache容器无法连接到我的mysql容器,而只能在浏览器中连接。我可以做到:

docker exec -it <php container id> bash
所有的

php bin/console doctrine:<>
参数.yml

parameters:
    database_driver: pdo_mysql
    database_host: db
    database_port: 3306
    database_name: symfony
    database_user: root
    database_password: null
我还可以通过Sequel Pro很好地连接到数据库,而我的容器运行时使用的凭据与我在参数中提供的凭据相同,但主机为“127.0.0.1”,我觉得这很有趣


非常感谢您对可能出现的问题提供的任何帮助。

Sup,由于我是新来的,所以我现在还无法对更多细节进行评论,因此我将大胆猜测,并假设您的应用程序没有问题

这类问题通常与防火墙相关。Docker为我们做了很多防火墙配置,所以我们不必自己处理ufw或IP表,但这也意味着我们需要通过Docker compose文件指定每个容器如何相互交互

您必须指定应用程序容器链接到数据库容器,以便允许主机命名访问,因为docker每次启动容器时都会修改容器
/etc/hosts
文件,以便映射每个容器的当前IP,如下所示:

services:
  ...
  application:
    ...
    depends_on:
      - db
    links:
      - db
services:
  db:
    ...
    networks:
      - my_project_network
  application:
    ...
    depends_on:
      - db
    links:
      - db
    networks:
      - my_project_network

networks:
  my_project_network:
完成此操作后,您只需确保参数文件配置正确,正如@dbrumann所指出的,数据库密码应该包含您的密码,而不是空值

为docker项目创建自定义网络也是一种很好的做法,这样您就可以在容器之间拥有一个很好的专用lan,而不必使用docker的默认网络向任何其他容器开放,具有默认值的自定义网络可以很好地完成此任务,如下所示:

services:
  ...
  application:
    ...
    depends_on:
      - db
    links:
      - db
services:
  db:
    ...
    networks:
      - my_project_network
  application:
    ...
    depends_on:
      - db
    links:
      - db
    networks:
      - my_project_network

networks:
  my_project_network:
您实际上不需要将数据库端口公开给主机,但将其公开会使检查数据库时的开发方式更容易,所以在进入生产环境时请记住删除数据库容器端口语句,以避免安全问题


希望这对您有所帮助,这里有一个指向docker网络文档的链接,以防您想了解更多信息:

根据您的docker-compose.yml:
MYSQL\u PASSWORD=PASSWORD
但在您的应用程序配置中,它会显示:
数据库\u密码:null
。我希望它是
数据库\u密码:password
。试过了,没有骰子。这意味着我无法通过命令行连接。该错误还可能与密码有关,而不仅仅是“连接被拒绝”。您是否使用
Dotenv
组件?如果是,为什么要使用参数文件?如果不是,为什么要指定
SYMFONY_ENV