Docker php DPO to MariaDB - Error: Could not find driver

Docker php DPO to MariaDB - Error: Could not find driver

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

这是我的 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

我在这里看到 post:。这个问题和我的很相似,但它对我不起作用。

注意: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 就可以解决这个问题,那就太好了。 但如果必须的话,我会的。这不是问题。

docker-compose 是 Dockerfile 的 "api" 类型。您需要在 Dockerfile

中添加这些库(apt-get 等...)

Dockerfile 是你的朋友!

你的PHP文件一个docker容器里面吗运行外面 docker,在主机里面?

如果它在 运行 内部 docker 容器中,它在哪个服务中?请注意 nginx 服务没有 "links" 配置,这意味着它只能通过 "database" 主机名访问数据库。还要检查 端口 (在此 post 的末尾)。

如果您的 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分钟,而且它不会再困扰你了。

A 找到了解决方案。

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

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

在 phpfpm 容器内(可通过命令 docker-compose run --rm <container-name> 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 文件的目录的路径)。

它非常适合我。