Ответ
Docker решает проблему неконсистентности сред («работает на моей машине»), обеспечивая изоляцию и переносимость приложений через технологию контейнеризации.
Ключевые решаемые проблемы:
- Зависимости и окружение: Контейнер инкапсулирует приложение со всеми его зависимостями (библиотеки, runtime, системные инструменты). Это гарантирует идентичное поведение на любом хосте (dev, CI, production).
- Изоляция: Контейнеры работают в изолированных пользовательских пространствах, что предотвращает конфликты версий и зависимостей между разными приложениями на одном сервере.
- Эффективность и переносимость: В отличие от виртуальных машин, контейнеры разделяют ядро ОС хоста, что делает их легковесными, быстрыми в запуске и простыми в распространении (образ 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.