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

时间:2018-07-24 16:29:39

标签: php mysql symfony docker

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

docker exec -it <php container id> bash

然后运行

composer install

和所有

php bin/console doctrine:<>

命令很好,没有数据库错误或连接问题。当我尝试在浏览器中实际加载网站时,遇到“ SQLSTATE [HY000] [2002]连接被拒绝”错误。我不太确定为什么会这样,并且在网络上找不到任何结果似乎有效。这是我的文件:

docker-compose.yml

version: '3'
services:
  db:
    restart: always
    container_name: hcp-db
    build:
      context: ../
      dockerfile: docker/db/Dockerfile
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
      - MYSQL_DATABASE=symfony
      - MYSQL_USER=root
      - MYSQL_PASSWORD=password
    volumes:
      - db:/var/lib/mysql
    expose:
      - 3306
    ports:
      - "4306:3306"
  application:
    container_name: hcp-symfony
    build:
      context: ../
      dockerfile: docker/Dockerfile
    working_dir: /app
    expose:
      - 80
    ports:
      - 8000:80
    depends_on:
      - db
    volumes:
       - ../:/app
    environment:
      - SYMFONY_ENV=dev
      - SYMFONY_DEBUG=1

volumes:
  db:

parameters.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”,这很有趣。

对于可能出问题的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

抱歉,由于我是新手,因此我无法发表更多细节,所以我会做出一个疯狂的猜测,并假设您的应用程序没有问题。

这种问题通常与防火墙有关。 Docker为我们做了很多防火墙配置,因此我们不必自己处理ufw或IP表,但这也意味着我们需要指定每个容器如何通过docker compose彼此交互。 / p>

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

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

完成此操作后,只需确保按照@dbrumann所指出的那样正确配置参数文件,database_password应该包含您的密码而不是空值。

为您的Docker项目创建自定义网络也是一种好习惯,这样您就可以在容器之间使用漂亮的私有局域网,而无需使用docker的默认网络打开任何其他容器,具有默认值的自定义网络可以很好地完成工作,像这样:

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

networks:
  my_project_network:

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

希望这会有所帮助,如果您想了解更多,这是指向docker网络文档的链接:https://docs.docker.com/compose/compose-file/#network-configuration-reference