Postgres + demoDB "bookings" в Docker
Этот стенд поднимает локальный PostgreSQL в Docker и загружает учебную БД Postgres Pro demo “Airlines/Bookings”. После запуска можно работать через psql (внутри контейнера) и через DBeaver (с хоста).
Что нужно заранее
- Docker Desktop (Windows/macOS) или Docker Engine (Linux) + docker compose.
- Утилита
unzip(Linux:sudo apt install unzip/sudo dnf install unzip). - Свободный порт 5432 (или задайте другой через
.env). - Windows: желательно запускать команды в WSL2 либо в Git Bash (так проще с shell‑скриптами и LF‑окончаниями).
Проверка окружения:
docker --version
docker compose version
Структура проекта
Важно: файлы 00_init.sql и 01_bookings.sql создаются скриптом download_db.sh и изначально отсутствуют.
postgres-bookings/
├─ docker-compose.yml
├─ download_db.sh # скрипт скачивания и подготовки демо-БД
├─ .env # опционально: логин/пароль/порт
├─ initdb/ # изначально пусто
└─ psql_sh # помощник: открыть psql внутри контейнера
После выполнения шага «Быстрый старт → п.1» в initdb/ появятся:
initdb/
├─ 00_init.sql # создаёт БД demo (страхует первый запуск)
└─ 01_bookings.sql # учебные данные Postgres Pro
Быстрый старт (Linux/macOS/WSL2)
- Скачать и подготовить демо‑БД:
bash download_db.sh
chmod +x psql_sh
- Запустить кластер:
docker compose up -d
- Проверить статус и подключиться к psql:
docker compose ps
./psql_sh
Внутри psql можно проверить данные:
\dt;
SELECT COUNT(*) FROM bookings.flights;
Подключение из DBeaver
- Host: 127.0.0.1
- Port: 5432 (или ваш из .env)
- Database: demo
- User: postgres
- Password: postgres
- SSL: Off
Частые команды
# запустить в фоне / остановить
docker compose up -d
docker compose down
# статус и логи
docker compose ps
docker compose logs -f --tail=200
# открыть psql
./psql_sh
Сброс и повторная заливка
Автозагрузка из
initdb/выполняется только при первом старте с пустым томом данных.
- Полный сброс и переинициализация:
docker compose down -v && docker compose up -d
- Перезалить данные без удаления тома:
docker compose exec -T db psql -U postgres -d postgres \
-f /docker-entrypoint-initdb.d/01_bookings.sql
Частые проблемы и решения
- Порт 5432 занят. Поменяйте
PG_PORTв.env, затемdocker compose down && docker compose up -d. ./psql_sh: Permission denied. Дайте права:chmod +x psql_sh.psql: could not connect to server/ статус неhealthy. Смотрите логи:docker compose logs -f --tail=200.- Windows и CRLF. Если редактировали файлы Блокнотом, убедитесь в LF‑окончаниях (используйте Git Bash/WSL2).
unzip: command not found(Linux). Установитеunzipкомандой дистрибутива.
Зачем нужен 00_init.sql?
Учебный скрипт 01_bookings.sql начинается с DROP DATABASE demo; (без IF EXISTS). На самом первом запуске БД demo ещё нет, поэтому DROP вызвал бы ошибку. Файл 00_init.sql предварительно создаёт БД demo, чтобы импорт прошёл без сбоев.
Что внутри демо‑БД
Схема bookings: таблицы airports, aircrafts, flights, tickets, ticket_flights, boarding_passes и др. Идеально для практики JOIN, оконных функций, индексов и анализа планов (EXPLAIN ANALYZE).
Безопасность: значения по умолчанию (
postgres/postgres) — только для учебных целей на локальной машине. Для реальных проектов используйте сильные пароли и SSL.