Deploy Spring Boot apps with Docker and Kubernetes! Learn containerization, orchestration, and scaling in this step-by-step guide
Modern software deployment is all about containers and orchestration, and if you’re working with Spring Boot, leveraging Docker and Kubernetes can transform how you manage and scale applications. This beginner-friendly guide explains how to package a Spring Boot application into a Docker container and deploy it to a Kubernetes cluster.
Preparing Your Spring Boot Application for Docker
Docker simplifies packaging your application with its dependencies into a lightweight, portable container. To start, ensure your Spring Boot application is production-ready:
- Package your application as a JAR file using Maven or Gradle.
- Externalize configurations for environment-specific flexibility.
Example Maven command to create a JAR:
mvn clean package
Create a Dockerfile
to define how the application is built and run:
# Use an OpenJDK base image
FROM openjdk:17-jdk-slim
# Set the working directory in the container
WORKDIR /app
# Copy the JAR file into the container
COPY target/myapp.jar myapp.jar
# Expose the application port
EXPOSE 8080
# Command to run the application
ENTRYPOINT ["java", "-jar", "myapp.jar"]
Build and run the Docker image:
# Build the Docker image
docker build -t my-spring-boot-app .
# Run the container
docker run -p 8080:8080 my-spring-boot-app
Visit http://localhost:8080
to confirm your application is running.
Deploying to Kubernetes
Kubernetes (K8s) is the go-to platform for orchestrating containerized applications. It automates deployment, scaling, and management of applications.
Start by creating a k8s
directory to store your deployment configuration files.
Creating a Deployment Manifest
The Deployment resource ensures that your application is running and manages scaling and updates. Here’s an example YAML file:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-spring-boot-app
spec:
replicas: 3
selector:
matchLabels:
app: my-spring-boot-app
template:
metadata:
labels:
app: my-spring-boot-app
spec:
containers:
- name: my-spring-boot-app
image: my-spring-boot-app:latest
ports:
- containerPort: 8080
Exposing the Application with a Service
To make your application accessible, define a Service:
apiVersion: v1
kind: Service
metadata:
name: my-spring-boot-app-service
spec:
type: LoadBalancer
selector:
app: my-spring-boot-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
Deploying to Kubernetes
First, push your Docker image to a container registry (like Docker Hub):
docker tag my-spring-boot-app <your-dockerhub-username>/my-spring-boot-app:latest
docker push <your-dockerhub-username>/my-spring-boot-app:latest
Then, apply the Kubernetes manifests:
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml
Check the status of your deployment:
kubectl get pods
kubectl get services
Once the Service is running, access your application via the external IP provided by the LoadBalancer.
Configuring Environment Variables in Kubernetes
Externalizing configuration is key to keeping your container images environment-agnostic. Use a ConfigMap and a Secret in Kubernetes for this purpose.
Example ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
SPRING_PROFILES_ACTIVE: prod
Example Secret (for sensitive data like passwords):
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
DB_PASSWORD: cGFzc3dvcmQ=
Reference these in your deployment manifest:
env:
- name: SPRING_PROFILES_ACTIVE
valueFrom:
configMapKeyRef:
name: app-config
key: SPRING_PROFILES_ACTIVE
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PASSWORD
Monitoring and Scaling
Kubernetes provides built-in tools to monitor and scale your application:
- View logs:
kubectl logs <pod-name>
- Scale replicas:
kubectl scale deployment my-spring-boot-app --replicas=5
- Monitor resources:
kubectl top pods
For more advanced monitoring, consider integrating Prometheus and Grafana.
Conclusion
Deploying Spring Boot applications with Docker and Kubernetes simplifies management and scaling, providing flexibility to meet modern application demands. Docker containers encapsulate your application, while Kubernetes ensures high availability and automated scaling. By following this guide, you’ve taken the first step toward mastering containerized Spring Boot deployments. With these tools, your applications are ready to meet the challenges of the cloud era.
Let’s connect!
📧 Don’t Miss a Post! Subscribe to my Newsletter!
➡️ LinkedIn
🚩 Original Post
☕ Buy me a Coffee
Top comments (0)