我无法理解如何让Laradock与mysql db一起正常工作。
我已经按照laradock文档安装了所有内容,使用
启动容器docker-compose up -d nginx mysql
我有像这样的多项目版本布局
project
+laradock-spa
php端似乎有效,我可以获得laravel欢迎页面,但是连接数据库会导致我出现问题。
首先,我应该在哪里运行像php artisan migrate
这样的php工匠命令?是应该从我的机器在项目文件夹中运行,还是从docker容器中运行?
当我从我的项目文件夹运行它时,它可以工作,我可以进入mysql容器并查看初始数据库表,如migration
和user
。
但是,我无法在数据库中获得初始POST以在Postman中工作 - 我收到错误SQLSTATE[HY000] [2002] No such file or directory (SQL: insert into users (...
所以我想也许我应该从工作区容器中运行migrate命令,所以我猛冲进入工作区,但是从这里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上运行所有这些。
答案 0 :(得分:7)
当您使用Laradock时,您需要将容器视为一个共享网络中的单独服务器/计算机。下图中的每个矩形代表一个服务器,它拥有自己的IP地址,拥有自己的Linux系统等。因此,要从另一个容器连接到MySQL,您需要知道该容器的IP地址或主机名。
幸运的是,Laradock提供了一些神奇的功能来缓解这种情况,您可以使用MySQL主机名而不是在配置中提供IP地址。如果你想启用Redis,你所要做的就是用Docker-compose启动Redis并在Laravel配置中提供Redis主机名。
如果要进行故障排除,docker-compose ps是检查正在进行的操作的最佳方法。其余的是对多容器概念的理解。
请注意,如果不在docker-compose.yml中暴露容器端口,则无法从主机PC连接到容器。容器IP对主机不可见,因为它们属于虚拟网络,而不是计算机所连接的真实网络。默认端口已在docker-compose.yml中公开,因此您可以访问IP 127.0.0.1和端口3306的DB,与端口80的Nginx相同,依此类推。
希望现在更清楚了一点:)
答案 1 :(得分:2)
我只是added the MySQL client to the workspace container,因此您应该可以通过设置
在其中运行迁移WORKSPACE_INSTALL_MYSQL_CLIENT=true
在您的.env文件中并正在运行
docker-compose build workspace
然后您可以使用
docker-compose exec workspace bash
进行迁移或您心中想要的任何MySQL魔术。
您还需要在database.php配置中将mysql主机设置为mysql
。