Если ты хоть раз поднимал PostgreSQL на локалке (или даже на тестовом сервере), то наверняка сталкивался с вечными танцами с бубном: где лежит data-dir, как не угробить системный Postgres, чем отличаются версии, почему pg_hba.conf опять не пускает, и вообще, как всё это потом снести, чтобы не остались хвосты. Docker решает эти боли за пару минут. Сегодня разберём, как поднять Postgres в контейнере: быстро, чисто, без лишних нервов.
Зачем вообще запускать Postgres в Docker?
- Изоляция. Не лезет в системный Postgres, не конфликтует с другими проектами.
- Легко снести и пересоздать. Хоть каждый день новый инстанс — никаких следов.
- Версионирование. Хочешь 12.3 — пожалуйста. Нужен 15.1 — без проблем.
- Портируемость. Одинаково работает на Linux, Mac, Windows.
- Тестирование. Можно быстро поднимать базы для CI/CD или локальных тестов.
Что потребуется
- Docker — актуальная версия. Официальная установка Docker
- Железо: 2 ГБ ОЗУ хватит для тестовых задач. Для продакшена — чем больше, тем лучше.
- ОС: Linux, Mac, Windows — всё, что поддерживает Docker.
- Желательно уметь пользоваться терминалом.
Пошаговая установка Postgres в Docker
- Скачай официальный образ Postgres.
docker pull postgres:15
(или выбери нужную версию на Docker Hub) - Запусти контейнер с Postgres.
Пример минимальной команды:docker run --name my_postgres \ -e POSTGRES_PASSWORD=supersecret \ -d -p 5432:5432 \ postgres:15
--name my_postgres
— имя контейнера (можешь своё придумать).-e POSTGRES_PASSWORD=supersecret
— задаёт пароль для пользователя postgres.-d
— запускает в фоне.-p 5432:5432
— пробрасывает порт (левый — на хосте, правый — в контейнере).
- Сделай volume для данных (чтобы база не исчезла после удаления контейнера):
docker run --name my_postgres \ -e POSTGRES_PASSWORD=supersecret \ -v pgdata:/var/lib/postgresql/data \ -d -p 5432:5432 \ postgres:15
-v pgdata:/var/lib/postgresql/data
— volume сохраняет данные вне контейнера.
- Проверь, что контейнер запущен:
docker ps
- Подключись к базе:
- Через psql на хосте:
psql -h localhost -U postgres
(пароль тот же, что в переменной) - Или прямо в контейнере:
docker exec -it my_postgres psql -U postgres
- Через psql на хосте:
Использование: команды и фишки
- Остановить контейнер:
docker stop my_postgres
- Запустить снова:
docker start my_postgres
- Удалить контейнер:
docker rm -f my_postgres
- Посмотреть логи:
docker logs my_postgres
- Зайти внутрь контейнера:
docker exec -it my_postgres bash
- Сделать backup:
docker exec my_postgres pg_dump -U postgres dbname > backup.sql
- Восстановить из backup:
cat backup.sql | docker exec -i my_postgres psql -U postgres dbname
- Создать нового юзера/базу:
docker exec -it my_postgres psql -U postgres -c "CREATE DATABASE test_db;"
- Указать свой конфиг (например, postgresql.conf):
- Смонтировать файл:
-v /path/to/your/postgresql.conf:/etc/postgresql/postgresql.conf
- Подробнее: официальная документация Docker Postgres
- Смонтировать файл:
Ошибки и как делать не надо
- Не храни данные только внутри контейнера — всегда используй volume, иначе потеряешь всё при удалении контейнера.
- Не пиши пароли в Dockerfile или публичных репах. Используй переменные окружения или Docker secrets.
- Не запускай контейнер с флагом
--network=host
без необходимости — это небезопасно. - Не используй последний (latest) тег без нужды — может внезапно обновиться версия и всё сломать.
- Не пробрасывай 5432 наружу на проде без firewall.
Пример реального использования в окружении
В небольшом pet-проекте (Django + React) понадобилась быстрая настройка базы, чтобы не морочиться с локальным Postgres. В docker-compose.yaml добавил такой сервис:
services:
db:
image: postgres:15
restart: always
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypass
POSTGRES_DB: mydb
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Теперь любой, кто клонирует проект, просто делает docker compose up
— и база уже готова, можно мигрировать и тестировать. Не надо ничего ставить руками, не надо разбираться с pg_hba.conf, не надо бояться угробить рабочий Postgres.
Заключение
Docker + Postgres — это реально must-have для любого проекта, если хочешь быстро, чисто и без боли развернуть базу. Официальный образ поддерживается самими ребятами из Postgres, документация отличная, а комьюнити огромное (см. github.com/docker-library/postgres). Не бойся экспериментировать: контейнеры легко стартовать/убивать, а данные в volume переживут любые эксперименты. Если что — всегда можно найти ответы на Stack Overflow или в /r/docker.
Удачи, и пусть твои базы всегда поднимаются с первого раза!
Ваш отзыв