Вариант запуска Postgres в Docker

This commit is contained in:
2025-09-14 21:37:42 +03:00
parent 6d8cedfb7d
commit 1635cd18d7
5 changed files with 167 additions and 0 deletions
+124
View File
@@ -0,0 +1,124 @@
# Postgres + demoDB "bookings" в Docker — README для менти
Этот стенд поднимает локальный 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‑окончаниями).
Проверка окружения:
```bash
docker --version
docker compose version
```
---
## Состав проекта (что у вас должно быть в папке)
```
postgres-bookings/
├─ docker-compose.yml
├─ .env # опционально: логин/пароль/порт
├─ initdb/
│ ├─ 00_init.sql # создаёт БД demo (страхует первый запуск)
│ └─ 01_bookings.sql # скрипт с учебными данными
└─ psql_sh # помощник: открыть psql внутри контейнера
```
> Если нет файлов `initdb/00_init.sql` и `initdb/01_bookings.sql`, запустите скрипт ниже (раздел «Быстрый старт», шаг 1).
---
## Быстрый старт (Linux/macOS/WSL2)
1) Подготовьте init‑скрипты (скачивание демо‑БД):
```bash
bash download_db.sh
chmod +x psql_sh
```
2) Поднимите кластер:
```bash
docker compose up -d
```
3) Проверьте, что сервис готов (статус `healthy`) и подключайтесь:
```bash
docker compose ps
./psql_sh
```
Внутри `psql` можно проверить данные:
```sql
\dt;
SELECT COUNT(*) FROM bookings.flights;
```
> **DBeaver:** Host `127.0.0.1`, Port `5432` (или ваш из `.env`), Database `demo`, User `postgres`, Password `postgres`, SSL — Off.
---
## Как поменять порт/логин/пароль
Создайте файл `.env` в корне проекта:
```ini
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
PG_PORT=5432
```
Перезапустите контейнеры:
```bash
docker compose down && docker compose up -d
```
---
## Частые команды
```bash
# запустить в фоне / остановить
docker compose up -d
docker compose down
# статус и логи
docker compose ps
docker compose logs -f --tail=200
# открыть psql
./psql_sh
```
---
## Сброс и повторная заливка
> Автозагрузка из `initdb/` выполняется **только** при первом старте с пустым томом данных.
- Полный сброс и переинициализация:
```bash
docker compose down -v && docker compose up -d
```
- Перезалить данные без удаления тома:
```bash
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.