Локальная среда для лабораторных работ по SQL на базе PostgreSQL 17 в Docker-контейнере.
| OrbStack | движок контейнеров на macOS |
| PostgreSQL 17 | СУБД внутри контейнера |
| DBeaver | GUI-клиент |
| VSCode | редактор + терминал |
dblabs/
├── .env # параметры подключения и имена
├── DUMPCHANGE.md # какие правки нужны для скачанного дампа
├── demodb.sql # распакованный и подготовленный дамп Postgres Pro
├── docker-compose.yaml
└── scripts/ # SQL-скрипты для практики
└── .gitkeep
docker versionВ выводе должны быть и Client, и Server. Если нет — открой OrbStack.
cd ~/projects/dblabsВ корне проекта лежат docker-compose.yaml, .env и DUMPCHANGE.md.
Скачай SQL-дамп учебной базы с сайта Postgres Pro:
https://postgrespro.ru/education/demodb
Распакуй скачанный архив и переименуй SQL-файл в:
demodb.sql
Положи demodb.sql в корень проекта рядом с docker-compose.yaml.
После этого примени к demodb.sql изменения, описанные в DUMPCHANGE.md. Для текущего проекта из дампа нужно убрать команды уровня базы данных (DROP DATABASE, CREATE DATABASE, \connect demo), потому что Docker Compose сам создаёт базу demo из .env, а init-скрипт должен только наполнить её схемой bookings и данными.
demodb.sqlне хранится в репозитории: файл большой, поэтому он добавлен в.gitignore.
cat .envПо умолчанию:
POSTGRES_DB=demo
POSTGRES_USER=student
POSTGRES_PASSWORD=student123
POSTGRES_PORT=5432
POSTGRES_CONTAINER_NAME=dblabs
Для дампа demodb.sql рабочая база называется demo, поэтому POSTGRES_DB в .env тоже должен быть demo. Docker создаёт эту базу до запуска init-скрипта, а сам скрипт наполняет её схемой bookings.
docker compose up -dПервый запуск скачает образ postgres:17 (~150 МБ). Дальнейшие запуски мгновенны.
Init-скрипт demodb.sql выполняется только при создании пустого volume pgdata. Если контейнер уже запускался и нужно повторить импорт с нуля, сначала удали старые данные:
docker compose down -vПроверь статус:
docker compose psОжидаемый результат — статус Up (healthy):
NAME STATUS PORTS
dblabs Up (healthy) 0.0.0.0:5432->5432/tcp
New Database Connection -> PostgreSQL и заполни поля:
| Поле | Значение |
|---|---|
| Host | localhost |
| Port | 5432 |
| Database | demo |
| Username | student |
| Password | student123 |
Нажми Test Connection — должно появиться Connected, затем Finish.
При первом подключении DBeaver предложит скачать JDBC-драйвер PostgreSQL — соглашайся.
docker compose exec postgres psql -U student -d demoSELECT version();
\q# запустить
docker compose up -d
# остановить (данные сохраняются)
docker compose stop
# остановить и удалить контейнер (данные в volume остаются)
docker compose down
# удалить контейнер И все данные — чистый старт
docker compose down -v
# логи
docker compose logs postgres
# перезапустить
docker compose restartdocker compose exec postgres psql -U student -d demoПолезные мета-команды psql:
\l список всех баз данных
\dt список таблиц в текущей БД
\d имя структура таблицы
\timing показывать время выполнения запросов
\e открыть запрос в редакторе
\q выйти
Папка scripts/ предназначена для ручной практики: здесь можно хранить запросы, схемы таблиц, вставку тестовых данных и решения упражнений.
Пример scripts/01_employees.sql:
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
dept VARCHAR(50),
salary NUMERIC(10, 2)
);
INSERT INTO employees (name, dept, salary) VALUES
('Иван Петров', 'IT', 90000),
('Анна Смирнова', 'HR', 60000),
('Пётр Иванов', 'IT', 95000),
('Мария Кузнецова','Finance', 75000);Выполнить скрипт внутри базы можно так:
docker compose exec -T postgres psql -U student -d demo < scripts/01_employees.sqlИли зайти в psql и выполнять запросы руками:
docker compose exec postgres psql -U student -d demoДанные PostgreSQL хранятся в named volume pgdata. Он переживает docker compose down — удаляется только с флагом -v.
# посмотреть все тома
docker volume ls
# удалить том вручную
docker volume rm dblabs_pgdataИмя тома в системе формируется как
<папка_проекта>_pgdata, напримерdblabs_pgdata.
Порт 5432 занят
lsof -i :5432Измени POSTGRES_PORT в .env (например на 5433) — и укажи тот же порт в DBeaver.
Контейнер не поднимается
docker compose logs postgresСтатус starting не меняется на healthy
Подожди 10–15 секунд. Если не помогает — смотри логи выше.