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

标签 php mysql docker-compose pdo mariadb

我有一个本地 Docker 组合堆栈,在我的机器上运行 MariaDB、PHP-FPM 和 Nginx 以进行本地开发。 我可以在我的浏览器上成功访问 http://localhost:8080/上 Nginx 服务的网页。 我还可以在主机 127.0.0.1、端口 8889 上使用本地 GUI DB 浏览器 TablePlus 成功连接到数据库。它使用用户 root 和密码 root(但是奇怪的是,没有将任何其他用户设置为我在 Docker compose 中捕获的 MYSQL_USER、MYSQL_PASSWORD env 变量。

无论如何,当我尝试使用以下 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 回答,因为与数据库的连接是从一个 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');

关于php - 无法使用 PHP PDO 连接到使用 Docker 运行的本地 MariaDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71230710/

相关文章:

PHP ( Wordpress) - 选择多个 - 显示 "selected"状态不工作

php - 错误 4600 Zoho CRM 使用 cURL 插入记录

php - 从 PHP 访问 Hadoop

mysql - 查询表达式 'tblPlayerstatistics.MatchID = tblGameResults.MatchID COUNT tblPLayerStatistics.TwoPOinterMad.' 中存在语法错误(缺少运算符)

docker - 如何使用 docker-compose 分配 IPv6 地址

php - 发布 HTML 表单后重定向

PHP 检查单选按钮是否被点击

php - 无法通过post方法携带表单值

mysql - Bamboo 中的 mysql docker 镜像访问被拒绝

docker - 如何在 Docker Compose 中使用卷在主机和容器之间共享数据