Docker cung cấp môi trường đóng gói, nhất quán để chạy ứng dụng Java mà không cần cài đặt JDK/JRE trực tiếp trên máy host. Bài viết hướng dẫn 2 cách: dùng image Java chính thức (khuyên dùng) và tự build image custom.
Cách 1: Dùng image Java chính thức (Đơn giản, khuyên dùng)
Bước 1: Chuẩn bị project
mkdir my-java-app cd my-java-app
Bước 2: Tạo file Java
File Main.java:
public class Main {
public static void main(String[] args) {
System.out.println("Welcome to TutorialsPoint from Docker!");
}
}
Bước 3: Tạo Dockerfile
File Dockerfile (không có extension):
# Sử dụng image Java 21 chính thức (LTS, nhẹ - slim) FROM eclipse-temurin:21-jdk-alpine AS build WORKDIR /app # Copy source COPY Main.java . # Compile RUN javac Main.java # Runtime stage (nhẹ hơn - chỉ JRE) FROM eclipse-temurin:21-jre-alpine WORKDIR /app # Copy compiled class từ build stage COPY --from=build /app/Main.class . # Chạy ứng dụng CMD ["java", "Main"]
Giải thích: Sử dụng multi-stage build – stage đầu compile (cần JDK), stage sau chạy (chỉ cần JRE) → image nhẹ hơn nhiều (~50MB vs ~300MB).
Bước 4: Build image
docker build -t my-java-app .
Bước 5: Chạy container
docker run --rm my-java-app # Output: Welcome to TutorialsPoint from Docker!
Cách 2: Build image custom với Maven/Gradle (Dự án thực tế)
Với project Maven/Gradle, dùng build tool bên trong container:
# Dockerfile for Maven project FROM maven:3.9-eclipse-temurin-21 AS build WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package -DskipTests FROM eclipse-temurin:21-jre-alpine WORKDIR /app COPY --from=build /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
Các lệnh Docker hữu ích
| Lệnh | Mô tả |
|---|---|
docker images | Liệt kê images local |
docker ps -a | Xem tất cả containers |
docker logs <container_id> | Xem log container |
docker exec -it <id> sh | Vào shell container đang chạy |
docker rmi <image> | Xóa image |
Best Practices cho Java trong Docker
- Dùng base image Alpine (eclipse-temurin:xx-jre-alpine) – nhẹ, bảo mật.
- Multi-stage build – tách compile và runtime.
- Non-root user:
RUN addgroup -S app && adduser -S app -G app && USER app. - JVM tuning cho container:
JAVA_OPTS="-XX:MaxRAMPercentage=75.0 -XX:+UseContainerSupport". - .dockerignore: Loại trừ target/, .git/, *.log, .idea/ khỏi build context.
- Health check:
HEALTHCHECK CMD curl -f https://localhost:8080/actuator/health || exit 1.
Kết luận
Docker giúp tiêu chuẩn hóa môi trường Java từ dev → test → prod. Image eclipse-temurin (thay thế OpenJDK официальный) là lựa chọn hiện đại, bảo mật, được cập nhật thường xuyên. Multi-stage build là chuẩn mực cho production.