← 返回首页
🐳

Java Docker容器化:最佳实践

📂 java ⏱ 1 min 198 words

Java Docker容器化:最佳实践

概述

Docker是容器化的行业标准。本教程介绍Java应用的Docker容器化最佳实践。

1. Dockerfile最佳实践

# 多阶段构建
FROM maven:3.8-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests

FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

2. 优化镜像

# 使用Alpine基础镜像
FROM openjdk:11-jre-alpine

# 添加非root用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

# 设置JVM参数
ENV JAVA_OPTS="-XX:+UseG1GC -XX:MaxRAMPercentage=75.0"

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

EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

3. Docker Compose

version: '3.8'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=docker
      - DB_HOST=mysql
      - REDIS_HOST=redis
    depends_on:
      - mysql
      - redis
    networks:
      - app-network
  
  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=mydb
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network
  
  redis:
    image: redis:alpine
    networks:
      - app-network

networks:
  app-network:

volumes:
  mysql-data:

4. 实际应用示例

环境变量配置

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Value("${DB_HOST:localhost}")
    private String dbHost;
    
    @Value("${REDIS_HOST:localhost}")
    private String redisHost;
    
    @Value("${JAVA_OPTS:}")
    private String javaOpts;
}

健康检查

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;

@Component
public class DockerHealthIndicator implements HealthIndicator {
    @Override
    public Health health() {
        // 检查容器内服务状态
        if (isServiceRunning()) {
            return Health.up().build();
        }
        return Health.down().build();
    }
}

5. 最佳实践

  1. 使用多阶段构建:减小镜像大小
  2. 使用Alpine镜像:减小基础镜像大小
  3. 使用非root用户:提高安全性
  4. 配置健康检查:确保容器可用性
  5. 使用.dockerignore:排除不需要的文件

总结

Docker容器化是Java应用部署的重要方式。掌握Docker的最佳实践,可以构建高效、安全的容器化应用。