8 Docker to 1

September 2025. Story of simplification.

Before

services:
  mysql:
  redis:
  backend:
  frontend:
  dispatcher:
  nginx:
  html-cache-generator:
  worker:

8 containers. Each with its own Dockerfile. Each can crash.

Problems

Build 15 minutes. One container crashed - figure out which one. Logs in 8 places.

docker-compose up - and wait. Something didn't come up - figure out why.

Local development turned into fighting Docker.

First simplification

Removed html-cache-generator. Puppeteer too heavy, couldn't fix the flicker.

Removed worker - backend runs tasks directly.

6 containers.

Second simplification

Embedded Dispatcher into backend. One process, one container.

Built frontend statically. Nginx serves files.

4 containers.

LITE profile

SQLite instead of MySQL. In-memory instead of Redis.

2 containers: backend + nginx.

Result

Before: 15 minutes, 8 containers, 500MB RAM After: 30 seconds, 2 containers, 23MB RAM

For production with load - full configuration. For everything else - LITE.

← Back to blog