How to generate a graph from compose.yaml
Instantly visualize your Docker Compose architecture. Use `compose-viz` to generate a clear graph of services, dependencies, and exposed ports from your `compose.yaml` file.
This article is over a year old. The information may be outdated.
This article is part of the Diagrams as code series:
- Docker - Diagrams as code
- Build a mind map using Docker and Markdown
- Rendering a JSON file as a mind map
- How to generate a graph from compose.yaml
- Drawdb-app - Render your database model as png, markdown, mermaid, ...
- Python - Generate flows using pydot
- Getting a more attractive mindmap with Markmap and Quarto
- Documentation as Code - Transform Your Infrastructure into Beautiful Diagrams with Python and Mermaid
Changelog
--format flag
This article shows how to visualize a compose.yaml file as a dependency graph using the compose-viz Docker image, producing an image (PNG, SVG, and other formats via --format) that shows services, their dependencies, and exposed ports at a glance — useful for understanding large multi-service Docker architectures. It also mentions docker compose config to resolve and merge multiple .yml files/variables before visualizing.
Imagine you have a very big compose.yaml file with a lot of services and dependencies.
You also have multiple exposed ports.
You'd like to have an at-a-glance view of services, dependencies and open ports. Is this possible? Yes! https://github.com/compose-viz/compose-viz does the magic for us.
Here's what compose-viz generates from a Joomla compose.yaml:
How to interpret the image?
We can see that the port 8080 is exposed to the computer. That port is, in fact, port 80 of the joomla container. And, too, we see that joomla has a dependency with the joomladb container. Easy no?
Reproduce it yourself
For the demo, please start a Linux shell and run mkdir -p /tmp/compose-viz && cd $_ to create a folder called compose-viz in your Linux temporary folder and jump in it.
Please create a new file called compose.yaml with this simplified content:
services: joomla: image: joomla ports: - 8080:80 depends_on: - joomladb
joomladb: image: postgres:16.0-alpineThis is a Docker Compose configuration that sets up two services: a Joomla web application and a PostgreSQL database it depends on. The Joomla service exposes port 8080 on your machine, which connects to port 80 inside the container, while the database runs quietly in the background.
Let the magic happen and run docker run --rm -it -u $(id -u):$(id -g) -v $(pwd):/in wst24365888/compose-viz compose.yaml — you'll get the image shown above.
See the --format flag
By adding --format svg, you'll get an SVG instead of a PNG. The list of supported output formats is huge: png|dot|jpeg|json|svg|bmp|canon|cmap|cmapx|cmapx_np|dot_json|emf|emfplus|eps|fig|gif|gv|imap|imap_np|ismap|jpe|jpg|json0|metafile|mp|pdf|pic|plain|plain-ext|pov|ps|ps2|tif|tiff|tk|vml|xdot|xdot1.2|xdot1.4|xdot_json.
A more complex example
Replace the content of the compose.yaml with this one:
services:
redis: image: redis:alpine ports: - "6379" networks: - frontend deploy: replicas: 2 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure
db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data networks: - backend deploy: placement: constraints: [ node.role == manager ] vote: image: dockersamples/examplevotingapp_vote:before ports: - 5000:80 networks: - frontend depends_on: - redis deploy: replicas: 2 update_config: parallelism: 2 restart_policy: condition: on-failure result: image: dockersamples/examplevotingapp_result:before ports: - 5001:80 networks: - backend depends_on: - db deploy: replicas: 1 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure
worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 1 labels: [ APP=VOTING ] restart_policy: condition: on-failure delay: 10s max_attempts: 3 window: 120s placement: constraints: [ node.role == manager ]
visualizer: image: dockersamples/visualizer ports: - "8080:8080" stop_grace_period: 1m30s volumes: - /var/run/docker.sock:/var/run/docker.sock deploy: placement: constraints: [ node.role == manager ]
networks: frontend: backend:
volumes: db-data:This is a Docker Compose configuration for a voting application with multiple services. It defines five application services (redis, postgres database, vote frontend, result display, and worker), plus a visualizer, along with the networks and storage volumes they need to communicate and persist data.
And the image here below will be generated by the tool:

Here, we can see:
- We've four exposed ports:
5001,5000,6379and8080. - Port
8080is linked to avisualizerweb service; that service is using a volume pointing to/var/run/docker.sock - Ports
5000and5001are referring to services calledvoteandresult. Since the internal port is port80, we know that these ports are web interfaces. - The
voteservice (port5000) is using aredisservice; accessible using port6379. - The
resultservice (port5001) is linked to a Postgres service calleddband having persistent data (since we have a Docker volume calleddb-data). - And so on.
Such a visualization tool greatly simplifies the understanding of a Docker architecture.
compose-viz gives you one fixed rendering. If you want to control exactly what the diagram shows, Documentation as Code - Transform Your Infrastructure into Beautiful Diagrams with Python and Mermaid parses the same compose.yaml with a Python script you own, and Docker - Diagrams as code lists a dozen other diagram-as-code tools.
Docker config
If like me you're using a lot of .yml files by running Docker and/or using environment variables in it; just run docker compose config to ask Docker to render (on the screen only) what it calls Parse, resolve and render compose file in canonical format i.e. it will merge all your .yml in one string and resolve variables.
Copy/paste the screen output in a temporary file and use this tool on that file.
This article is part of the Diagrams as code series:
- Docker - Diagrams as code
- Build a mind map using Docker and Markdown
- Rendering a JSON file as a mind map
- How to generate a graph from compose.yaml
- Drawdb-app - Render your database model as png, markdown, mermaid, ...
- Python - Generate flows using pydot
- Getting a more attractive mindmap with Markmap and Quarto
- Documentation as Code - Transform Your Infrastructure into Beautiful Diagrams with Python and Mermaid





