我在我的机器上运行了一个带有MariaDB、PHP和Nginx的本地Docker组合堆栈,以便进行本地开发。我可以在浏览器上成功地访问Nginx在http://localhost:8080/上提供的网页。我还可以在主机127.0.0.1、端口8889上使用本地GUI浏览器TablePlus成功地连接到数据库。它适用于用户root和密码root (但奇怪的是,它不适用于我在Docker中捕获的任何其他用户设置为MYSQL_USER、MYSQL_PASSWORD env变量)。
无论如何,当我尝试使用以下PHP代码连接PHP/PDO时,相同的凭据:
$db = new PDO('mysql:host=localhost;port=8889;dbname=words', 'root', 'root');...I get Error: SQLSTATE[HY000] [2002] No such file or directory
编辑:当我使用:
$db = new PDO('mysql:host=127.0.0.1;port=8889;dbname=words', 'root', 'root');...I get Error: SQLSTATE[HY000] [2002] Connection refused
为什么?
(这是我的Docker撰写文件:
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)
发布于 2022-02-23 07:29:47
正如@danblack所回答的那样,由于到DB的连接是从Docker容器内部连接到另一个容器的:
容器之间的
。
数据库的主机名必须是DB容器名(在本例中是MariaDB容器名称mariadb-10.5),而不是127.0.0.1或mariadb-10.5。
因此,总的来说,PHP/PDO连接对象变成:
$db = new PDO('mysql:host=mariadb-10.5;dbname=words', 'root', 'root');https://stackoverflow.com/questions/71230710
复制相似问题