Docker Java
How to run a Java application in Docker.
Java Dockerfile
# Stage 1: Build
FROM maven:3.9-eclipse-temurin-17 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
# Stage 2: Production
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]
docker-compose.yml
version: '3.8'
services:
api:
build: .
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://database:5432/myapp
- SPRING_DATASOURCE_USERNAME=user
- SPRING_DATASOURCE_PASSWORD=pass
networks:
- app-net
database:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- app-net
networks:
app-net:
volumes:
postgres-data:
Use Case: Java Spring Boot
# Run Java
docker-compose up -d
# Build
docker-compose build
# Test
docker-compose exec api mvn test
Everyday Use Case
Case: A developer needs to run Java.
# Build
docker-compose build
# Run
docker-compose up -d
# Java commands
docker-compose exec api mvn test
docker-compose exec api mvn spring-boot:run
Best Practices
- Multi-stage build: For a smaller image
- JRE image: Not the JDK for production
- Non-root user: For security
- Health check: For monitoring
Conclusion
Java in Docker is easy to set up. Use a multi-stage build to produce a smaller image.