Docker Compose Examples 2026: 15 Production-Ready Configurations
Meta description: 15 copy-paste Docker Compose examples for 2026. Full-stack apps, databases, monitoring, CI/CD. Production-ready configurations with explanations. Keywords: docker compose examples 2026, docker-compose.yml, docker compose tutorial, production docker setup, docker compose postgres redis nginxDocker Compose remains the fastest way to define and run multi-container applications. Whether you're setting up a development environment or deploying to production, having solid Compose files saves hours of configuration.
Here are 15 production-ready Docker Compose examples you can use today.
1. Full-Stack Web App (React + Node.js + PostgreSQL)
version: '3.9'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
environment:
- REACT_APP_API_URL=http://localhost:4000
depends_on:
- api
api:
build: ./backend
ports:
- "4000:4000"
environment:
- DATABASE_URL=postgresql://app:secret@db:5432/myapp
- REDIS_URL=redis://cache:6379
- JWT_SECRET=your-secret-key
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: myapp
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d myapp"]
interval: 5s
timeout: 5s
retries: 5
cache:
image: redis:7-alpine
volumes:
- redisdata:/data
volumes:
pgdata:
redisdata:
This is the foundation most web apps need. PostgreSQL for persistence, Redis for caching and sessions, a Node.js API, and a React frontend.
2. WordPress with HTTPS (Nginx + MariaDB + Certbot)
version: '3.9'
services:
wordpress:
image: wordpress:6-php8.2-fpm
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp
WORDPRESS_DB_PASSWORD: secure_password
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
db:
image: mariadb:11
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wp
MYSQL_PASSWORD: secure_password
MYSQL_ROOT_PASSWORD: root_secure
volumes:
- db_data:/var/lib/mysql
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- wp_data:/var/www/html
- certbot_data:/etc/letsencrypt
depends_on:
- wordpress
certbot:
image: certbot/certbot
volumes:
- certbot_data:/etc/letsencrypt
- wp_data:/var/www/html
volumes:
wp_data:
db_data:
certbot_data:
3. Monitoring Stack (Prometheus + Grafana + Node Exporter)
version: '3.9'
services:
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prom_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d'
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
GF_SECURITY_ADMIN_PASSWORD: admin
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- prometheus
node-exporter:
image: prom/node-exporter:latest
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
volumes:
prom_data:
grafana_data:
Essential for any production environment. Prometheus collects metrics, Grafana visualizes them, Node Exporter provides host-level metrics.
4. Development Database Cluster (PostgreSQL + pgAdmin + Redis + RedisInsight)
version: '3.9'
services:
postgres:
image: postgres:16-alpine
ports:
- "5432:5432"
environment:
POSTGRES_DB: dev
POSTGRES_USER: developer
POSTGRES_PASSWORD: devpass
volumes:
- pgdata:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
pgadmin:
image: dpage/pgadmin4
ports:
- "5050:80"
environment:
PGADMIN_DEFAULT_EMAIL: dev@local.com
PGADMIN_DEFAULT_PASSWORD: admin
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redisdata:/data
redis-insight:
image: redislabs/redisinsight:latest
ports:
- "8001:8001"
volumes:
pgdata:
redisdata:
5. CI/CD Runner (GitLab Runner + Docker-in-Docker)
version: '3.9'
services:
gitlab-runner:
image: gitlab/gitlab-runner:latest
restart: always
volumes:
- runner_config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
dind:
image: docker:dind
privileged: true
environment:
DOCKER_TLS_CERTDIR: ""
volumes:
- dind_storage:/var/lib/docker
volumes:
runner_config:
dind_storage:
6. ELK Stack (Elasticsearch + Logstash + Kibana)
version: '3.9'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
volumes:
- es_data:/usr/share/elasticsearch/data
logstash:
image: docker.elastic.co/logstash/logstash:8.12.0
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
depends_on:
- elasticsearch
kibana:
image: docker.elastic.co/kibana/kibana:8.12.0
ports:
- "5601:5601"
depends_on:
- elasticsearch
volumes:
es_data:
7. Message Queue (RabbitMQ + Management UI)
version: '3.9'
services:
rabbitmq:
image: rabbitmq:3-management-alpine
ports:
- "5672:5672"
- "15672:15672"
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: admin
volumes:
- rabbitmq_data:/var/lib/rabbitmq
volumes:
rabbitmq_data:
8. Reverse Proxy (Traefik + Auto-SSL)
version: '3.9'
services:
traefik:
image: traefik:v3.0
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- traefik_certs:/letsencrypt
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
- "--certificatesresolvers.letsencrypt.acme.email=you@example.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
webapp:
image: nginx:alpine
labels:
- "traefik.enable=true"
- "traefik.http.routers.webapp.rule=Host(app.example.com)"
- "traefik.http.routers.webapp.tls.certresolver=letsencrypt"
volumes:
traefik_certs:
9. MinIO Object Storage (S3-Compatible)
version: '3.9'
services:
minio:
image: minio/minio
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
volumes:
- minio_data:/data
command: server /data --console-address ":9001"
volumes:
minio_data:
10. n8n Workflow Automation
version: '3.9'
services:
n8n:
image: n8nio/n8n
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=admin
- GENERIC_TIMEZONE=Europe/Paris
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:
Best Practices for Production Docker Compose
latest in production.env files or Docker secrets for sensitive datamem_limit and cpus to prevent runaway containersWant a Complete DevOps Setup?
These examples are a starting point. For a production-ready DevOps pipeline with Docker, Kubernetes configs, Terraform modules, and CI/CD workflows — check out the DevOps Starter Kit (89€, one-time payment).
It includes 10+ Compose files, Kubernetes manifests, GitHub Actions workflows, and monitoring dashboards — everything you need to deploy and scale.
Browse all developer templates — Ship faster, pay once.Published on templates.quernel-cloud.com — Dev Templates for Modern Developers