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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 11

将mysql服务的端口暴露出来,.env文件通过宿主机ip和端口连接mysql,这样你的windows电脑就可以连过去了。

3年前 评论
vimkid (楼主) 3年前
忆往昔弹指间 (作者) 3年前
忆往昔弹指间 (作者) 3年前
vimkid (楼主) 3年前

你的docker基础知识需要恶补啊

3年前 评论
vimkid (楼主) 3年前
crackfan 3年前
vimkid (楼主) 3年前

最简单的用docker-compose 就可以了,然后可以多个apache或者phpfpm连接一个mysql

3年前 评论
vimkid (楼主) 3年前
crackfan 3年前
  • 请使用Host ip连接!
  • 就是本机真实 局域网ip
  • 容器内网ip固定的话 也是可以使用
3年前 评论
vimkid (楼主) 3年前
crackfan (作者) 3年前

应该进入docker容器中再执行php artisan migrate,如果是外部直接执行就会链接不上

3年前 评论
vimkid (楼主) 3年前

windows环境用127.0.0.1连接就行,docker容器内就要用mysql来连接

3年前 评论
vimkid (楼主) 3年前

请补习docker基础知识。蟹蟹

3年前 评论
fangmuke (作者) 3年前
vimkid (楼主) 3年前
fangmuke (作者) 3年前
vimkid (楼主) 3年前
fangmuke (作者) 3年前
rovast

就是用的docker-compose , 端口也正常开放了, windows navicat 都能正常连接, 就是跑 php artisan migrate 连不起数据库。

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.01

  1. navicat 使用 host=127.0.0.1
  2. laravel 的配置文件 host 使用 127.0.0.1
  3. php artisan 命令在 windows CLI 里执行

选择2、laravel 项目 .env 配置 HOST=mysql

  1. navicat 使用 host=mysql,无法访问
  2. laravel 配置文件 host 使用 mysql
  3. php artisan 在容器里执行

总之,一定要牢记,网络环境是隔离的。你指出的 host=mysql 一定是需要在容器创建的 Network 环境下访问。你可以理解为 mysql 是一个 DNS,在容器指定的 Network 下,他自动帮你映射到对应的 IP 了

3年前 评论
vimkid (楼主) 3年前

可以连接了,之前DB_HOST配置写的 容器名称,所以连不上,本地,改成127.0.0.1 就可以了

3年前 评论
QIN秦同学

我原来用docker部署环境,安装thinkcmf,mysql用127.0.0.1也是连不上。后来才知道各容器之间是不通的,所以想使用mysql, 地址就写mysql的容器名就能连上。

3年前 评论

你如果用了容器编排就可以用名字 不然用ip地址就行了

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!