无法连接到使用带有PHP PDO的Docker运行的本地MariaDB

2022-06-25 00:00:00 docker-compose mariadb php mysql pdo

我有一个本地的Docker Compose堆栈,在我的机器上运行着MariaDB、PHP-fpm和Nginx,用于本地开发。 我可以在我的浏览器上成功地访问http://localhost:8080/上的NGINX服务的网页。 我还可以在主机127.0.0.1、端口8889上使用本地GUIDB浏览器TablePlus成功连接到数据库。它可以使用用户root和密码root(但奇怪的是,不能使用我在Docker组合中捕获的MySQL_USER、MYSQL_PASSWORD环境变量设置的任何其他用户)。

无论如何,当我尝试使用以下PHP代码连接到PHP/PDO时,相同的凭据:

$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撰写文件:

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

)


解决方案

如@danblack所回答,因为到DB的连接是从一个docker容器内部到另一个容器:

  1. 容器之间的连接始终使用未重新映射的端口。因此,到DB容器的连接需要使用内部的MariaDB标准端口3306,而不是重新映射的公开的8889端口。

  2. 数据库的主机名必须是数据库容器名(在本例中, MariaDB容器名称mariadb-10.5),而不是127.0.0.1localhost

因此,总而言之,PHP/PDO连接对象变为:

$db = new PDO('mysql:host=mariadb-10.5;dbname=words', 'root', 'root');

相关文章