Docker Postgres: настройка базы данных в контейнере

Если ты хоть раз поднимал 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

  1. Скачай официальный образ Postgres.
    docker pull postgres:15
    (или выбери нужную версию на Docker Hub)
  2. Запусти контейнер с 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 — пробрасывает порт (левый — на хосте, правый — в контейнере).
  3. Сделай 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 сохраняет данные вне контейнера.
  4. Проверь, что контейнер запущен:
    docker ps
  5. Подключись к базе:
    • Через psql на хосте:
      psql -h localhost -U postgres (пароль тот же, что в переменной)
    • Или прямо в контейнере:
      docker exec -it my_postgres psql -U postgres

Использование: команды и фишки

  • Остановить контейнер: 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):

Ошибки и как делать не надо

  • Не храни данные только внутри контейнера — всегда используй 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.

Удачи, и пусть твои базы всегда поднимаются с первого раза!

Хотите прочитать больше про Разное?
Отзывов нет.

Ваш отзыв

Пожалуйста, заполните поля снизу и добавьте отзыв!.
Имя *
E-mail *
Сайт
Сообщение *