Какую основную проблему решает Docker?

«Какую основную проблему решает Docker?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Docker решает проблему неконсистентности сред («работает на моей машине»), обеспечивая изоляцию и переносимость приложений через технологию контейнеризации.

Ключевые решаемые проблемы:

  1. Зависимости и окружение: Контейнер инкапсулирует приложение со всеми его зависимостями (библиотеки, runtime, системные инструменты). Это гарантирует идентичное поведение на любом хосте (dev, CI, production).
  2. Изоляция: Контейнеры работают в изолированных пользовательских пространствах, что предотвращает конфликты версий и зависимостей между разными приложениями на одном сервере.
  3. Эффективность и переносимость: В отличие от виртуальных машин, контейнеры разделяют ядро ОС хоста, что делает их легковесными, быстрыми в запуске и простыми в распространении (образ Docker).

Практический пример Dockerfile:

# Базовый образ с фиксированной версией JDK
FROM eclipse-temurin:17-jre-alpine
# Копируем собранный JAR-файл
COPY target/my-spring-app.jar /app.jar
# Определяем точку входа
ENTRYPOINT ["java", "-jar", "/app.jar"]

Этот образ можно запустить где угодно командой docker run my-app, получив гарантированно одинаковый результат. Docker также является фундаментом для оркестрации (Kubernetes) и практик CI/CD.