docker php pdo mysql
How to enable pdo_mysql in the php docker image [duplicate]
I have a basic Dockerfile with the following in:
I have a docker-compose.yml file
Are there any steps I am missing?
4 Answers 4
The docker file I use is.
Note the mysqli and pdo in there as well to allow the PDO/mysql bit.
As it turn out that I need to remove the old images and rebuild them again.
Cause I downloaded the image, then edit it. So I need to remove the old image and rebuild it in order to apply the change.
docker rm only removes containers. Make sure you remove your image as well before.
Also check if a Dockerfile like this one might be more robust/complete:
to enabled PHP PDO and mysqli extensions to connect with MySQL add in Dockerfile :
More Information to how to create that visit this Page
I am using this and works fine for me.
If its not working for your. Please attache docker build output for review.
Not the answer you’re looking for? Browse other questions tagged php mysql docker or ask your own question.
Linked
Related
Hot Network Questions
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.9.16.40232
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
How can I add pdo_mysql? #331
Comments
yousan commented Nov 16, 2016 •
I have an error when running Laravel5.
I checked which PDO driver is installed and found sqlite.
How can I add pdo_mysql?
The text was updated successfully, but these errors were encountered:
We are unable to convert the task to an issue at this time. Please try again.
The issue was successfully created but we are unable to update the comment at this time.
mathroc commented Nov 16, 2016
you have a to build a new image based on this one, and use this command in the Dockerfile:
RUN docker-php-ext-install pdo_mysql
take a look at more detailed documentation there : https://hub.docker.com/_/php/
yousan commented Nov 17, 2016
tghelere commented Feb 21, 2018
mathroc commented Feb 21, 2018
@tghelere you could do that without a Dockerfile, but it’s going to be a pain: you’d need to write a command that install the modules and then starts apache. and it would need to do so each time you start the container..
wajdijurry commented Feb 10, 2019
you have a to build a new image based on this one, and use this command in the Dockerfile:
RUN docker-php-ext-install pdo_mysql
take a look at more detailed documentation there : https://hub.docker.com/_/php/
I wasted alot of time trying to install pdo_mysql using apt-get, and forget that docker phalcon offers an easy way to do this by using docker-php-ext-install pdo_mysql
nuvoletta8 commented Aug 29, 2019
RUN docker-php-ext-install pdo_mysql
Solved my problem!! Thanks
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Разработка под Docker. Локальное окружение. Часть 2 — Nginx+PHP+MySql+phpMyAdmin
Для лучшего понимания нижеследующего материала сначала рекомендуется ознакомится с Предыдушим постом
Рассмотрим пример развертки локального окружения состоящего из связки Nginx+PHP+MySql+phpMyAdmin. Данная связка очень популярна и может удовлетворить ряд стандартных потребностей рядового разработчика.
Как и в прошлом посте акцент будет смещен в сторону утилиты docker-compose, чем докера в чистом виде.
Итак, поехали!
Начнем вот с такого docker-compose.yml, который лежит в отдельной папке proxy:
В представленном файле описана конфигурация для создания одного контейнера с именем proxy на базе образа image: jwilder/nginx-proxy и создание сети с одноименным именем. Директива networks указывает к каким сетям подключен контейнер, в данном примере, это наша сеть proxy.
При создание сети директиву driver: bridge можно было бы и не указывать. Драйвер типа «мост» является драйвером по умолчанию. Данный контейнер будет связываться по сети с прочими контейнерами.
Образ jwilder/nginx-proxy является базовым и взят и Docker Hub там же представлено довольно обширное и подробное описание по его использованию. Принцип работы nginx-proxy довольно простой, он через пробрасываемый сокет докера получает доступ к информации о запущенных контейнерах, анализирует наличие переменной окружения с именем VIRTUAL_HOST и перенаправляет запросы с указанного хоста на контейнер, у которого данная переменная окружения задана.
Данный вывод информирует нас о том, что в начале была создана сеть proxy_proxy, а затем был создан контейнер proxy_proxy_1. Имя сети получилось из названия папки, в которой размещался файл docker-compose.yml, у меня это proxy и одноименного имени сети.
Если ввести команду docker network ls, то мы увидим список сетей докера в нашей системе и одна из них должна быть proxy_proxy.
Имя контейнера строиться по аналогичному принципу имя папки плюс название сервиса и число, которое позволяет, чтобы контейнеры со схожими именами не дублировались. Через директиву container_name можно задать имя контейнера явно, но я считаю это довольно бесполезной функцией. Подробнее пойдет речь об этом в следующих постах.
Создаем второй docker-compose.yml следующего содержания:
Что тут у нас объявлено?
Перечислены четыре сервиса: nginx, php, mysql и phpmyadmin. И две сети. Одна сеть прокси с именем frontend, объявлена как внешняя сеть и новая внутренняя сеть backend. Драйвер для нее не указан, как и писал ранее, будет использоваться драйвер по умолчанию типа bridge.
nginx
Тут примерно должно быть все понятно. Используем базовый образ с докер хаб. Переменная окружения необходима для работы прокси и сообщает ему, по какому адресу должен быть доступен контейнер. Опция depends_on указывает, на зависимость данного контейнера от контейнера php. Это означает, что вперед будет запущен контейнер php, а после него будет выполнен запуск зависимого от него контейнера nginx. Далее пробрасываем конфигурацию для нашего nginx. Она будет чуть ниже и монтируем папку с html. Так же замечаем, что контейнер имеет доступ сразу к двум сетям. Он должен связываться и прокси из сети frontend и с php из сети backend. В принципе, можно было бы все контейнеры и в одну сеть frontend попихать, но я придерживаюсь, что подобное разделение более верное.
default.nginx — это конфиг для nginx, который пробрасывается в контейнер. Ключевой момент тут директива fastcgi_pass php:9000. Она задает адрес FastCGI-сервера. Адрес может быть указан в виде доменного имени или IP-адреса, и порта.
php:9000 — имя сервиса это и есть адрес FastCGI-сервера. Nginx обращаясь по адресу php будет получать IP-адрес контейнера, в котором работает php. Порт 9000 это стандартный порт, он объявлен при создание базового контейнера. Данный порт доступен для nginx по сети, но не доступен на хостовой машине, так как не был проброшен.
Тут необычно то, что не указан образ. Вместо этого происходит сборка собственного образа прямо из compose-файла. Директива context указывает на папку, в которой находится Dockerfile.
В Dockerfile указано, что для сборки используется базовый образ php:7.3.2-fpm, далее выполняется запуск команд для установки php-расширений. Далее копируется composer из другого базового образа и устанавливается рабочая директория для проекта. Детальнее вопросы сборки рассмотрю в других постах.
Также во внутрь контейнера пробрасывается файл php.ini и папка html с нашим проектом.
Заметим, что php находится в сети backend и к примеру прокси к нему доступ получить уже не может.
mysql
База находится в сети backend, что позволяет ей держать связь с php. В базовом образе используется стандартный порт 3306. Он доступен по сети докера для php, но не доступен на хостовой машине. Если выполнить проброс для данного порта, то можно к нему коннектиться к примеру из того же PHPSTORM. Но если вам достаточно интерфейса phpmyadmin, то этого можно и не делать.
phpmyadmin
Официальный образ phpmyadmin. В переменных окружения используется VIRTUAL_HOST для взаимодействия с прокси, аналогично nginx. PMA_USER и PMA_PASSWORD доступ к базе. И PMA_HOST сам хост базы. Но это не localhost, как обычно бывает, а mysql. Т.е. связь с базой доступна по имени ее сервиса, т.е. mysql. Контейнер phpmyadmin может связаться с базой, т.к имеет подключение к сети backend.
Видим следующий вывод:
Видим, что в начале происходит создание сети lesson2_backend, затем сборка образа php, потом может происходить скачивание образов, которых еще нет в системе (pull) и собственно запуск описанных сервисов.
Последний штрих, чтобы все заработало это добавление в hosts или доменов site.local и phpmyadmin.local.
Содержимое index.php может быть следующим:
Тут мы проверяем корректность подключения расширения php — mysqli, которое было добавлено при сборке Dockerfile.
И заметим, что для связи с контейнером используется название сервиса — mysql.
Структура всего проекта получилась следующей:
Начало работы с Docker. Часть пятая
Взаимодействие служб apache и mysql
Теперь запускаем наши службы
И смотрим ini-файлы внутри контейнера
Вроде все в порядке, так что можем поработать из php-скрипта с базой данныx:
Три службы: Apache+PHP, MySQL и phpMyAdmin
Давайте отредактируем файл
/www/docker-compose.yml и добавим еще один контейнер:
Открываем браузер и набираем в адресной строке http://localhost:8080 :
Взаимодействие контейнеров по сети
Сеть Docker построена на Container Network Model (CNM), которая позволяет любому желающему создать свой собственный сетевой драйвер. Таким образом, у контейнеров есть доступ к разным типам сетей и они могут подключаться к нескольким сетям одновременно. Помимо различных сторонних сетевых драйверов, у самого Docker-а есть 4 встроенных:
Сети типа мост (bridge)
Чтобы проинспектировать ее свойства, запустим команду
Также можно создать свои собственные bridge-сети при помощи команды
Bridge-интерфейсы хоста
Можно получить больше данных о статусе моста при помощи утилиты brctl (должен быть установлен пакет bridge-utils ):
Как только мы запустим контейнеры и привяжем их к этой сети, интерфейс каждого из этих контейнеров будет выведен в списке в отдельной колонке. А если включить захват трафика в bridge-интерфейсе, то можно увидеть, как передаются данные между контейнерами в одной подсети.
Виртуальные интерфейсы Linux
Container Networking Model дает каждому контейнеру свое собственное сетевое пространство. Если запустить команду ip addr внутри контейнера, то можно увидеть его интерфейсы такими, какими их видит сам контейнер:
Откроем еще один терминал на хосте и запустим контейнер:
Теперь опять выполним на хосте команды
Локальная среда для PHP разработки с помощью Docker
В этой статье описывается как собрать минимальную локальную среду для разработки на PHP используя Docker (Докер) и Docker-compose.
Здесь мы не будем изучать «Что такое Docker и как его установить?», подробная инструкция есть на официальном сайте.
Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в среде виртуализации на уровне операционной системы. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть перенесён на любую Linux-систему с поддержкой cgroups в ядре, а также предоставляет среду по управлению контейнерами.
Docker Compose — это инструментальное средство, входящее в состав Docker. Оно предназначено для решения задач, связанных с развёртыванием проектов.
Для чего?
Многие веб разработчики используют в своей работе такие «сборки» как OpenServer, XAMMP и подобные. Для простых зачать, типа создания блога на Вордресс, использование такой сборки вполне допустимо и позволяет выполнить все задачи. В OpenServer даже есть возможность менять версию PHP, MySQL, Apache.
Но иногда возникает необходимость быстро поднять идентичную среду разработки на другом компьютере для вашего коллеги или добавить к среде разработки определенную версию Node.js, или Redis, как быть в этом случае? Тут нам и поможет Докер.
Сейчас мы один раз сконфигурируем необходимую нам среду разработки на php и сможем с легкостью разворачивать ее на любом компьютере с помощью одной команды в терминале.
В нашей среде для разработки будут следующие компоненты:
В будущем добавить/убрать/изменить любой компонент очень просто с помощью конфигурационных файлов Docker и Docker-compose.
Приступаем
Создадим основную папку, например docker-lamp, которая будет корневой, а внутри создадим следующую структуру:
— sites — тут будут лежать наши проекты
— data
— mysql — тут будут храниться файлы наших баз данных
— logs — сюда будут записываться все логи
— config
— php — все настройки контейнера и php.ini
— nginx — — все настройки контейнера и конфигурационные файлы
Создаем в корневой папке файл docker-compose.yml и добавим в него следующее содержание (я постарался его прокомментировать чтобы не возникало вопросов):
Образы nginx и mysql прекрасно работают из коробки, а вот официальный образ php совсем пустой и в него не включены никакие расширения, еще мы хотели чтобы в нашей среде разработки был Composer.
Php.ini пока оставим пустым, если нам понадобиться в будущем настраивать PHP то воспользуемся им, а пока добавим в Dockerfile следующий код:
Теперь в папке sites для теста создадим тестовый проект Hello, для этого создадим папку hello и поместим туда единственный файл index.php который будет выводить информацию о php:
Остается только сконфигурировать NGINX, для этого добавим в /config/nginx файл hello.conf:
Не забываем в файле HOSTS добавить:
Запускаем терминал, переходим в нашу папку и запускаем команду:
Первый запуск может занять довольно длительное время, поскольку Докеру нужно скачать образы из интернета и собрать их.
Если при сборке не было никаких ошибок:
Переходим по адресу http://hello.loc/ и видим, что все работает.
Можно зайти в Docker-контейнер php и запустить bash, и проверить работает ли git и composer, для этого введем команду:
Завершаем работу командой:
Мы разобрали один из вариантов конфигурации, вы все можете настроить под себя. Может показаться, что это сложно и тратиться много времени, но настроив все один раз, вы и коллеги будите использовать это постоянно, разворачивая всю среду разработки одной строкой.
В начале я написал что в сборке будет присутствовать phpМyAdmin но, как вы заметили, его нет. Для тренировки попробуйте добавить его сами, а если не получится, то позже подготовлю инструкцию.
На Windows 10 у меня возникла ошибка при запуске контейнера MySQL, в логах было что то такое:
…..
[Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
…..
Гугление показало — это означает, что используемая файловая система не поддерживает aio. Для этого в docker-compose добавим команду:
В статье, в описание файла docker-compose, я это добавил.










