【问题标题】:SQLSTATE[HY000] [2002] Connection refused on laravel and docker setupSQLSTATE[HY000] [2002] 在 laravel 和 docker 设置上连接被拒绝
【发布时间】:2020-10-22 17:01:30
【问题描述】:

我正在尝试为 laravel 开发设置一个 docker 环境。我遇到了 migrate 命令的问题。我正在向她粘贴 compose 文件和 env 文件。我认为我的设置是正确的,因为如果我从控制器执行正常的数据库操作,那么数据库连接工作正常。它仅使用 migrate 命令给出错误。 我的 compose 文件中也有 artisan,因为我想将所有内容都保存在容器中。


networks:
  laravel:

services:
  nginx:
    image: nginx:stable-alpine
    container_name: nginx
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
      - mysql
    networks:
      - laravel

  mysql:
    image: mysql:5.7.29
    container_name: mysql
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: homestead
      MYSQL_USER: homestead
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - ./mysql:/var/lib/mysql
    networks:
      - laravel

  php:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: php
    volumes:
      - ./src:/var/www/html
      - ./src/php/ini:/usr/local/etc/php
    ports:
      - "9000:9000"
    networks:
      - laravel

  artisan:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: artisan
    volumes:
      - ./src:/var/www/html
    depends_on:
      - mysql
    working_dir: /var/www/html
    entrypoint: ['php', '/var/www/html/artisan']
    networks:
      - laravel

我的 env 文件看起来像这样

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=root
DB_PASSWORD=secret

我的 docker 文件看起来像

FROM php:7.3-fpm-alpine
WORKDIR /var/www/html
RUN docker-php-ext-install mysqli pdo pdo_mysql && docker-php-ext-enable mysqli

当我跑步时

docker-compose run --rm artisan  migrate

然后我得到

SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations and table_type = 'BASE TABLE')

知道这里可能出了什么问题吗?

我还有一件事要分享,所以我正在编辑我的问题。

我执行了这个命令。

docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

查找所有容器的IP地址。

我在DB_HOST中使用的IP地址如下

DB_CONNECTION=mysql
DB_HOST=172.19.0.2
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=root
DB_PASSWORD=secret

它确实有效,但这不是永久的解决方案。

不知何故,docker 无法将容器名称映射到内部 IP。

我不知道根本原因。

【问题讨论】:

    标签: mysql laravel docker


    【解决方案1】:

    我可以看到您没有为您的 laravel 网络配置驱动程序。 您可以尝试将驱动桥接在您的 Laravel 网络中

    networks:
      laravel:
        driver: bridge
    

    然后在您的 .env 文件中,您可以使用容器名称代替 IP 地址

    DB_CONNECTION=mysql
    DB_HOST=mysql
    DB_PORT=3306
    DB_DATABASE=homestead
    DB_USERNAME=root
    DB_PASSWORD=secret
    

    【讨论】:

      【解决方案2】:

      我修复了将容器示例的名称放在 .env DB_HOST 上的错误:

      Docker 容器:

      basic_mysql_1

      .env

      DB_HOST=basic_mysql_1

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      • 嗨,Amm,在 docker 桌面上显示容器名称 [YOU PROYECT NAME]_mysql_1 我有一个名为“basic”的 Laravel 项目,我的容器现在是“basic_mysql_1”,在我的 .env 文件中在名为“basic”的 Laravel 项目中,我将属性值 DB_HOST 编辑为我的容器名称,就像这样,DB_HOST=basic_mysql_1,这修复了我的错误。
      猜你喜欢
      • 2017-05-04
      • 2022-10-25
      • 2017-09-20
      • 2020-03-26
      • 2020-12-04
      • 2020-02-27
      • 2016-11-03
      • 1970-01-01
      • 2019-08-21
      相关资源
      最近更新 更多