Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
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 variables
Docker 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 -d

Was this answer clear?