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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 11

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

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

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

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

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

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

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

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

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

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

请补习 docker 基础知识。蟹蟹

4年前 评论
fangmuke (作者) 4年前
vimkid (楼主) 4年前
fangmuke (作者) 4年前
vimkid (楼主) 4年前
fangmuke (作者) 4年前
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 了

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

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

4年前 评论
QIN秦同学

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

4年前 评论

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

4年前 评论