Kubernetes Orchestration
Learn container orchestration with Docker Compose and Kubernetes for managing microservices deployments.
90 min•By Priygop Team•Last updated: Feb 2026
Docker Compose for Microservices
Docker Compose allows you to define and run multi-container Docker applications, perfect for local microservices development.
Docker Compose Configuration
Example
# docker-compose.yml
version: '3.8'
services:
# API Gateway
api-gateway:
build: ./api-gateway
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- USER_SERVICE_URL=http://user-service:3001
- PRODUCT_SERVICE_URL=http://product-service:3002
- ORDER_SERVICE_URL=http://order-service:3003
depends_on:
- user-service
- product-service
- order-service
networks:
- microservices
# User Service
user-service:
build: ./user-service
ports:
- "3001:3001"
environment:
- NODE_ENV=production
- MONGODB_URL=mongodb://mongo:27017/users
depends_on:
- mongo
networks:
- microservices
# Product Service
product-service:
build: ./product-service
ports:
- "3002:3002"
environment:
- NODE_ENV=production
- MONGODB_URL=mongodb://mongo:27017/products
depends_on:
- mongo
networks:
- microservices
# Order Service
order-service:
build: ./order-service
ports:
- "3003:3003"
environment:
- NODE_ENV=production
- MONGODB_URL=mongodb://mongo:27017/orders
- RABBITMQ_URL=amqp://rabbitmq:5672
depends_on:
- mongo
- rabbitmq
networks:
- microservices
# Database
mongo:
image: mongo:5.0
ports:
- "27017:27017"
volumes:
- mongo_data:/data/db
networks:
- microservices
# Message Queue
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin
volumes:
- rabbitmq_data:/var/lib/rabbitmq
networks:
- microservices
# Redis for caching
redis:
image: redis:6-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
networks:
- microservices
volumes:
mongo_data:
rabbitmq_data:
redis_data:
networks:
microservices:
driver: bridgeKubernetes Deployment
Example
# user-service-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
labels:
app: user-service
spec:
replicas: 3
selector:
matchLabels:
app: user-service
template:
metadata:
labels:
app: user-service
spec:
containers:
- name: user-service
image: user-service:latest
ports:
- containerPort: 3001
env:
- name: NODE_ENV
value: "production"
- name: MONGODB_URL
valueFrom:
secretKeyRef:
name: mongodb-secret
key: url
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 3001
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 3001
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user-service
ports:
- protocol: TCP
port: 80
targetPort: 3001
type: ClusterIPService Mesh with Istio
Example
# istio-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: microservices-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "microservices.local"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: microservices-routes
spec:
hosts:
- "microservices.local"
gateways:
- microservices-gateway
http:
- match:
- uri:
prefix: /api/users
route:
- destination:
host: user-service
port:
number: 80
- match:
- uri:
prefix: /api/products
route:
- destination:
host: product-service
port:
number: 80Monitoring & Observability
Example
# prometheus-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'microservices'
static_configs:
- targets: ['user-service:3001', 'product-service:3002', 'order-service:3003']
metrics_path: /metrics
scrape_interval: 5sMini-Project: Complete Kubernetes Setup
Example
# Complete Kubernetes deployment for microservices
# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: microservices
---
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: microservices-config
namespace: microservices
data:
NODE_ENV: "production"
LOG_LEVEL: "info"
---
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: microservices-secrets
namespace: microservices
type: Opaque
data:
mongodb-url: <base64-encoded-url>
jwt-secret: <base64-encoded-secret>
---
# api-gateway-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-gateway
namespace: microservices
spec:
replicas: 2
selector:
matchLabels:
app: api-gateway
template:
metadata:
labels:
app: api-gateway
spec:
containers:
- name: api-gateway
image: api-gateway:latest
ports:
- containerPort: 3000
envFrom:
- configMapRef:
name: microservices-config
- secretRef:
name: microservices-secrets
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
---
# api-gateway-service.yaml
apiVersion: v1
kind: Service
metadata:
name: api-gateway
namespace: microservices
spec:
selector:
app: api-gateway
ports:
- port: 80
targetPort: 3000
type: LoadBalancer
---
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: microservices-ingress
namespace: microservices
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: microservices.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-gateway
port:
number: 80Try It Yourself — Microservices & Architecture
Try It Yourself — Microservices & ArchitectureHTML
HTML Editor
✓ ValidTab = 2 spaces
HTML|39 lines|1939 chars|✓ Valid syntax
UTF-8