Как применял Docker в последнем проекте?

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

Ответ

Docker использовался для создания переносимых, изолированных окружений на всех стадиях разработки и deployment'а.

Ключевые задачи и практики:

  1. Контейнеризация сервисов: Создание Dockerfile для каждого Spring Boot микросервиса с многоступенчатой сборкой для минимизации итогового образа.

    # Стадия сборки
    FROM maven:3.8.6-eclipse-temurin-17 AS builder
    WORKDIR /app
    COPY pom.xml .
    COPY src ./src
    RUN mvn clean package -DskipTests
    
    # Финальный образ
    FROM eclipse-temurin:17-jre-alpine
    WORKDIR /app
    COPY --from=builder /app/target/*.jar app.jar
    EXPOSE 8080
    ENTRYPOINT ["java", "-jar", "app.jar"]
  2. Локальное развертывание: Использование docker-compose.yml для одновременного запуска стека приложения (сервисы, БД, кэш, брокер сообщений).

    version: '3.8'
    services:
      postgres:
        image: postgres:15-alpine
        environment:
          POSTGRES_DB: appdb
          POSTGRES_PASSWORD: secret
        volumes:
          - postgres_data:/var/lib/postgresql/data
    
      app-service:
        build: ./service
        ports:
          - "8080:8080"
        depends_on:
          - postgres
        environment:
          SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/appdb
  3. Оптимизация: Выбор легковесных базовых образов (Alpine Linux), очистка кэша зависимостей на этапе сборки, что сократило размер образа на 60-70%.

  4. Интеграция с CI/CD: Автоматическая сборка образа, тестирование и публикация в container registry (Docker Hub, GitLab Registry) при push в репозиторий.

  5. Управление данными и мониторинг: Использование volumes для сохранения данных БД, настройка healthcheck в Docker Compose для проверки готовности сервисов.

Результат: Единая среда от разработки до продакшена, упрощение onboarding новых разработчиков и надежный процесс deployment.