Docker php DPO для MariaDB - ошибка: не удалось найти драйвер - PullRequest
0 голосов
/ 19 октября 2019

Сейчас я изучаю PDO, и мне было удобнее изучать его в стеке док-станции LEMP (Nginx, php-fpm, MariaDB, phpMyadmin) в моей Ubuntu 18.04LTS.

Это мой файл php:

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

Как видите, я пытаюсь создать PDO в своем php-коде, чтобы восстановить некоторые данные из моей базы данных. Но каждый раз, когда я получал это сообщение в своем браузере (Firefox 69.0.2): Error : could not find driver

я видел это сообщение здесь: «Docker не может подключиться к mariadb с помощью 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

Если бы это можно было решить, не создавая мои собственные файлы Docker, было бы здорово. Но если я должен, я буду. Это не проблема.

Ответы [ 3 ]

0 голосов
/ 20 октября 2019

Является ли ваш файл PHP внутри контейнером Docker или , работает ли он снаружи Docker, на хост-компьютере?

Если этозапуск внутри контейнера Docker, в каком сервисе он находится? Обратите внимание, что служба nginx не имеет конфигурации «links», то есть она обращается к базе данных только через имя хоста «database». Проверьте также порт (в конце этого поста).

Если ваш PHP-файл работает за пределами , то вы должны использовать localhost вместо mysql вваша строка подключения, вот так: 'mysql:host=localhost;dbname=mysql;charset=utf8'. Это потому, что внутренний DNS докера - это просто: внутренний. Вы не можете получить доступ к этому имени хоста (базы данных или mysql) вне докера.

Не менее важно, что в строке подключения не указан порт, который в вашем случае равен 7052. Поскольку вы перенаправляете с 7052 на 3306, я думаю, что 3306 - это порт по умолчанию для mysql, а драйвер принимает значение 3306, если вы его не указали. Всегда полезно четко указывать хосты и порты. Проверьте документацию по строкам соединения PHP с данными (я ничего не знаю о php). Вероятно, это ...;port=7052 или что-то в этом роде.

Кроме того, прочитайте о docker-compose links, который вы используете. Сейчас он устарел, поэтому я советую не использовать его в будущих проектах, даже советую потратить некоторое время на его удаление. Должно пройти от 30 секунд до 5 минут, если все идет хорошо, и это больше не будет вас преследовать.

0 голосов
/ 29 октября 2019

A нашел решение.

Прежде всего, хост должен быть mysql, а не имя моего контейнера (который database):

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

InsideВ контейнере phpfpm (доступном через команду docker-compose run --rm <container-name> bash) мне пришлось включить строку extension=php_pdo_msql в моем файле конфигурации php.ini, удалив точку с запятой в начале его строки.

Чтобы этого не делатьвручную каждый раз после docker-compose up я заменял службу phpfpm в моем файле docker-compose.yml следующим Dockerfile:

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

Наконец, просто создайте образ с помощью команды docker-compose build . (замените. по пути к каталогу, содержащему файл docker-compose.yml).

У меня отлично работает.

0 голосов
/ 20 октября 2019

docker-compose - это своего рода «api» для Dockerfile. Вам нужно добавить эти библиотеки (apt-get и т. Д.) В Dockerfile

Dockerfile - ваш друг!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...