Введение в MySQL для PHP в Docker
Сценарию нужна база рядом,
а не установка сервера в систему.
В compose сервер поднимают
отдельным сервисом
на образе mysql:9.7,
а PHP ходит к нему
по внутреннему имени
в сети проекта.
Порт MySQL наружу
обычно не публикуют:
доступ нужен только
соседним контейнерам.
Файлы базы держат в томе,
смонтированном в /var/lib/mysql,
чтобы пересоздание контейнера
не стирало таблицы.
На пустом томе образ
сам заводит базу приложения
и пользователя с паролем
из переменных окружения,
отдельно от учётки root.
Чистый php:8.5-fpm
не умеет говорить с MySQL,
пока в образ не добавят
расширение pdo_mysql
через docker-php-ext-install
в Dockerfile.
Без этого шага
даже правильный адрес сервера
не откроет соединение PDO.
Имя хоста, базы, пользователя
и пароль передают сценарию
переменными окружения
у сервиса PHP,
например DB_HOST
и DB_PASSWORD,
чтобы не прошивать секреты
в код на диске.
Страница сначала может
лишь показать имя сервера,
а затем выполнить запрос
и вывести строку из таблицы.
Старт контейнера MySQL
и готовность принимать запросы
- не одно и то же.
Простой порядок запуска
лишь ставит PHP после процесса базы,
но не ждёт ответа на ping.
Проверка здоровья
и условие service_healthy
откладывают сайт,
пока сервер не ответит.
Уроки идут от сервиса
и тома данных
до расширения,
переменных,
запроса из index.php
и ожидания готовности.
Связка nginx на 8080
и FPM без наружного порта
остаётся как в разделе
про веб-сервер.