Php 使用Docker和Laravel,我在MySQL中遇到了这个错误:“;SQLSTATE[HY000][2002]没有这样的文件或目录”;
我在laravel 5.2中有一个应用程序,可以连接到mysql中的本地数据库,没有问题。但是,当我将我的应用程序放在docker容器中时,无法连接到我的数据库,因此出现以下错误: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
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连接,则会出现错误,我必须使用此解决方案。