Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

รัน Java Application ภายใน Docker Container

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

คำสั่งคำอธิบาย
FROMBase 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/