Как развернуть PostgreSQL в Docker-контейнере для разработки или тестирования?

«Как развернуть PostgreSQL в Docker-контейнере для разработки или тестирования?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, развернуть PostgreSQL в Docker — стандартная практика для создания изолированных сред. Вот пример для быстрого старта и более продвинутая конфигурация.

1. Базовый запуск для разработки:

docker run -d 
  --name dev-postgres 
  -e POSTGRES_PASSWORD=strongpassword 
  -e POSTGRES_DB=myapp 
  -p 5432:5432 
  postgres:15-alpine

2. Продакшен-ориентированный пример с Docker Compose и томами:

# docker-compose.yml
version: '3.8'
services:
  postgres:
    image: postgres:15-alpine
    container_name: app-postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: app_user
      POSTGRES_PASSWORD: ${DB_PASSWORD}  # Берется из .env файла
      POSTGRES_DB: app_db
    volumes:
      # Постоянное хранение данных
      - postgres_data:/var/lib/postgresql/data
      # Подключение SQL-скриптов для инициализации
      - ./init-scripts:/docker-entrypoint-initdb.d
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app_user -d app_db"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  postgres_data:

3. Ключевые практики для DevOps:

  • Версионирование: Всегда фиксируйте конкретную версию тега (не latest), например postgres:15-alpine.
  • Управление секретами: Пароли (POSTGRES_PASSWORD) должны передаваться через переменные окружения, а не храниться в коде. Используйте .env файлы или секреты оркестратора (Kubernetes Secrets, Docker Swarm secrets).
  • Тома (Volumes): Обязательно монтируйте том для /var/lib/postgresql/data, иначе данные будут потеряны при пересоздании контейнера.
  • Alpine-образы: Используйте -alpine теги для уменьшения размера образа и поверхности атаки.
  • Health Checks: Настройте healthcheck для мониторинга готовности БД оркестратором.