Docker в продакшене: безопасность и оптимизация
продакшен-контейнеры требуют: минимальные образы, non-root пользователь, multi-stage builds и грамотная работа с секретами
Почему это важно: неправильно настроенный Docker — серьёзная уязвимость. Root в контейнере часто означает root на хосте при пробросе томов
Главная идея
многоэтапная сборка отделяет build-инструменты от runtime; non-root пользователь ограничивает ущерб при компрометации контейнера
Как это выглядит на практике
- Stage 1 (builder): FROM node:20 — устанавливаем зависимости и собираем приложение.
- Stage 2 (runtime): FROM node:20-slim — копируем только артефакты из builder.
- RUN addgroup app && adduser -S -G app app → USER app — создаём non-root пользователя.
- COPY --chown=app:app . . — файлы принадлежат non-root пользователю.
- 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.
- Никогда не кладите секреты в слои образа.
Термины урока
Связь с работой 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 — разница между любительским и профессиональным деплоем.