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
Читайте также:



