【问题标题】:Using Docker and Laravel I got this error with MySQL: “SQLSTATE[HY000] [2002] No such file or directory”使用 Docker 和 Laravel 我在 MySQL 中遇到了这个错误:“SQLSTATE[HY000] [2002] No such file or directory”
【发布时间】:2019-05-02 17:11:33
【问题描述】:

我在 laravel 5.2 中有一个应用程序可以连接到我在 mysql 中的 local 数据库,没有问题。但是,当我将我的应用程序放入 docker 容器中时,无法连接到我的数据库并出现此错误:

SQLSTATE[HY000] [2002] No such file or directory

如果我将 .env 文件中的 DB_HOST 更改为 127.0.0.1 而不是 localhost,那么我得到了另一个:

SQLSTATE[HY000] [2002] Connection refused

我读到这个问题可能是 php.ini 中的套接字路径

$ ls -l /var/run/mysqld/mysqld.sock
$ srwxrwxrwx 1 mysql mysql 0 nov 27 08:31 /var/run/mysqld/mysqld.sock

所以,我只包括在 pdo 的情况下:

; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
; http://php.net/pdo_mysql.default-socket
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock

我的 .env 的一部分

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=developer
DB_PASSWORD=123456

我的数据库.php

'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,
    ],

我使用docker compose来挂载容器,因为我打算以后创建其他微服务:

version: "3.3"
services:
   api_test:
      build: .
      ports:
         - "8181:8181"
      env_file:
         - ./.env
      environment:
         - PORT:8181

我的 Dockerfile:

FROM php:7.1.5-apache

RUN apt-get update -y && apt-get install -y openssl zip unzip git
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN docker-php-ext-install pdo pdo_mysql mbstring
WORKDIR /api_test
COPY . /api_test
RUN composer install
RUN a2enmod rewrite
CMD php artisan serve --host=0.0.0.0 --port=8181
EXPOSE 8181

我用:

  • Debian 9.6,内核 4.9.0-8-amd64

  • Apache/2.4.25

  • PHP 7.0.30-0+deb9u1

  • MariaDB 10.1.37 数据库服务器

有什么想法吗?

【问题讨论】:

  • 如果我理解正确,应该包含 Docker,您不应该尝试从您的主机访问套接字或任何文件。
  • 我试过了,以防万一。但它没有用。

标签: php mysql laravel docker


【解决方案1】:

你可以使用这个命令

docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

容器将通过它们的 ip 相互连接

例如: 我的ip列表是:

/nginx - 172.23.0.4

/php - 172.23.0.3

/mysql - 172.23.0.2

把这个ip地址(mysql ip)放到你的配置文件中,而不是127.0.0.1。希望对您有所帮助!

【讨论】:

  • 所以错误肯定出在网络上。有趣的是,如果我用 datagrip 连接到 localhost 连接是成功的,但是如果我尝试用 laravel 连接它会给我错误,我必须使用这个解决方案。
【解决方案2】:

我找到了解决方案。或者,一个适合我的。我找到了herehere

问题是远程访问我的本地 mysql 数据库。我的容器网络与我的本地网络不同。而且,我无权接受来自外部的连接。

我的.cnf

[mysqld]
bind-address = 0.0.0.0

权限

mysql> grant all privileges on *.* to 'developer'@'%' identified by '123456';
mysql> flush privileges;

已编辑

我忘记添加通过我的本地 IP(从我的路由器分配的 ip)更改我的 DB_HOST 到我的 .env 文件也是必要的。

【讨论】:

    【解决方案3】:

    如果您在容器中,则 localhost 或 127.0.0.1 不正确,因为您的容器将在容器内部调用,而不是在您的主机中调用。

    您必须使用ifconfig 命令获取您的本地IP,当然是“192.168 ....”并用这个IP 替换localhost。

    你也可以在容器中创建你的数据库,更简单。

    【讨论】:

    • 我已经按照另一个论坛的建议尝试过。并且,在容器中创建数据库是下一步。但我想先解决这个问题
    • 尝试在 3306 端口上执行 telnet 命令后,尝试从您的容器 ping 此 IP,如果没问题,请确保您的 env 变量在容器内使用“env”命令导出
    猜你喜欢
    • 2019-07-24
    • 1970-01-01
    • 2023-04-01
    • 2020-10-03
    • 2015-04-04
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多