Средний ~25 мин чтения

Docker в продакшене: безопасность и оптимизация

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

Docker в продакшене: безопасность и оптимизация

продакшен-контейнеры требуют: минимальные образы, non-root пользователь, multi-stage builds и грамотная работа с секретами

Почему это важно: неправильно настроенный Docker — серьёзная уязвимость. Root в контейнере часто означает root на хосте при пробросе томов

Главная идея

многоэтапная сборка отделяет build-инструменты от runtime; non-root пользователь ограничивает ущерб при компрометации контейнера

Как это выглядит на практике

  1. Stage 1 (builder): FROM node:20 — устанавливаем зависимости и собираем приложение.
  2. Stage 2 (runtime): FROM node:20-slim — копируем только артефакты из builder.
  3. RUN addgroup app && adduser -S -G app app → USER app — создаём non-root пользователя.
  4. COPY --chown=app:app . . — файлы принадлежат non-root пользователю.
  5. Secrets: используем Docker BuildKit secrets (--mount=type=secret) или env-переменные из secrets manager.

Что происходит под капотом

  • Multi-stage build: промежуточные стадии не попадают в финальный образ; только COPY --from=builder.
  • slim-образы содержат только runtime; alpine — ещё меньше (5MB base), но использует musl libc.
  • USER задаёт UID/GID процесса; UID 1000 — стандартный non-root пользователь в контейнерах.
  • docker scan / docker scout анализируют образ на CVE-уязвимости.
  • HEALTHCHECK в Dockerfile: Docker restart policy реагирует на unhealthy контейнер.

Типичные ошибки и заблуждения

  • Ошибка: процесс в контейнере изолирован, root не страшен. Root в контейнере + bind mount = root-доступ к файлам хоста.
  • Ошибка: Alpine-образы всегда лучше. Alpine использует musl libc; некоторые Python/Ruby-зависимости не компилируются без патчей.
  • Ошибка: секреты в ENV попадают в историю слоёв. Используй BuildKit secrets для build-time секретов.
  • Ошибка: COPY . . в multi-stage включает весь проект. .dockerignore работает только для первого контекста.

Ключевые выводы

  • Multi-stage build: маленький продакшен-образ без build-инструментов.
  • Non-root пользователь — обязательно для продакшена.
  • Сканируй образы на уязвимости: docker scout, Trivy, Snyk.
  • Никогда не кладите секреты в слои образа.

Термины урока

Multi-stage build: несколько FROM в Dockerfile; финальный образ — только последняя стадия.
Non-root user: процесс контейнера запускается от непривилегированного пользователя.
Docker Scout: инструмент анализа образов на CVE.
HEALTHCHECK: периодическая проверка работоспособности контейнера.
Read-only filesystem: --read-only при docker run запрещает запись в файловую систему контейнера.

Связь с работой backend-разработчика

Чеклист для продакшена: multi-stage build, non-root user, slim base image, .dockerignore, secrets через env, HEALTHCHECK. Это не перфекционизм — это минимальный стандарт.

Мини-разбор реальной ситуации

Аудит безопасности находит: Docker-образы весят 2GB, запускаются от root, содержат npm/pip в продакшене. После рефакторинга: multi-stage + node:20-slim + non-root пользователь. Образ уменьшается с 2GB до 180MB, attack surface снижается на 80%.

Что запомнить

  • Multi-stage = меньший образ + нет build-инструментов в продакшене.
  • Non-root пользователь — не опция, а стандарт.
  • Сканируй образы до деплоя: docker scout cves .

Итог

Продакшен-Docker — это не просто 'оно работает'. Безопасность, размер образа и настройка healthcheck — разница между любительским и профессиональным деплоем.