Docker Compose Generator
Create a valid docker-compose.yml from a form: services, images, ports, environment, volumes, depends_on and restart policies, with PostgreSQL, MySQL and Redis presets.
Follows the current Compose Specification (no "version:" key). Named volumes are declared automatically. Replace example passwords before use.
Related Tools
View AllWhat is Docker Compose Generator?
Build a docker-compose.yml for multi-container setups without fighting YAML indentation. Add services from presets (PostgreSQL, MySQL, Redis, MongoDB, Nginx, your own app) or start empty, then fill in image or build context, ports, environment variables, volumes, dependencies, restart policy and command. The YAML updates as you type and errors are explained.
How to use Docker Compose Generator
- Edit the example services or use Add a service to insert a preset.
- For each service set the Image (or Build context), Ports, Environment, Volumes, Depends on and Restart policy.
- Fix any problems listed in red (invalid names, ports, variables or dependencies).
- Download docker-compose.yml and run
docker compose up -d.
Example
Service app (build ., port 3000, NODE_ENV=production, depends on db) + PostgreSQL preset
services:
app:
build: .
restart: unless-stopped
ports:
- "3000:3000"
environment:
NODE_ENV: production
depends_on:
- db
db:
image: postgres:16-alpine
restart: unless-stopped
ports:
- "5432:5432"
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: change-me
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata: {} When to use Docker Compose Generator
Use it to set up local development stacks, demos and simple single-host deployments. For production you will usually add health checks, resource limits, secrets and networks by hand, or use an orchestrator such as Kubernetes. Replace the example passwords in presets before using them anywhere.
How Docker Compose Generator works
The form is converted into an object following the current Compose Specification (no obsolete version: key) and serialized to YAML with js-yaml. Port mappings are quoted, because unquoted values like 22:22 can be read as base-60 numbers by YAML 1.1 parsers. Environment lines KEY=value become a mapping, and any volume whose source is a name rather than a path (e.g. pgdata:/var/lib/postgresql/data) is declared automatically under the top-level volumes: key. Service names, port formats, KEY=value syntax and depends_on targets are validated.
Common Use Cases
- Running an app with PostgreSQL and Redis locally
- Sharing a reproducible dev environment with a team
- Creating a compose file for a self-hosted tool
- Learning Compose syntax by example
Security Note
Publishing database ports (e.g. 5432:5432) exposes them on all host interfaces. Remove the port mapping or bind to 127.0.0.1 on servers, and use strong passwords or secrets.
FAQs
Why is there no version: line?
The version key is obsolete in the Compose Specification used by Docker Compose v2; current versions ignore it and print a warning.
Does depends_on wait until the database is ready?
No, it only controls start order. Add a healthcheck and condition: service_healthy, or retry connections in your app.
What is the difference between a named volume and a bind mount?
A named volume (pgdata:/path) is managed by Docker and survives container re-creation; a bind mount (./data:/path) maps a folder from your machine.