← Назад к вопросам
Работал с БД в контейнерах по типу 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