Docker Integration
MockLoop provides comprehensive Docker support for containerizing your mock servers, making deployment and scaling easier across different environments.
Overview
Docker integration in MockLoop includes:
- Automatic Dockerfile generation for mock servers
- Docker Compose configurations for multi-service setups
- Container orchestration support
- Environment-specific configurations
- Scaling and load balancing capabilities
Quick Start with Docker
Generating Docker-Enabled Mock Servers
When generating a mock server, Docker support is included by default:
from mockloop_mcp import generate_mock_api
# Generate mock server with Docker support
generate_mock_api(
spec_url_or_path="openapi.yaml",
output_dir_name="my_mock_server"
)
This creates:
- Dockerfile
- Container definition
- docker-compose.yml
- Multi-service orchestration
- .dockerignore
- Optimized build context
- requirements.txt
- Python dependencies
Building the Docker Image
cd my_mock_server
# Build the Docker image
docker build -t my-mock-server .
# Run the container
docker run -p 8000:8000 my-mock-server
Using Docker Compose
For more complex setups with databases and additional services:
# Start all services
docker-compose up -d
# View logs
docker-compose logs -f
# Stop services
docker-compose down
Docker Configuration
Dockerfile Structure
The generated Dockerfile follows best practices:
FROM python:3.11-slim
# Set working directory
WORKDIR /app
# Install system dependencies
RUN apt-get update && apt-get install -y \
curl \
&& rm -rf /var/lib/apt/lists/*
# Copy requirements and install Python dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy application code
COPY . .
# Create non-root user
RUN useradd -m -u 1000 mockloop && chown -R mockloop:mockloop /app
USER mockloop
# Expose port
EXPOSE 8000
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8000/health || exit 1
# Start the server
CMD ["python", "main.py"]
Environment Variables
Configure your mock server using environment variables:
# Basic configuration
docker run -p 8000:8000 \
-e MOCK_PORT=8000 \
-e MOCK_HOST=0.0.0.0 \
-e LOG_LEVEL=INFO \
my-mock-server
# Database configuration
docker run -p 8000:8000 \
-e DATABASE_URL=postgresql://user:pass@db:5432/mockloop \
-e REDIS_URL=redis://redis:6379/0 \
my-mock-server
Docker Compose Configuration
The generated docker-compose.yml
includes all necessary services:
version: '3.8'
services:
mock-server:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://postgres:password@postgres:5432/mockloop
- REDIS_URL=redis://redis:6379/0
- LOG_LEVEL=INFO
depends_on:
- postgres
- redis
volumes:
- ./logs:/app/logs
- ./data:/app/data
restart: unless-stopped
postgres:
image: postgres:15
environment:
- POSTGRES_DB=mockloop
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
restart: unless-stopped
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- mock-server
restart: unless-stopped
volumes:
postgres_data:
redis_data:
Production Deployment
Multi-Stage Builds
For optimized production images:
# Build stage
FROM python:3.11-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt
# Production stage
FROM python:3.11-slim
WORKDIR /app
# Copy dependencies from builder stage
COPY --from=builder /root/.local /root/.local
# Copy application
COPY . .
# Create non-root user
RUN useradd -m -u 1000 mockloop && chown -R mockloop:mockloop /app
USER mockloop
# Make sure scripts in .local are usable
ENV PATH=/root/.local/bin:$PATH
EXPOSE 8000
CMD ["python", "main.py"]
Health Checks and Monitoring
Configure comprehensive health monitoring:
# docker-compose.prod.yml
version: '3.8'
services:
mock-server:
build: .
deploy:
replicas: 3
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
Load Balancing
Use nginx for load balancing multiple instances:
# nginx.conf
upstream mock_servers {
server mock-server-1:8000;
server mock-server-2:8000;
server mock-server-3:8000;
}
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://mock_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /health {
access_log off;
proxy_pass http://mock_servers;
}
}
Container Orchestration
Kubernetes Deployment
Deploy to Kubernetes with proper configurations:
# k8s-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mockloop-server
spec:
replicas: 3
selector:
matchLabels:
app: mockloop-server
template:
metadata:
labels:
app: mockloop-server
spec:
containers:
- name: mockloop
image: my-mock-server:latest
ports:
- containerPort: 8000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: mockloop-secrets
key: database-url
- name: LOG_LEVEL
value: "INFO"
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8000
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: mockloop-service
spec:
selector:
app: mockloop-server
ports:
- protocol: TCP
port: 80
targetPort: 8000
type: LoadBalancer
Docker Swarm
Deploy using Docker Swarm:
# docker-stack.yml
version: '3.8'
services:
mock-server:
image: my-mock-server:latest
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: on-failure
networks:
- mockloop-network
environment:
- DATABASE_URL=postgresql://postgres:password@postgres:5432/mockloop
postgres:
image: postgres:15
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
environment:
- POSTGRES_DB=mockloop
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- mockloop-network
networks:
mockloop-network:
driver: overlay
volumes:
postgres_data:
Development Workflows
Development with Docker
Use Docker for consistent development environments:
# docker-compose.dev.yml
version: '3.8'
services:
mock-server:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "8000:8000"
volumes:
- .:/app
- /app/__pycache__
environment:
- FLASK_ENV=development
- LOG_LEVEL=DEBUG
command: python main.py --reload
Hot Reloading
Enable hot reloading for development:
# Dockerfile.dev
FROM python:3.11-slim
WORKDIR /app
# Install development dependencies
COPY requirements.dev.txt .
RUN pip install -r requirements.dev.txt
# Copy source code
COPY . .
# Enable hot reloading
CMD ["python", "main.py", "--reload", "--host", "0.0.0.0"]
Testing in Containers
Run tests in isolated containers:
# Run tests in container
docker run --rm \
-v $(pwd):/app \
-w /app \
python:3.11-slim \
bash -c "pip install -r requirements.txt && python -m pytest"
# Integration tests with docker-compose
docker-compose -f docker-compose.test.yml up --abort-on-container-exit
Performance Optimization
Image Size Optimization
Minimize Docker image size:
# Use alpine base image
FROM python:3.11-alpine
# Install only necessary packages
RUN apk add --no-cache \
curl \
&& pip install --no-cache-dir -r requirements.txt \
&& rm -rf /var/cache/apk/*
# Use .dockerignore to exclude unnecessary files
Caching Strategies
Optimize build caching:
# Copy requirements first for better caching
COPY requirements.txt .
RUN pip install -r requirements.txt
# Copy source code last
COPY . .
Resource Limits
Set appropriate resource limits:
services:
mock-server:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
Security Best Practices
Non-Root User
Always run containers as non-root:
Secret Management
Use Docker secrets for sensitive data:
services:
mock-server:
secrets:
- db_password
- api_key
environment:
- DATABASE_PASSWORD_FILE=/run/secrets/db_password
secrets:
db_password:
external: true
api_key:
external: true
Network Security
Isolate services with custom networks:
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true
services:
mock-server:
networks:
- frontend
- backend
postgres:
networks:
- backend
Monitoring and Logging
Centralized Logging
Configure centralized logging:
services:
mock-server:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
labels: "service=mockloop"
Metrics Collection
Integrate with monitoring systems:
services:
mock-server:
environment:
- PROMETHEUS_ENABLED=true
- METRICS_PORT=9090
ports:
- "9090:9090" # Metrics endpoint
Troubleshooting
Common Docker Issues
- Port conflicts: Use different ports or stop conflicting services
- Permission issues: Check user permissions and volume mounts
- Memory issues: Increase Docker memory limits
- Network connectivity: Verify network configurations
Debugging Containers
# Check container logs
docker logs mockloop-server
# Execute commands in running container
docker exec -it mockloop-server bash
# Inspect container configuration
docker inspect mockloop-server
# Check resource usage
docker stats mockloop-server
Next Steps
- Performance Monitoring - Monitor containerized services
- Scenario Management - Manage scenarios in containers
- Advanced Features - Explore advanced Docker features