我试图在我的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')
错误。
- 我在一个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文件进行了测试。
我将我的laravel文件夹
project1.lan
从笔记本电脑(我现在使用laragon进行本地开发(复制到Synology上的/volume1/web
。我导出了
projectdb
数据库,并在根用户下使用Adminer导入了它。首先,我尝试了简单的user
,但在导入过程中出现了访问权限错误,于是我切换到了root
。我把它放在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
。
- 然后我尝试使用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"(。