docker symfony mysql:sqlstate[hy000][2002]连接被拒绝

lokaqttq  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(410)

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

docker exec -it <php container id> bash

然后跑

composer install

所有的

php bin/console doctrine:<>

命令没有数据库错误或连接问题。当我试图在浏览器中实际加载站点时,我遇到了“sqlstate[hy000][2002]connection-rejected”错误。我不太清楚为什么会这样,我在网上找到的结果似乎都不管用。这是我的档案:
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:

参数.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”,我觉得这很有趣。
任何可能出错的帮助都将不胜感激。

eoigrqb6

eoigrqb61#

sup,我还不能评论,因为我是新来的,所以我会猜测你的应用程序没有问题。
这类问题通常与防火墙相关。docker为我们做了很多防火墙配置,所以我们不必自己处理ufw或ip表,但这也意味着我们需要指定每个容器如何使用docker compose文件进行交互。
您必须指定应用程序容器链接到数据库容器,以便允许主机命名访问,因为docker修改了容器 /etc/hosts 每次启动一个容器时,它都会将每个容器Map到当前ip,如下所示:

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

完成后,您只需确保参数文件配置正确,正如@dbrumann所指出的,数据库密码应该包含您的密码,而不是空值。
为docker项目创建自定义网络也是一种很好的做法,这样您就可以在容器之间拥有一个很好的专用lan,而不必使用docker的默认网络对任何其他容器开放,具有默认值的自定义网络可以很好地完成此任务,如下所示:

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

networks:
  my_project_network:

您实际上不需要将数据库端口公开给主机就可以工作,但是公开它会使检查数据库时的开发方式更容易,所以在进入生产环境时请记住删除database container ports语句,以避免安全问题。
希望这对您有所帮助,以下是docker network文档的链接,以防您想了解更多:https://docs.docker.com/compose/compose-file/#network-配置参考

相关问题