Interview question
How do you containerize a Spring Boot application with Docker? Docker से Spring Boot application को कैसे containerize करते हैं?
Answer
Create Dockerfile to package Spring Boot app as container image. Use multi-stage builds to optimize image size. Spring Boot provides spring-boot-maven-plugin for efficient layered images.
// Dockerfile - Multi-stage Build
FROM maven:3.8-openjdk-11 AS builder
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests
# Runtime Stage
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
# Expose port
EXPOSE 8080
# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
CMD curl -f http://localhost:8080/actuator/health || exit 1
# Run application
ENTRYPOINT ['java', '-jar', 'app.jar']
// Optimized Dockerfile (Spring Boot 2.3+)
FROM openjdk:11-jre-slim
WORKDIR /app
# Extract layers
COPY target/dependency/BOOT-INF/lib /app/lib
COPY target/dependency/BOOT-INF/classes /app
COPY target/dependency/META-INF /app/META-INF
EXPOSE 8080
ENTRYPOINT ['java', '-cp', 'app:app/lib/*',
'com.example.Application']
// pom.xml - Maven Plugin
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
</plugin>
</plugins>
// Docker Build Command
docker build -t app:1.0 .
// docker-compose.yml - Complete Stack
version: '3.8'
services:
app:
image: app:1.0
container_name: app
ports:
- '8080:8080'
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/appdb
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: password
SPRING_PROFILES_ACTIVE: docker
depends_on:
- mysql
- redis
networks:
- app-network
mysql:
image: mysql:8.0
container_name: mysql
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: appdb
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
redis:
image: redis:alpine
container_name: redis
ports:
- '6379:6379'
networks:
- app-network
volumes:
mysql-data:
networks:
app-network:
driver: bridge
// Docker Run Commands
# Build image
docker build -t myapp:1.0 .
# Run container
docker run -d -p 8080:8080 --name myapp myapp:1.0
// Best Practices:
// 1. Use Alpine for smaller images
// 2. Multi-stage builds
// 3. Layer caching optimization
// 4. Health checks
// 5. Non-root user
// 6. Resource limits
// 7. Environment variablesDocker Containerization:
Dockerfile बनाना:
1. Base image select करना
2. Dependencies copy करना
3. Application build करना
4. Expose port करना
5. Health check add करना
6. Entrypoint define करना
Multi-stage Build:
- Builder stage - compile करना
- Runtime stage - lean image
- Size reduction
Optimization:
- Alpine image (~5MB)
- Layer caching
- .dockerignore file
docker-compose:
- Multiple services
- Networking
- Volume mounting
- Environment variables
Commands:
build: docker build -t app:1.0 .
run: docker run -p 8080:8080 app:1.0
compose: docker-compose up -dWas this answer clear?