【问题标题】:Docker php DPO to MariaDB - Error: Could not find driverDocker php DPO 到 MariaDB - 错误:找不到驱动程序
【发布时间】:2019-10-19 20:40:34
【问题描述】:

我现在正在学习 PDO,我发现在我的 Ubuntu 18.04LTS 上的 LEMP docker 堆栈(Nginx、php-fpm、MariaDB、phpMyadmin)中学习它会更好。

这是我的 php 文件:

<?php
try {
  $mydb = new PDO('mysql:host=database;dbname=mysql;charset=utf8', 'root', 'admin');
} catch (Exception $e) {
  die('Error : ' . $e->getMessage());
}
?>             

如您所见,我尝试在我的 php 代码中创建一个 PDO 以从我的数据库中恢复一些数据。 但是每次我在浏览器(Firefox 69.0.2)上收到该消息时: Error : could not find driver

我在这里看到了那个帖子:"Docker can't connect to mariadb with PHP"。这个问题和我的很相似,但对我没有用。

注意:php-fmp 和 Nginx 可以完美地协同工作。 MariaDB 和 phpMyAdmin 也是如此。

这是我的docker-compose.yml 文件:

version: "3"
services:

  nginx:
    image: tutum/nginx
    ports:
      - "7050:80"
    links:
      - phpfpm
    volumes:
      - ./nginx/default:/etc/nginx/sites-available/default
      - ./nginx/default:/etc/nginx/sites-enabled/default

      - ./logs/nginx-error.log:/var/log/nginx/error.log
      - ./logs/nginx-access.log:/var/log/nginx/access.log

  phpfpm:
    image: php:fpm
    links:
      - database:mysql
    ports:
      - "7051:9000"
    volumes:
      - ./public:/usr/share/nginx/html

  database:
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: admin
    ports:
      - "7052:3306"

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    links:
      - database:mysql
    ports:
      - "7053:80"
    environment:
      PMA_HOST: mysql
      PMA_USER: root
      PMA_PASSWORD: admin
      PMA_ARBITRARY: 1

如果可以在不构建我自己的 Dockerfile 的情况下解决这个问题,那就太好了。 但如果我必须,我会的。这不是问题。

【问题讨论】:

    标签: php mysql docker-compose mariadb fpm


    【解决方案1】:

    docker-compose 是 Dockerfile 的一种“api”。您需要在 Dockerfile 中添加这些库(apt-get 等...)

    Dockerfile 是你的朋友!

    【讨论】:

    • 在容器中安装库究竟如何解决 OP 的问题?
    • 因为没有为您的数据库安装正确的库,如 mysqli 或 pdo,将给出相同的错误。通常你会看到容器作者将这些命令放在一个独立的 dockerfile 中
    • 啊,我明白了。显然他们需要安装mysql驱动程序。也许你可以在你的回答中澄清这一点。
    【解决方案2】:

    您的 PHP 文件内部是 docker 容器还是它是否在主机中的 外部docker 运行?

    如果它在内部 docker 容器中运行,它在哪个服务中?请注意nginx 服务没有“链接”配置,这意味着它仅通过“数据库”主机名访问数据库。检查端口(在本文末尾)。

    如果您的 PHP 文件在 外部 运行,那么您必须在连接字符串中使用 localhost 而不是 mysql,例如:'mysql:host=localhost;dbname=mysql;charset=utf8'。这是因为 docker 的内部 DNS 就是:内部的。您无法在 docker 之外访问此主机名(数据库或 mysql)。

    同样重要的是,您的连接字符串未指定端口,在您的情况下为 7052。由于您是从 7052 重定向到 3306,因此我认为 3306 是 mysql 的默认端口,如果您不指定,驱动程序假定为 3306。明确主机和端口总是一个好主意。检查有关它的 PHP 数据库连接字符串的文档(因为我对 php 一无所知)。可能是...;port=7052 之类的。

    另外,请阅读您正在使用的 docker-compose links。它现在已弃用,因此我建议不要在以后的项目中使用它,我什至建议花一些时间将其删除。如果一切顺利,应该需要大约 30 秒到 5 分钟,并且不会再困扰您了。

    【讨论】:

      【解决方案3】:

      A 找到了解决方案。

      首先,主机必须是mysql,而不是我的容器的名称(即database):

      $mydb = new PDO('mysql:host=mysql;dbname=mysql;charset=utf8', 'root', 'admin');
      

      在 phpfpm 容器内(可通过命令 docker-compose run --rm &lt;container-name&gt; bash 访问),我必须通过删除行首的分号来启用配置文件 php.ini 中的 extension=php_pdo_msql 行。

      为避免每次在docker-compose up 之后手动执行此操作,我将docker-compose.yml 文件中的 phpfpm 服务替换为以下Dockerfile

      FROM php:fpm
      RUN docker-php-ext-install pdo pdo_mysql
      

      最后,只需使用命令docker-compose build . 构建映像(将. 替换为包含docker-compose.yml 文件的目录的路径)。

      它非常适合我。

      【讨论】:

        猜你喜欢
        • 2021-05-24
        • 1970-01-01
        • 2018-08-15
        • 2019-01-17
        • 2021-08-24
        • 2019-11-07
        • 2022-12-14
        • 2016-08-30
        • 1970-01-01
        相关资源
        最近更新 更多