Java Docker容器化:最佳实践
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. 最佳实践
- 使用多阶段构建:减小镜像大小
- 使用Alpine镜像:减小基础镜像大小
- 使用非root用户:提高安全性
- 配置健康检查:确保容器可用性
- 使用.dockerignore:排除不需要的文件
总结
Docker容器化是Java应用部署的重要方式。掌握Docker的最佳实践,可以构建高效、安全的容器化应用。