Запрос из приложения в Docker
Запрос из приложения
читает строку из базы
и отдаёт её на странице.
Пакет mysql2
идёт на хост db,
базу app
и таблицу notes
под пользователем app.
Слово hello
попадает в ответ HTTP
на порту 3000
без стороннего фреймворка.
Скрипт открывает соединение,
читает поле из строки
и слушает 0.0.0.0:
const http = require('node:http');
const mysql = require('mysql2/promise');
async function main() {
const conn = await mysql.createConnection({
host: 'db',
user: 'app',
password: 'demo',
database: 'app',
});
const [rows] = await conn.execute(
'SELECT body FROM notes LIMIT 1'
);
const word = rows[0].body;
http.createServer((req, res) => {
res.end(word);
}).listen(3000, '0.0.0.0');
}
main().catch((err) => {
console.error(err);
process.exit(1);
});
Зависимость и образ
собираются как в уроке
про драйвер.
Файл package.json
содержит mysql2,
а Dockerfile
выполняет npm install
при сборке.
Сервис db
с базой app
и пользователем app.
Сервис web
собирается из точки,
стартует после db
по порядку запуска
и публикует порт
3000:
services:
db:
image: mysql:9.7
environment:
MYSQL_ROOT_PASSWORD: demo
MYSQL_DATABASE: app
MYSQL_USER: app
MYSQL_PASSWORD: demo
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
Таблицу notes
со словом hello
создают отдельной командой
после подъёма:
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');"
Правило depends_on
задаёт лишь очередь
создания контейнеров.
Если сервер ещё не готов,
страницу обновляют,
пока ответ не появится.
Адрес localhost:3000
в браузере покажет
слово hello.
Опишите сервис db с пользователем app и сервис site с образом приложения, портом 3000 и зависимостью от db по порядку старта.
Откройте localhost:3000 и зафиксируйте текст ответа после чтения из таблицы notes.