Laravel 与 Docker 连接 MySQL 的问题

Dha*_*val 7 php mysql docker laravel-5 docker-compose

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

  1. git 克隆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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从项目根运行命令。

    docker-compose up
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  4. 运行这个命令。

    docker exec -it web_laravel /bin/bash
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

    在此输入图像描述

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

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

  php artisan migrate
Run Code Online (Sandbox Code Playgroud)

错误是:

 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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

我可以打开 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
Run Code Online (Sandbox Code Playgroud)

Ami*_*min 5

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

DB_HOST=127.0.0.1

应该

DB_HOST=db

你提到的另一个错误与 Docker 无关

Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] 没有这样的文件或目录(SQL:从 information_schema.tables 中选择 *,其中 table_schema = blog 且 table_name = 迁移)

Illuminate\Database\QueryException :找不到驱动程序(SQL:从 information_schema.tables 中选择 *,其中 table_schema = blog 且 table_name = 迁移)

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

composer require doctrine/dbal

另外,你还说:

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

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


小智 5

尝试 DB_HOST=host.docker.internal


里面docker-compose.yml

 environment:
      - DB_HOST=host.docker.internal
Run Code Online (Sandbox Code Playgroud)

作品也。