Php 使用Docker和Laravel,我在MySQL中遇到了这个错误:“;SQLSTATE[HY000][2002]没有这样的文件或目录”;

Php 使用Docker和Laravel,我在MySQL中遇到了这个错误:“;SQLSTATE[HY000][2002]没有这样的文件或目录”;,php,mysql,laravel,docker,Php,Mysql,Laravel,Docker,我在laravel 5.2中有一个应用程序,可以连接到mysql中的本地数据库,没有问题。但是,当我将我的应用程序放在docker容器中时,无法连接到我的数据库,因此出现以下错误: SQLSTATE[HY000] [2002] No such file or directory 如果我将.env文件中的DB_HOST改为127.0.0.1而不是localhost,那么我得到了另一个: SQLSTATE[HY000] [2002] Connection refused 我了解到问题可能是php

我在laravel 5.2中有一个应用程序,可以连接到mysql中的本地数据库,没有问题。但是,当我将我的应用程序放在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
My database.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数据库服务器


有什么想法吗?

localhost或127.0.0.1在容器中是不正确的,因为容器将在容器中调用,而不是在主机中调用

您必须使用
ifconfig
命令获取本地IP,当然是“192.168…”,并用该IP替换本地主机


您还可以在容器中创建数据库,这更简单。

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

您必须使用
ifconfig
命令获取本地IP,当然是“192.168…”,并用该IP替换本地主机


您还可以在容器中创建数据库,这更简单。

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

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

我的

[mysqld]
bind-address = 0.0.0.0
权限

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


我忘了将我的本地IP(从路由器的指定IP)更改我的DB_主机到.env文件也是必要的。

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

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

我的

[mysqld]
bind-address = 0.0.0.0
权限

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


我忘了添加以下内容:通过本地IP(从路由器的指定IP)将DB_主机更改为.env文件也是必要的。

您可以使用此命令

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。希望它能帮助你

您可以使用此命令

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。希望它能帮助你

如果我理解正确,Docker应该被包含,你不应该试图从你的主机访问套接字或任何文件。我试过了,以防万一。但它不起作用。如果我理解正确,Docker应该被包含,你不应该试图从你的主机访问套接字或任何文件。我试过了,以防万一。但它不起作用。我已经按照另一个论坛的建议尝试过了。下一步是在容器中创建数据库。但我想首先解决这个问题,尝试从您的容器ping这个IP,然后尝试在端口3306上执行telnet命令,如果可以,请确保您的env变量在您的容器中使用“env”命令导出。我已经按照另一个论坛的建议尝试过了。下一步是在容器中创建数据库。但我想首先解决这个问题,尝试从容器ping这个IP,然后尝试在端口3306上执行telnet命令,如果这是正确的,请确保在容器中使用“env”命令导出您的env变量,因为错误一定在网络中。有趣的是,如果我使用datagrip连接到localhost,连接是成功的,但是如果我尝试使用laravel连接,则会出现错误,我必须使用此解决方案。因此,错误一定在网络中。有趣的是,如果我使用datagrip连接到localhost,连接是成功的,但是如果我尝试使用laravel连接,则会出现错误,我必须使用此解决方案。