Запрос из сценария в Docker
Запрос из сценария
читает строку из базы
и показывает её на странице.
PDO открывает соединение
к mysql:host=db;dbname=app
под пользователем app
с паролем demo,
выполняет SELECT
и печатает поле из строки.
Переменные окружения
можно подставить
в строку DSN и учётки.
Сервисы web,
app
и db
как в связке с nginx.
У app
есть depends_on
для порядка старта -
он не ждёт готовности сервера,
поэтому при первом открытии
страницу иногда обновляют.
Образ app
с pdo_mysql
и описание сервисов
в одном проекте:
FROM php:8.5-fpm
RUN docker-php-ext-install pdo_mysql
Файл compose.yaml:
services:
web:
image: nginx
ports:
- "8080:80"
volumes:
- ./site:/var/www/html
- ./default.conf:/etc/nginx/conf.d/default.conf
app:
build: .
environment:
DB_HOST: db
DB_NAME: app
DB_USER: app
DB_PASSWORD: demo
volumes:
- ./site:/var/www/html
depends_on:
- db
db:
image: mysql:9.7
environment:
MYSQL_ROOT_PASSWORD: demo
MYSQL_DATABASE: app
MYSQL_USER: app
MYSQL_PASSWORD: demo
Конфиг nginx
с fastcgi_pass app:9000
и общей папкой ./site:
server {
listen 80;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
После подъёма
заполним таблицу notes
отдельной командой
в контейнере базы:
docker compose up -d --build
docker compose exec db mysql -uapp -pdemo app -e "CREATE TABLE IF NOT EXISTS notes (id INT PRIMARY KEY AUTO_INCREMENT, body VARCHAR(255)); INSERT INTO notes (body) VALUES ('hello');"
Сценарий читает
поле body
из первой строки:
<?php
$dsn = 'mysql:host=' . getenv('DB_HOST') . ';dbname=' . getenv('DB_NAME');
$pdo = new PDO($dsn, getenv('DB_USER'), getenv('DB_PASSWORD'));
$row = $pdo->query('SELECT body FROM notes LIMIT 1')->fetch(PDO::FETCH_ASSOC);
echo $row['body'];
Страница по localhost:8080
показывает слово hello
из таблицы.
Если база ещё не приняла
соединение,
обновите вкладку
через несколько секунд.
Сохраните в таблице messages строку ping и выведите её на странице через PDO с теми же учётными данными app.
Сравните текст в браузере с содержимым поля, которое вернул запрос к базе.