← Назад к вопросам

Как Spring Boot интегрируется с концепцией докеризации

2.0 Middle🔥 211 комментариев
#Spring Boot и Spring Data

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Интеграция Spring Boot с Docker

Spring Boot идеально подходит для докеризации благодаря самодостаточности и встроенному серверу приложений. Рассмотрю практические подходы.

1. Создание Docker образа для Spring Boot приложения

Простой Dockerfile

FROM openjdk:17-slim

WORKDIR /app

# Копируем собранный JAR файл
COPY target/my-app-1.0.0.jar app.jar

# Экспортируем порт
EXPOSE 8080

# Запускаем приложение
ENTRYPOINT ["java", "-jar", "app.jar"]

Optimized Multi-stage Dockerfile

# Этап 1: Сборка
FROM maven:3.8-openjdk-17 AS builder

WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests

# Этап 2: Запуск (слой для production)
FROM openjdk:17-slim

WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]

2. Docker Compose для Spring Boot стека

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: spring-boot-app
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/mydb
      SPRING_DATASOURCE_USERNAME: postgres
      SPRING_DATASOURCE_PASSWORD: password
      SPRING_JPA_HIBERNATE_DDL_AUTO: update
    depends_on:
      - postgres
      - redis
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  postgres:
    image: postgres:15-alpine
    container_name: postgres-db
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
    volumes:
      - postgres-data:/var/lib/postgresql/data
    networks:
      - app-network

  redis:
    image: redis:7-alpine
    container_name: redis-cache
    ports:
      - "6379:6379"
    networks:
      - app-network

volumes:
  postgres-data:

networks:
  app-network:
    driver: bridge

3. Spring Boot конфигурация для контейнеризации

# application.yml
spring:
  application:
    name: my-spring-app
  
  datasource:
    url: jdbc:postgresql://postgres:5432/mydb
    username: ${DB_USER:postgres}
    password: ${DB_PASSWORD:password}
    hikari:
      maximum-pool-size: 10
      minimum-idle: 5
      connection-timeout: 30000
  
  jpa:
    hibernate:
      ddl-auto: validate
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQL10Dialect
  
  redis:
    host: redis
    port: 6379
    timeout: 2000

server:
  port: 8080
  servlet:
    context-path: /api
  compression:
    enabled: true
    min-response-size: 1024

# Actuator для health checks
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus
  endpoint:
    health:
      show-details: when-authorized

4. Maven конфигурация для Docker

<plugins>
    <!-- Spring Boot Maven Plugin -->
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
            <finalName>my-app</finalName>
            <image>
                <name>${project.artifactId}:${project.version}</name>
            </image>
        </configuration>
    </plugin>
    
    <!-- Jib для прямой сборки Docker образа без Dockerfile -->
    <plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>jib-maven-plugin</artifactId>
        <version>3.3.0</version>
        <configuration>
            <to>
                <image>docker.io/myrepo/my-app:latest</image>
            </to>
            <container>
                <ports>
                    <port>8080</port>
                </ports>
                <environment>
                    <JAVA_TOOL_OPTIONS>-Xmx512m -Xms256m</JAVA_TOOL_OPTIONS>
                </environment>
            </container>
        </configuration>
    </plugin>
</plugins>

5. Пример Spring Boot приложения с Docker

@SpringBootApplication
@EnableCaching
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@Configuration
public class DockerConfig {
    
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder
            .setConnectTimeout(Duration.ofSeconds(5))
            .setReadTimeout(Duration.ofSeconds(10))
            .build();
    }
}

@RestController
@RequestMapping("/api/v1/health")
public class HealthController {
    
    @GetMapping
    public ResponseEntity<Map<String, String>> health() {
        return ResponseEntity.ok(Map.of(
            "status", "UP",
            "version", "1.0.0",
            "timestamp", LocalDateTime.now().toString()
        ));
    }
}

6. Оптимизация для Docker

Размер образа

# Используем slim образ вместо полного
FROM openjdk:17-slim

# Удаляем ненужные зависимости
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*

Memory и CPU constraints

services:
  app:
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 512M
        reservations:
          cpus: '0.5'
          memory: 256M

JVM флаги для контейнера

ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -XX:MinRAMPercentage=50.0"
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar app.jar"]

7. CI/CD интеграция

# .github/workflows/build-docker.yml
name: Build Docker Image

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
      
      - name: Build with Maven
        run: mvn clean package -DskipTests
      
      - name: Build Docker image
        run: docker build -t ${{ secrets.DOCKER_USERNAME }}/my-app:${{ github.sha }} .
      
      - name: Push to Docker Hub
        run: docker push ${{ secrets.DOCKER_USERNAME }}/my-app:${{ github.sha }}

8. Практические советы

  • Используйте .dockerignore для исключения ненужных файлов
  • Кэшируйте слои Maven в Docker
  • Используйте health checks для контроля состояния контейнера
  • Логируйте в stdout/stderr (Docker перенаправляет в логи)
  • Используйте environment переменные для конфигурации
  • Устанавливайте правильные timeout и retry логику

Преимущества Spring Boot в Docker

  • Встроенный Tomcat/Netty — не требует отдельного application server
  • Легкая кonfigurация через properties/yaml
  • Excellent metrics via Actuator
  • Быстрый startup время
  • Хорошая интеграция с Kubernetes

Spring Boot делает процесс контейнеризации простым и естественным.

Как Spring Boot интегрируется с концепцией докеризации | PrepBro