Какие базовые правила работы с Docker-контейнерами ты применяешь?

«Какие базовые правила работы с Docker-контейнерами ты применяешь?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В своей работе с Docker я придерживаюсь следующих практик:

  1. Stateless-контейнеры: Все данные приложения пишутся во внешние тома (Volumes) или облачные хранилища (S3). Контейнеры пересоздаются без потери данных.
  2. Один процесс на контейнер: Это упрощает логирование (в stdout/stderr), мониторинг и обработку сигналов. Для нескольких связанных процессов использую Docker Compose или оркестратор.
  3. Использование не-root пользователя: В Dockerfile создаю отдельного пользователя для повышения безопасности.
    FROM alpine:latest
    RUN addgroup -S appgroup && adduser -S appuser -G appgroup
    WORKDIR /app
    COPY --chown=appuser:appgroup . .
    USER appuser
    CMD ["python", "app.py"]
  4. Минимизация образа: Использую многоэтапные сборки (multi-stage builds) и alpine-базы, удаляю кэш пакетов в одном слое RUN.
  5. Явное версионирование тегов: Избегаю тега latest в продакшене. Использую семантическое версионирование или хэши коммитов (myapp:v1.2.3, myapp:sha-abc123).
  6. Лимиты ресурсов: Всегда задаю ограничения на CPU и память через флаги docker run или в манифестах Kubernetes, чтобы один контейнер не мог исчерпать ресурсы хоста.
  7. Сканирование образов: Интегрирую docker scan (Snyk) или Trivy в CI/CD пайплайн для проверки образов на известные уязвимости перед отправкой в registry.