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.