DevOps

Docker для разработчика: практическое руководство

Как использовать Docker в разработке: docker-compose, мультистейдж сборки, оптимизация образов и отладка контейнеров.

ИК

Игор Кривошей

Full-stack инженер

20 февраля 2026 г.·8 мин
Docker для разработчика: практическое руководство

Зачем разработчику Docker?

Docker решает классическую проблему "работает на моей машине":

  • Одинаковое окружение — от development до production
  • Изоляция зависимостей — разные версии на одной машине
  • Быстрый onboarding — новый разработчик запускает проект за минуты
  • Масштабируемость — горизонтальное масштабирование

Базовый docker-compose.yml

YAML
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development
      - DATABASE_URL=postgresql://user:pass@db:5432/app
    volumes:
      - .:/app
      - /app/node_modules
    depends_on:
      - db
      - redis

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: app
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  postgres_data:

Мультистейдж Dockerfile

Оптимизация размера образа:

Dockerfile
# Этап сборки
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Этап production
FROM node:20-alpine AS production
WORKDIR /app
ENV NODE_ENV=production

# Только production зависимости
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force

# Копируем собранное приложение
COPY --from=builder /app/dist ./dist

USER node
EXPOSE 3000
CMD ["node", "dist/main.js"]

Оптимизация образов

Многоэтапная сборка

Разделяйте build и runtime:

  • Builder этап: все инструменты, компиляция
  • Runtime этап: только необходимое для работы

Alpine базовые образы

Dockerfile
# Вместо
FROM node:20  # ~1GB

# Используйте
FROM node:20-alpine  # ~180MB

.dockerignore

node_modules
.git
.env
.env.local
.next
dist
*.log
.DS_Store
README.md
.github
.vscode

Отладка контейнеров

Просмотр логов

Bash
# Все логи сервиса
docker-compose logs -f app

# Последние 100 строк
docker-compose logs --tail=100 app

Вход в контейнер

Bash
# Интерактивный shell
docker-compose exec app sh

# Выполнить команду
docker-compose exec app npm run migrate

Просмотр ресурсов

Bash
# Статистика по контейнерам
docker stats

# Подробная информация
docker system df

Разработка с hot reload

Для Node.js/Next.js:

YAML
services:
  app:
    build: .
    volumes:
      - .:/app
      - /app/node_modules
    environment:
      - CHOKIDAR_USEPOLLING=true
    command: npm run dev

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

Не запускайте от root

Dockerfile
# Создаем пользователя
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nodejs -u 1001
USER nodejs

Сканирование уязвимостей

Bash
# Docker Scout
docker scout quickview myapp:latest

# Trivy
trivy image myapp:latest

Продвинутые техники

Health checks

Dockerfile
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1

Graceful shutdown

JAVASCRIPT
// Обработка сигналов
process.on('SIGTERM', () => {
  console.log('SIGTERM received, shutting down gracefully');
  server.close(() => {
    process.exit(0);
  });
});

Заключение

Docker стал стандартом индустрии:

  • Упрощает разработку и деплой
  • Гарантирует консистентность окружения
  • Ускоряет масштабирование
  • Интегрируется с CI/CD

Начните с docker-compose.yml для разработки и постепенно усложняйте инфраструктуру.

Теги
DockerDevOpsBackendInfrastructure

Shipstack

Готовы внедрить это на практике?

Обсудим архитектуру, сроки и стек — без шаблонных презентаций, по делу.