← Назад к вопросам

Работал с БД в контейнерах по типу Docker

1.8 Middle🔥 171 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Работа с БД в Docker контейнерах

Да, активно работаю с Docker контейнерами для БД в ежедневной разработке и production. Контейнеризация БД — это стандарт индустрии, позволяющий обеспечить консистентность между локальной разработкой и production окружением.

Docker Compose для локальной разработки

Мой стандартный setup для Node.js проектов выглядит примерно так:

version: '3.8'

services:
  postgres:
    image: postgres:15-alpine
    container_name: prepbro_postgres
    environment:
      POSTGRES_USER: developer
      POSTGRES_PASSWORD: dev_password_123
      POSTGRES_DB: prepbro_db
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./scripts/init.sql:/docker-entrypoint-initdb.d/init.sql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U developer"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    container_name: prepbro_redis
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    command: redis-server --appendonly yes

  rabbitmq:
    image: rabbitmq:3.12-management-alpine
    container_name: prepbro_rabbitmq
    environment:
      RABBITMQ_DEFAULT_USER: guest
      RABBITMQ_DEFAULT_PASS: guest
    ports:
      - "5672:5672"
      - "15672:15672"
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq

  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: prepbro_app
    environment:
      DATABASE_URL: postgresql://developer:dev_password_123@postgres:5432/prepbro_db
      REDIS_URL: redis://redis:6379
      RABBITMQ_URL: amqp://guest:guest@rabbitmq:5672
      NODE_ENV: development
    ports:
      - "3000:3000"
      - "9229:9229"
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_started
      rabbitmq:
        condition: service_started
    volumes:
      - .:/app
      - /app/node_modules
    command: npm run dev

volumes:
  postgres_data:
  redis_data:
  rabbitmq_data:

Dockerfile для Node.js приложения

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 3000 9229
CMD ["npm", "start"]

Работа с миграциями в Docker

Я использую Goose для миграций БД, и вот как я их запускаю в контейнерах:

docker-compose up -d postgres
docker-compose exec postgres pg_isready -U developer
docker-compose run --rm app npm run migrate:up
docker-compose run --rm app npm run migrate:down
docker-compose run --rm app npm run migrate:status

Удобные npm скрипты

{
  "scripts": {
    "dev": "nodemon --exec ts-node src/index.ts",
    "build": "tsc",
    "start": "node dist/index.js",
    "docker:up": "docker-compose up -d",
    "docker:down": "docker-compose down",
    "docker:logs": "docker-compose logs -f",
    "docker:rebuild": "docker-compose build --no-cache",
    "migrate:up": "ts-node scripts/migrate.ts up",
    "migrate:down": "ts-node scripts/migrate.ts down",
    "migrate:status": "ts-node scripts/migrate.ts status",
    "db:seed": "ts-node scripts/seed.ts",
    "db:reset": "docker-compose down -v && docker-compose up -d postgres && npm run migrate:up && npm run db:seed"
  }
}

Работа с БД для разработки

import { Pool } from 'pg';

export const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  max: 10,
  idleTimeoutMillis: 30000,
  connectionTimeoutMillis: 2000,
});

pool.on('error', (err) => {
  console.error('Unexpected error on idle client', err);
});

export async function query(text: string, params?: any[]) {
  const start = Date.now();
  try {
    const result = await pool.query(text, params);
    const duration = Date.now() - start;
    if (duration > 1000) {
      console.warn(`Slow query (${duration}ms):`, text);
    }
    return result;
  } catch (error) {
    console.error('Database error:', error);
    throw error;
  }
}

Синхронизация схемы между миграциями и models

CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  email VARCHAR(255) NOT NULL UNIQUE,
  password VARCHAR(255) NOT NULL,
  created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_users_email ON users(email);

Важные практики при работе с Docker БД

  • Используй named volumes (postgres_data:/var/lib/postgresql/data) для сохранения данных
  • Healthchecks помогают определить готовность сервиса
  • Connection pooling критичен — не создавай новое соединение на каждый запрос
  • Env переменные для development отличаются от production
  • Backup volumes перед удалением контейнеров в production
  • Логирование запросов помогает отловить bottlenecks