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 nginx

Docker 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

  • Always use specific image tags — never latest in production
  • Use healthchecks — ensure services are actually ready before depending on them
  • Named volumes — don't use bind mounts for data persistence in production
  • Environment variables — use .env files or Docker secrets for sensitive data
  • Resource limits — set mem_limit and cpus to prevent runaway containers
  • Logging — configure log drivers to prevent disk fill
  • Want 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