← Назад к вопросам
Как запустить 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 приложений в любой окружении.