Build a docker-compose.yml from forms: add services, map ports, set env vars, mount volumes and wire dependencies. Downloads as a ready-to-run YAML file.
A web app plus Postgres plus Redis, an Nginx proxy fronting a Node API, or a Prometheus-Grafana observability pair — building these stacks means typing ports, volumes and dependencies into the same docker-compose YAML structure every time. The Docker Compose Generator turns forms into a ready-to-run compose file, so you specify what each service needs without re-learning indentation rules or looking up the networks block.
Every service is configured through collapsible panels: pick the image and tag, add ports, set environment variables inline or flag them to pull from a .env file, and mount bind paths, named volumes or tmpfs targets. Services can depend on each other by name, and a healthcheck command writes a full healthcheck block with interval, timeout and retries.
The page opens on a web + Postgres + Redis setup. The web service runs node:18-alpine, exposes port 3000:3000, sets NODE_ENV=production and PORT=3000 as environment variables, and mounts a bind volume ./src:/app/src. The database service maps a named volume pgdata to /var/lib/postgresql/data and sets three Postgres variables. The cache service has no ports and no volumes; it is reachable through the shared bridge network only. All three restart unless-stopped, and the generated YAML adds a volumes: section declaring pgdata:.
Pressing Load Sample again cycles through an Nginx plus Node plus Mongo microservices pattern, a single FastAPI service with a healthcheck, and a Prometheus plus Grafana monitoring pair.
latest./udp suffix in the output..env toggle to emit a bare key that reads its value from an env file at runtime.:ro appended.docker-compose.yml to your file system. Run docker compose up -d in the same directory.volume appear in the top-level volumes: section automatically, so Docker creates them before the service starts.networks: block with a bridge driver. Selecting host or none instead writes network_mode: and skips the block entirely.Omit version produces a file with no version: key, which newer Docker installs ignore.Service names are sanitised to [a-z0-9_-]+: spaces and special characters become hyphens. The sanitised name is what appears in depends_on lists, so a service cannot depend on itself even if two panels share a raw name. Healthchecks are written with a 30-second interval, 10-second timeout and 3 retries; changing those values means editing the downloaded file by hand. A volume with type volume and an empty source field is skipped from the output rather than emitting an invalid mapping. The named-volume deduplication runs across all services, so declaring the same volume name in two services adds exactly one entry to the top-level block.
Project Settings
Generates a healthcheck block with 30s interval, 10s timeout, 3 retries.
Port mappings
Environment variables
Volumes