What docker-compose.yml is, in one paragraph
A service is one container, and a `docker-compose.yml` file is a list of services that should run together (your app, a database, maybe a cache and a reverse proxy). One command, `docker compose up`, starts the whole stack and another, `docker compose down`, takes it back to zero. It is the standard way to run multi-container apps on a single machine: dev laptops, single-node prod servers, CI runners.
This builder writes that file for you. Pick a preset (WordPress + MySQL, Node + Postgres + Redis, Nginx + PHP-FPM + MariaDB, a single Redis, a single ClickHouse), edit services in plain forms, and the right pane shows the exact YAML ready to paste into `docker-compose.yml`. Every option has a plain-language hint.
Everything runs in your browser. Nothing is uploaded, no account needed, no container actually started here - the output is the same text you would write by hand.
How to use it
- Pick a preset at the top (WordPress + MySQL, Node + Postgres + Redis, Nginx + PHP-FPM + MariaDB, Single Redis, ClickHouse single-node). The form fills in sensible defaults you can tweak.
- Set a project name at the top. This becomes the `name:` field in the file and the prefix for container names (no more random names like `myapp_web_1`).
- For each service set: image (e.g. `nginx:alpine`), ports (host:container, repeatable), volumes (with a read-only toggle), and environment variables.
- Choose a restart policy: `no`, `always`, `on-failure`, or `unless-stopped`. For production servers, `unless-stopped` is the usual pick.
- Use depends_on to say "start the database before the app". Add a healthcheck on the database so other services can wait for ready, not just started.
- Define networks at the top level and assign each service to one or more. Services on the same network reach each other by name (e.g. `db:5432`).
- Click Copy in the preview pane, or Download to save as `docker-compose.yml`, then run `docker compose up -d` in the same folder. That is the whole flow.
When this is useful
Seven concrete situations where docker-compose makes life much easier:
- A dev laptop that needs Postgres, Redis and your Node app. One file, one `docker compose up`, and your whole stack is online. No Homebrew, no apt-get, no version drift across the team.
- A small VPS hosting one or two apps. Compose is the simplest path: write the file, `docker compose up -d`, set up nginx in front, done. Kubernetes is overkill for one box.
- Local mirror of production. If prod runs Postgres 16, Redis 7 and Node 20, the same compose file pins those versions on every dev machine. "Works on my laptop" becomes "works on every laptop".
- CI pipelines that need real services. Compose spins up a real Postgres for integration tests in seconds, then tears it down. Much closer to prod than mocks or sqlite.
- Self-hosting third-party apps: WordPress, Ghost, Mastodon, NextCloud, Plausible, Gitea, n8n. The official compose file is usually the documented install path.
- Bringing a stack online for a demo. You ship one repo with one file and the reviewer types one command. No "first install Postgres 14 with these extensions".
- Trying out a new database. Want to play with ClickHouse, MongoDB or DuckDB without installing anything globally? `docker compose up` for five minutes, then `docker compose down -v` and the machine is clean again.