无法从 Laravel 的自定义 docker 工作区连接到数据库 -> SQLSTATE[HY000] [2002] 连接被拒绝



我试图在我的synology NAS上为laravel设置docker工作区。但网页上出现SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = projectdb and table_name = admin_config and table_type = 'BASE TABLE')错误。

  1. 我在一个docker网络中设置mariadb+adminer+nginx+php:7.4-fpm
version: '3.5'
services:
mariadb: 
image: mariadb
container_name: mariadb
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
TZ: ${WORKSPACE_TIMEZONE}
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/dump:/dump
- ./mysql/logs:/var/log/mysql
ports:
- 3306:3306 # Initially I don't have that. Just add for debugging on step 4.
networks:
- internal

adminer:
image: adminer
container_name: adminer
ports:
- 8080:8080
networks:
- internal

nginx:
container_name: nginx
build:
context: ./nginx
depends_on:
- php
environment:
TZ: ${WORKSPACE_TIMEZONE}
working_dir: /var/www
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/logs:/var/log/nginx/
- ${PROJECTS}:/var/www
- ${SSL_CERT_PROJECT1}:/etc/ssl/private/project1.lan
- ${PROJECTS}/project1.lan/storage/app/public/:/var/www/project1.lan/public/storage/
ports:
- 82:80
- 444:443
networks:
- internal

php: 
container_name: php
build:
context: ./php
working_dir: /var/www
environment:
XDEBUG_CONFIG: "remote_host=192.168.220.1 remote_enable=1"
PHP_IDE_CONFIG: "serverName=Docker"
TZ: ${WORKSPACE_TIMEZONE}
volumes:
- ./.ssh:/home/www-data/.ssh
- ${PROJECTS}:/var/www
extra_hosts:
- 'project1.lan:192.168.1.2' 
- 'project2.lan:192.168.1.2' 
networks:
- internal
networks:
internal:
name: webserver
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.220.0/28

.env for docker compose

DB_DATABASE=server
DB_USERNAME=user
DB_PASSWORD=123456
WORKSPACE_TIMEZONE=Europe/Moscow
PROJECTS=/volume1/web
SSL_CERT_PROJECT1=/usr/syno/etc/certificate/_archive/LZ4CDy

nginx Dockerfile

FROM nginx
RUN mkdir -p /etc/ssl/private/project1.lan
WORKDIR /var/www

php Dockerfile

FROM php:7.4-fpm
RUN apt-get update && apt-get install -y 
wget git nano unzip imagemagick nodejs npm 
libpq-dev libicu-dev libpng-dev libzip-dev libjpeg-dev libfreetype6-dev 
&& pecl install xdebug-2.9.1 
&& docker-php-ext-enable xdebug 
&& docker-php-ext-install zip 
&& docker-php-ext-install gd 
&& docker-php-ext-install bcmath 
&& docker-php-ext-install mysqli 
&& docker-php-ext-install pdo_mysql 
&& docker-php-ext-install pdo_pgsql 
&& docker-php-ext-install pgsql 
&& docker-php-ext-enable pgsql 
ADD ./php.ini /usr/local/etc/php/php.ini
RUN wget https://getcomposer.org/installer -O - -q 
| php -- --install-dir=/bin --filename=composer --quiet

WORKDIR /var/www

它正在发挥作用。我使用project1.lan文件夹中的phpinfo文件进行了测试。

  1. 我将我的laravel文件夹project1.lan从笔记本电脑(我现在使用laragon进行本地开发(复制到Synology上的/volume1/web

  2. 我导出了projectdb数据库,并在根用户下使用Adminer导入了它。首先,我尝试了简单的user,但在导入过程中出现了访问权限错误,于是我切换到了root

  3. 我把它放在laravel.env文件中,因为我希望它由php从同一网络中的容器中处理,并且应该了解mariadb位于的位置

DB_CONNECTION=mysql
DB_HOST=mariadb
DB_PORT=3306
DB_DATABASE=projectdb
DB_USERNAME=root
DB_PASSWORD=123456

然后在网页上我看到连接错误SQLSTATE[HY000] [2002] Connection refused

为了理解如何解决这个问题,我尝试在容器外映射端口3306,并尝试将这些值放入laravel 的.env文件中

DB_HOST=mariadb
DB_HOST=127.0.0.1
DB_HOST=localhost

但结果总是一样的。

我也试过做

docker-compose exec "php" php project1.lan/artisan config:cache
docker-compose exec "php" php project1.lan/artisan config:clear

但我又一次在终端看到SQLSTATE[HY000] [2002] Connection refused

  1. 然后我尝试使用127.0.0.1或localhost使用adminer连接到mariadbhttp://localhost或http://127.0.0.1.但我总是得了SQLSTATE[HY000] [2002]

最后我只找到了两个选项如何通过Adminer连接到mariadb。首先是server=mariadb。第二个是当端口3306映射到mariadb容器外部时的server=192.168.1.2。但无论如何,DB_HOST=192.168.1.2在laravel.env文件中不起作用。

我认为问题在于Laravel根本看不到sql数据库,但我不知道如何调试它并找到解决方案。

确保您的数据库中有数据库容器IP地址的授权(即使它是127.0.0.1,而不仅仅是"localhost"(。

相关内容

最新更新