Docker для PostgreSQL: запуск базы данных в контейнере - Компьюти
Logo КОМПЬЮТИ

Docker для PostgreSQL: запуск базы данных в контейнере

Время на прочтение: 2 мин.

PostgreSQL удобно запускать в Docker во время разработки, тестирования и в некоторых production-сценариях.

Главное правило: база данных должна иметь постоянное хранилище и корректную стратегию резервного копирования.

Запуск PostgreSQL

Минимальный вариант:

docker run -d \
  --name postgres \
  -e POSTGRES_PASSWORD=change-me \
  -p 5432:5432 \
  postgres:18

Проверить:

docker ps

Логи:

docker logs postgres

PostgreSQL через Docker Compose

Для проекта удобнее Compose:

services:
  postgres:
    image: postgres:18
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: app
      POSTGRES_PASSWORD: change-me
    volumes:
      - postgres-data:/var/lib/postgresql/data
    restart: unless-stopped

volumes:
  postgres-data:

Запуск:

docker compose up -d

Почему нужен volume

PostgreSQL хранит данные в файловой системе контейнера.

Чтобы данные не зависели от конкретного контейнера, используется volume:

volumes:
  - postgres-data:/var/lib/postgresql/data

Подробнее о volumes — в статье «Docker volumes».

Подключение приложения к PostgreSQL

Если приложение находится в том же Compose-проекте:

services:
  app:
    image: my-app
    environment:
      DATABASE_HOST: postgres

  postgres:
    image: postgres:18

Приложение подключается к:

postgres:5432

А не к:

localhost:5432

Это связано с Docker networking.

Нужно ли публиковать порт PostgreSQL

Для локальной разработки может быть удобно:

ports:
  - "5432:5432"

Но если PostgreSQL нужен только приложению внутри Docker, публикация наружу необязательна.

Это уменьшает поверхность атаки.

Создание backup

Для логического backup используется pg_dump.

Например:

docker exec postgres \
  pg_dump -U app app \
  > backup.sql

Восстановление:

cat backup.sql | docker exec -i postgres \
  psql -U app app

Для production необходимо выбирать стратегию backup с учетом требований к восстановлению.

Логи PostgreSQL

Смотреть:

docker logs postgres

В Compose:

docker compose logs -f postgres

Ищите ошибки подключения, authentication errors, проблемы диска и другие сообщения.

Подробнее — в статье «Docker logs».

Healthcheck

Можно добавить healthcheck:

services:
  postgres:
    image: postgres:18
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app -d app"]
      interval: 10s
      timeout: 5s
      retries: 5

Это позволяет инфраструктуре понимать, готова ли база принимать подключения.

Restart policy

restart: unless-stopped

Полезна для серверного сервиса, но она не заменяет backup.

Подробнее — в статье «Docker restart policy».

Безопасность PostgreSQL

Не используйте production-пароли в открытом Compose-файле.

Также:

  • не публикуйте PostgreSQL в интернет без необходимости;
  • ограничивайте доступ;
  • используйте сильные credentials;
  • регулярно обновляйте PostgreSQL;
  • делайте backup;
  • контролируйте доступ пользователей.

Обновление PostgreSQL

Обновление major-версии PostgreSQL нельзя сводить к простой замене тега образа.

Например:

postgres:16

на:

postgres:18

может потребовать процедуру миграции.

Перед major upgrade необходим backup и план восстановления.

Docker PostgreSQL в production

Контейнеризация базы не отменяет требований к базе данных.

Нужно продумать:

  • storage;
  • backup;
  • WAL;
  • мониторинг;
  • ресурсы;
  • обновления;
  • восстановление;
  • безопасность.

Итог

PostgreSQL в Docker удобен, но базу нельзя воспринимать как обычный stateless-контейнер.

Минимальная production-модель:

PostgreSQL
   |
Volume
   |
Backup

Читайте также:


Читайте также:

Приглашаем поучаствовать в обсуждении статьи:

Комментариев 0