Laravel 项目 使用 Windows docker 运行php 容器 及 mysql 容器时,连不起数据库。
问题
Laravel 项目 使用 Windows docker 运行php 容器 及 mysql 容器时, 在windows git bash 执行 php artisan migrate 发现找不到数据库。
补充
由于本项目需要做负载均衡所以DB_HOST写的是 DB_HOST=’mysql’ 容器, 如果不走容器负载均衡,本地修改成DB_HOST=127.0.0.1 即可, 不用重新封装命令。
报错信息:
Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: 未知 (SQL: select * from ***)
at E:\project\vendor\laravel\framework\src\Illuminate\Database\Connection.php:669
665| // If an exception occurs when attempting to run a query, we'll format the error
666| // message to include the bindings with SQL, which will make this exception a
667| // lot more helpful to the developer instead of just the database's errors.
668| catch (Exception $e) {
> 669| throw new QueryException(
670| $query, $this->prepareBindings($bindings), $e
671| );
672| }
673|
Exception trace:
1 Doctrine\DBAL\Driver\PDOException::("SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: 知 ")
E:\project\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\PDOConnection.php:31
2 PDOException::("PDO::__construct(): php_network_getaddresses: getaddrinfo failed: 知 ")
E:\project\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\PDOConnection.php:27
Please use the argument -v to see more details.
原因
windows 下执行 php artisan migrate 时连不到容器里的mysql
解决
重新写一个shell 命令封装一下 php artisan 命令, 进行容器后执行php artisan 如下:
phpartisan 文件内容
#!/usr/bin/env sh
# 进入容器 执行相应php artisan命令
docker exec -i 容器名称 sh -c "cd /项目的容器路径 && php artisan $*"
执行 php artisan * 命令 换成 phpartisan *即可
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
将mysql服务的端口暴露出来,.env文件通过宿主机ip和端口连接mysql,这样你的windows电脑就可以连过去了。
你的docker基础知识需要恶补啊
最简单的用docker-compose 就可以了,然后可以多个apache或者phpfpm连接一个mysql
应该进入docker容器中再执行php artisan migrate,如果是外部直接执行就会链接不上
windows环境用127.0.0.1连接就行,docker容器内就要用mysql来连接
请补习docker基础知识。蟹蟹
1、windows navicat 是宿主机环境,如果你 docker 把 port 映射出来了,那你 navicat 用的链接信息是啥?盲猜 host 是 127.0.0.1
2、windows 上跑
php artisan migrate,是因为是.env配置的是HOST=mysql。但是请牢记HOST=mysql,是需要在容器内才能访问的。因为 docker 和宿主机网络环境是隔离的。所以你有两个选择,我们来看下:
选择1、laravel 项目
.env配置HOST=127.0.01php artisan命令在 windows CLI 里执行选择2、laravel 项目
.env配置HOST=mysqlphp artisan在容器里执行总之,一定要牢记,网络环境是隔离的。你指出的
host=mysql一定是需要在容器创建的 Network 环境下访问。你可以理解为mysql是一个 DNS,在容器指定的 Network 下,他自动帮你映射到对应的 IP 了可以连接了,之前DB_HOST配置写的 容器名称,所以连不上,本地,改成127.0.0.1 就可以了
我原来用docker部署环境,安装thinkcmf,mysql用127.0.0.1也是连不上。后来才知道各容器之间是不通的,所以想使用mysql, 地址就写mysql的容器名就能连上。
你如果用了容器编排就可以用名字 不然用ip地址就行了