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

Как запустить Java приложение в Docker

1.6 Junior🔥 161 комментариев
#Docker, Kubernetes и DevOps

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

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

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

# Запуск Java приложения в Docker

Запуск Java приложений в контейнерах Docker — стандартная практика в современной разработке. Рассмотрю подробный процесс.

1. Создание Dockerfile

Основная структура Dockerfile для Java приложения:

# Многоэтапная сборка (multi-stage build) для оптимизации размера образа
FROM maven:3.9-eclipse-temurin-21 AS builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src/ src/
RUN mvn clean package -DskipTests

# Финальный образ
FROM eclipse-temurin:21-jre
WORKDIR /app
COPY --from=builder /build/target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

2. Оптимизация для Production

FROM eclipse-temurin:21-jre-alpine
WORKDIR /app

# Non-root пользователь для безопасности
RUN useradd -m -u 1000 appuser

COPY --chown=appuser:appuser target/app.jar app.jar

USER appuser
EXPOSE 8080

# Healthcheck
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:8080/actuator/health || exit 1

ENTRYPOINT ["java", "-Xmx512m", "-XX:+UseG1GC", "-jar", "app.jar"]

3. JVM параметры

Важные флаги для контейнеров:

java -Xms512m \           # Начальный размер heap
     -Xmx1024m \          # Максимальный размер heap
     -XX:+UseG1GC \       # G1 сборщик мусора (рекомендуется для контейнеров)
     -XX:+UseStringDeduplication \
     -XX:+ParallelRefProcEnabled \
     -XX:MaxGCPauseMillis=200 \
     -Dfile.encoding=UTF-8 \
     -jar app.jar

4. Сборка и запуск

# Сборка образа
docker build -t myapp:1.0 .

# Запуск контейнера
docker run -d \
  --name myapp \
  -p 8080:8080 \
  -e SPRING_PROFILES_ACTIVE=prod \
  -e DATABASE_URL=jdbc:postgresql://db:5432/mydb \
  -e JAVA_OPTS="-Xmx1024m" \
  myapp:1.0

# Просмотр логов
docker logs -f myapp

# Проверка статуса
docker ps

5. Docker Compose для сложных приложений

version: '3.9'
services:
  app:
    build: .
    container_name: java-app
    ports:
      - "8080:8080"
    environment:
      SPRING_PROFILES_ACTIVE: prod
      DATABASE_URL: jdbc:postgresql://postgres:5432/mydb
      DATABASE_USER: postgres
      DATABASE_PASSWORD: password
    depends_on:
      postgres:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
      interval: 30s
      timeout: 3s
      retries: 3
    restart: unless-stopped

  postgres:
    image: postgres:16
    container_name: postgres
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  postgres_data:

6. Best Practices

  • Alpine образы: Используй alpine-версии для уменьшения размера (75 МБ vs 200 МБ)
  • Многоэтапная сборка: Отделяй builder от runtime образа
  • Non-root пользователь: Запускай приложение от непривилегированного пользователя
  • Healthchecks: Добавляй проверки здоровья контейнера
  • Переменные окружения: Используй .env для конфигурации
  • Хранение логов: Логи должны писаться в stdout/stderr
  • Назначение памяти: Всегда явно указывай -Xmx и -Xms

7. Проверка работоспособности

# Подключиться к контейнеру
docker exec -it myapp /bin/sh

# Проверить процессы
docker top myapp

# Получить информацию о контейнере
docker inspect myapp

# Просмотреть ресурсы
docker stats myapp

Этот подход обеспечивает надёжный, масштабируемый и воспроизводимый способ развёртывания Java приложений в любой окружении.

Как запустить Java приложение в Docker | PrepBro