【问题标题】:Laravel with Docker issue connecting MySQLLaravel 与 Docker 问题连接 MySQL
【发布时间】:2019-05-24 02:03:56
【问题描述】:

我使用 Docker 设置 Laravel 的步骤:在我的本地系统中,我没有安装 PHP、Composer、Apache、MySQL、phpMyAdmin 等。我的系统中只安装了 Git 和 Docker。

  1. git clone https://github.com/laravel/laravel.git

  2. 在项目根目录创建 docker-composer.yml 文件。

    version: "3"
    services:
      db:
      image: mysql:5.7
      environment:
        MYSQL_ROOT_PASSWORD: pass
        MYSQL_DATABASE: db
        MYSQL_USER: root
        MYSQL_PASSWORD: pass
      ports:
        - "3306:3306"
    
    web:
      image: php:7.2.2-apache
      container_name: web_laravel
      depends_on:
        - db
      volumes:
        - ./:/var/www/html/
      ports:
        - "4000:80"
      stdin_open: true
      tty: true
    
    phpmyadmin:
      image: phpmyadmin/phpmyadmin
      depends_on:
        - db
      external_links:
        - db:mysql
      ports:
        - "9191:80"
      environment:
        MYSQL_USER: root
        MYSQL_PASSWORD: pass
        MYSQL_ROOT_PASSWORD: pass
        PMA_HOST: db
    
  3. 从项目根目录运行命令。

    docker-compose up
    

    此命令将从本地缓存或 Docker Hub 中获取所有图像(php:7.2.2-apache、phpmyadmin/phpmyadmin、mysql:5.7)并为这些图像启动三个容器。

    现在我需要与名为 web_laravel 的 php:7.2.2-apache 镜像容器进行交互(参见 yml 文件),这样我就可以添加 PHP 扩展和 Composer 来运行 Laravel 项目。

  4. 运行此命令。

    docker exec -it web_laravel /bin/bash
    

    现在我可以在运行 web_laravel 容器中运行任何命令,因此我安装了 Composer 和 PHP 扩展,如 mbstrings、pdo、pdo_mysql 等。

    然后使用 composer install 安装 Laravel 依赖,设置 storage 和 bootstrap/cache 文件夹的权限并运行 php artisan key:generate。

    打开 localhost:4000 就可以看到 Laravel 主页了:

此时一切都很好。当我连接到我的数据库时,问题就开始了。

下一个要运行的命令(我还在容器中):

  php artisan migrate

错误是:

 Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables where table_schema = blog and table_name = migrations)

 Illuminate\Database\QueryException  : could not find driver (SQL: select * from information_schema.tables where table_schema = blog and table_name = migrations)

我能够打开 phpMyAdmin (http://localhost:9191) 并可以创建数据库、表和操作相关的数据库。我的数据库名为 blog。

MySQL 环境变量:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=blog
DB_USERNAME=root
DB_PASSWORD=pass

【问题讨论】:

标签: php mysql docker laravel-5 docker-compose


【解决方案1】:

我认为你有几个问题,首先是 laravel .env 配置应该指向 MySQL 容器,而不是 localhost

DB_HOST=127.0.0.1

应该是

DB_HOST=db

而你所说的另一个错误,与 Docker 无关

Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] 没有这样的 文件或目录(SQL:select * from information_schema.tables where table_schema = 博客和 table_name = 迁移)

Illuminate\Database\QueryException : 找不到驱动程序 (SQL: select * from information_schema.tables where table_schema = blog and table_name = 迁移)

这可能与缺少依赖项有关,您应该运行

composer require doctrine/dbal

另外,你说:

现在我可以在运行 web_laravel 容器中运行任何命令 所以我安装了 composer 和 php 扩展,比如 mbstrings、pdo、 pdo_mysql 等

您应该在 PHP 7/Apache 镜像之上构建您的镜像,并将它们添加到构建 dockerfile,因为您的更改(php 扩展、配置...等)不是持久的。我建议你使用Laradock 或任何其他现有的 Laravel/docker 环境。

【讨论】:

  • 仍然无法正常工作。我不想使用 Laradock。我想创建自己的开发环境。您的建议是在 PHP 7/Apache 之上构建图像的良好反馈。
  • 我无法连接 mysql 并显示相同的错误。
  • 我会进一步调试,隔离 2 个问题,您可以在 PHP 容器上安装 mysql-cli,然后尝试从那里连接,如果可以使用 mysql -h db -u root -p,然后连接两个容器很好,但是留下了 laravel 依赖问题。或者您可以将压缩版本的 phpmyadmin 抓取到 PHP 容器中,然后查看它是否连接到 MySQL 容器。我认为您的问题是 laravel 依赖项,您可以尝试从 PHPMyAdmin 手动创建一个表,例如 users 表,并在其上运行任何 UserModel::all() 以查看它是否提取数据,那么问题是仅在运行迁移时
【解决方案2】:

在我的 Docker-compose.yml 中,我添加了这个:

phpmyadmin:
        image: 'phpmyadmin/phpmyadmin'
        links:
            - mysql:mysql
        ports:
            - 8080:80
        environment:
            MYSQL_USERNAME: "${DB_USERNAME}"
            MYSQL_ROOT_PASSWORD: "${DB_PASSWORD}"
            PMA_HOST: mysql
        networks:
            - sail

在我的 Laravel 环境中:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=teram_a_notificationdemo
DB_USERNAME=sail
DB_PASSWORD=password

您必须将 DB_HOST=mysql 更改为 DB_HOST=127.0.0.1

【讨论】:

    【解决方案3】:

    试试 DB_HOST=host.docker.internal

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2020-04-17
    • 2018-06-27
    • 2019-08-21
    • 1970-01-01
    • 2022-01-05
    相关资源
    最近更新 更多