Gymterview
middle

Как организовать docker-compose для Java-приложения с базой данных?

Docker Compose для Java-приложения — это YAML-конфигурация, описывающая все сервисы (приложение, БД, кэш, reverse proxy), их зависимости, health check и ресурсные ограничения.

Типичная конфигурация: Spring Boot + PostgreSQL + Redis + Nginx

Полный docker-compose.yml
version: '3.8'

services:
  # Nginx как reverse proxy
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      app:
        condition: service_healthy
    restart: unless-stopped

  # Spring Boot приложение
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
      - "5005:5005"  # debug порт (только для разработки)
    environment:
      SPRING_PROFILES_ACTIVE: docker
      SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/mydb
      SPRING_DATASOURCE_USERNAME: admin
      SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD:-secret}
      SPRING_DATA_REDIS_HOST: redis
      JAVA_OPTS: "-Xmx512m -XX:MaxRAMPercentage=75.0"
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider",
             "http://localhost:8080/actuator/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    restart: unless-stopped
    deploy:
      resources:
        limits:
          memory: 768M
          cpus: '1.0'

  # PostgreSQL
  db:
    image: postgres:16-alpine
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: ${DB_PASSWORD:-secret}
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U admin -d mydb"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped

  # Redis для кэширования
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    command: redis-server --maxmemory 128mb --maxmemory-policy allkeys-lru
    volumes:
      - redis-data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped

volumes:
  postgres-data:
  redis-data:

Файл .env (не коммитится в Git)

Пример
DB_PASSWORD=my_secure_password

Команды для работы

Пример
# Запуск всей инфраструктуры
docker compose up -d

# Пересборка только приложения
docker compose up -d --build app

# Просмотр логов приложения
docker compose logs -f app

# Остановка с удалением данных
docker compose down -v

На собеседовании: покажите, что умеете описать реалистичный стек. Ключевые моменты: health check для всех сервисов, depends_on с condition: service_healthy, вынос секретов в .env файл, именованные тома для данных БД, ограничение ресурсов для JVM-приложения. Это типовая задача на техническом собеседовании для middle/senior.