Можно ли запускать все составляющие проекта в рамках одного контейнера

«Можно ли запускать все составляющие проекта в рамках одного контейнера» — вопрос из категории DevOps, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, технически можно, но это противоречит принципам Docker и микросервисной архитектуры. Контейнер должен содержать один процесс/сервис.

Проблемы:

  • Усложняется логирование (stdout/stderr смешиваются)
  • Невозможно масштабировать отдельные компоненты
  • Сложнее управлять жизненным циклом процессов
  • Нарушается принцип единственной ответственности

Исключения:

  • Разработка/тестирование (удобно иметь все в одном контейнере)
  • Очень простые приложения
# Плохая практика (но работает)
FROM alpine
RUN apk add --no-cache nginx mysql redis
CMD service nginx start && mysqld_safe & redis-server & your_app

Лучше использовать docker-compose для оркестрации нескольких контейнеров.