我在本地使用 Docker-compose 来运行 MariaDB、PHP-FPM 和 Nginx 进行开发。通过在浏览器中访问 http://localhost:8080/,可以成功地访问 Nginx 提供的网页页面。同时,我还能够在本地使用 TablePlus 作为 GUI 数据库浏览器,通过主机 127.0.0.1、端口 8889 成功连接到数据库(这个用户是
root
,密码也是 root
,但是奇怪的是,如果将 MYSQL_USER 和 MYSQL_PASSWORD 设置为其他用户名时,Docker-compose 将不能正确地捕获这些环境变量)。
然而,当我尝试使用以下 PHP 代码来连接数据库,并使用相同的凭据时:
$db = new PDO('mysql:host=localhost;port=8889;dbname=words', 'root', 'root');
我遇到了Error: SQLSTATE[HY000] [2002] No such file or directory
的问题。
编辑:当我使用以下代码时:
$db = new PDO('mysql:host=127.0.0.1;port=8889;dbname=words', 'root', 'root');
我收到了一个错误信息:Error: SQLSTATE[HY000] [2002] Connection refused
为什么会出现这个错误呢?
以下是我的Docker Compose文件:
version: "3"
services:
mariadb:
image: mariadb:10.5
container_name: mariadb-10.5
restart: unless-stopped
ports:
# port 3306 is the default port for mariadb, forwarded to 8889 on the local machine
- 8889:3306
volumes:
- ./mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
php-fpm:
image: bitnami/php-fpm:7.4
container_name: phpfpm-7.4
restart: unless-stopped
ports:
- 9000:9000
volumes:
- ${WWW_DOCUMENT_ROOT}:/app
nginx:
image: bitnami/nginx:1.20
container_name: nginx-1.20
restart: always
ports:
- 8080:8080
volumes:
- ./nginx/logs:/opt/bitnami/nginx/logs/
- ./nginx/server-blocks/default.conf:/opt/bitnami/nginx/conf/server_blocks/default.conf:ro
- ${WWW_DOCUMENT_ROOT}:/app
depends_on:
- mariadb
- php-fpm
)
user@localhost
或user@10.%
相关联,例如产生不同的响应。防火墙、Selinux可能需要进一步缩小范围,我也不了解任何Docker方面的内容。 - ficuscrMYSQL_USER
会创建一个$MYSQL_USER@%
用户,因此可以访问该用户。 - danblack