Docker ช่วยให้รัน Java Application ได้ง่ายขึ้นโดยไม่ต้องติดตั้ง JDK/JRE บนเครื่องโดยตรง ใช้ Official Java Image จาก Docker Hub
ขั้นตอนการรัน Java ใน Docker
1. สร้างโฟลเดอร์โปรเจกต์
mkdir my-java-app cd my-java-app
2. สร้าง Java Application
ไฟล์ HelloWorld.java:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Welcome to TutorialsPoint - Running in Docker!");
System.out.println("Java Version: " + System.getProperty("java.version"));
}
}
3. สร้าง Dockerfile
ไฟล์ Dockerfile (ไม่มี extension):
# ใช้ Official OpenJDK image (ขนาดเล็ก ใช้ Alpine) FROM openjdk:17-alpine # ตั้ง working directory WORKDIR /app # คัดลอก source code COPY HelloWorld.java . # Compile RUN javac HelloWorld.java # รัน application CMD ["java", "HelloWorld"]
อธิบายคำสั่ง Dockerfile
| คำสั่ง | คำอธิบาย |
|---|---|
| FROM | Base image (openjdk:17-alpine = JDK 17 บน Alpine Linux ขนาด ~100MB) |
| WORKDIR | โฟลเดอร์ทำงานภายใน container |
| COPY | คัดลอกไฟล์จาก host เข้า image |
| RUN | รันคำสั่งตอน build (compile) |
| CMD | คำสั่งเริ่มต้นตอน run container |
4. Build Docker Image
docker build -t my-java-app .
-t my-java-appตั้งชื่อ image.build context (โฟลเดอร์ปัจจุบัน)
5. Run Container
docker run my-java-app
ผลลัพธ์
Welcome to TutorialsPoint - Running in Docker! Java Version: 17.0.8
วิธีที่ 2: Multi-stage Build (สำหรับ Production - Image เล็กลง)
# Stage 1: Build FROM maven:3.9-eclipse-temurin-17 AS builder WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn clean package -DskipTests # Stage 2: Runtime (ใช้ JRE เล็กกว่า JDK) FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --from=builder /app/target/*.jar app.jar CMD ["java", "-jar", "app.jar"]
ข้อดีของ Multi-stage
- Image ขนาดเล็กลงมาก (JRE แทน JDK, ไม่มี source/maven cache)
- แยก build environment และ runtime environment
- ปลอดภัยกว่า (ไม่มี compiler/tools ใน production image)
รัน Spring Boot Application ใน Docker
# Dockerfile สำหรับ Spring Boot (fat jar) FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY target/my-app-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
# Build ./mvnw clean package docker build -t my-spring-app . # Run docker run -p 8080:8080 my-spring-app
คำสั่ง Docker ที่ควรรู้
| คำสั่ง | คำอธิบาย |
|---|---|
docker images | ดู images ทั้งหมด |
docker ps | ดู containers ที่กำลังรัน |
docker ps -a | ดู containers ทั้งหมด (รวมหยุดแล้ว) |
docker logs <container_id> | ดู logs |
docker exec -it <container_id> sh | เข้า shell ภายใน container |
docker stop <container_id> | หยุด container |
docker rm <container_id> | ลบ container |
docker rmi <image_name> | ลบ image |
Best Practices
- ใช้
.dockerignoreเพื่อไม่ copy ไฟล์ไม่จำเป็น (target/, .git, *.class, ฯลฯ) - ใช้ specific tag (เช่น
openjdk:17-alpine) ไม่ใช้latest - รันเป็น non-root user เพื่อความปลอดภัย
- ตั้งค่า JVM options สำหรับ container (
-XX:MaxRAMPercentage=75.0) - ใช้
docker-composeสำหรับ multi-container apps
.dockerignore ตัวอย่าง
target/ *.class .git/ .gitignore Dockerfile docker-compose.yml *.md .idea/ .vscode/