4

我无法理解如何让 Laradock 与 mysql 数据库一起正常工作。

我遵循 laradock 文档并安装了所有东西,使用启动容器

docker-compose up -d nginx mysql

我有这样的多个项目版本布局

project
    +laradock-spa

php 方面似乎可以工作,我可以打开 laravel 欢迎页面,但是连接数据库会导致我出现问题。

首先,我应该在哪里运行 php artisan 命令,例如php artisan migrate?应该从我的机器在项目文件夹中运行,还是从 docker 容器中运行?

当我从我的项目文件夹中运行它时,它可以工作,我可以进入 mysql 容器并查看初始数据库表,例如migrationuser.

但是,我无法将初始 POST 发送到数据库以在 Postman 中工作 - 我收到错误SQLSTATE[HY000] [2002] No such file or directory (SQL: insert into users (...

所以我想也许我应该从工作区容器中运行迁移命令,所以我进入工作区,但是从这里php artisan migrate命令错误[Illuminate\Database\QueryException] SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schem a.tables where table_schema = spa and table_name = migrations)

正如我所说,我可以成功进入 mysql 容器,并使用 root 密码登录数据库,运行第一次迁移后,我可以看到里面的表。

docker ps显示所有容器。

有人可以解释它是如何工作的以及如何解决这个问题吗?我不确定我应该在哪里运行哪些命令,以及容器如何相互通信。但基本上,我怎样才能让 mysql 数据库在 laravel 项目中工作?

顺便说一句,我也在 PC 上运行本地 mysql,也许这会导致一些冲突/混乱?

我在 Win10 上运行所有这些。

4

2 回答 2

10

当您使用 Laradock 时,您需要将容器视为一个共享网络中的独立服务器/计算机。下图中的每个矩形代表一台服务器,它有自己的 IP 地址、自己的 Linux 系统等。因此,要从另一个容器连接到 MySQL,您需要知道该容器的 IP 地址或主机名。

幸运的是,Laradock 在后台提供了一些魔法来缓解这种情况,您可以使用 MySQL 主机名而不是在配置中提供 IP 地址。如果你想启用 Redis,你所要做的就是用 docker-compose up 启动 Redis 并在 Laravel 配置中提供 Redis 主机名。

如果涉及到故障排除, docker-compose ps 是检查正在发生的事情的最佳方法。剩下的就是对多容器概念的理解。

请注意,如果不暴露 docker-compose.yml 中的容器端口,您将无法从主机 PC 连接到容器。容器 IP 对主机不可见,因为它们属于虚拟网络,而不是连接计算机的真实网络。默认端口已在 docker-compose.yml 中公开,因此您可以在 IP 127.0.0.1 和端口 3306 访问 DB,与端口 80 上的 Nginx 相同,依此类推。

希望这现在更清楚了:)

在此处输入图像描述

于 2017-10-25T12:38:28.583 回答
4

我刚刚将 MySQL 客户端添加到工作空间容器中,因此您应该能够通过设置在其中运行迁移

WORKSPACE_INSTALL_MYSQL_CLIENT=true

在您的 .env 文件中并运行

 docker-compose build workspace

然后你可以使用

docker-compose exec workspace bash

并做你的迁移或任何你心中想要的 MySQL 魔法。

您还需要mysql在 database.php 配置中设置 mysql 主机。

并确保编辑项目的 .env 文件并添加DB_HOST=mysql.

于 2018-12-15T18:13:01.660 回答