liveBook · Manning

Docker Compose

As explained in Build Financial Software with Generative AI (From Scratch)

Docker Compose is a tool for defining and running multi-container Docker applications from a declarative configuration file.

Docker Compose defines and runs a Docker application from a docker-compose.yml file. Instead of starting each container separately, declare services, their images or build instructions, ports, environment values, volumes, and dependencies in one place. This is especially useful when a financial application needs an API, a database, a browser-based database tool, and a dashboard to work together while still remaining independently manageable. section 3.2 section 3.9

Start small. A generated configuration containing four or five services may look productive, but it is hard to verify and harder to diagnose. Bring up one visible service first, confirm it works, then add the next component. This short feedback loop supports an MVP mindset: add only the infrastructure the application currently needs, rather than complexity that might be useful later. section 3.2 section 3.2.2

A Compose file commonly coordinates these concerns:

  • Services define named containers, such as cloudbeaver, postgres, api, or dashboard. A service can use a ready-made image or build from a Dockerfile and build context. section 3.2 section 4.4.2
  • Ports expose a container service to the host, allowing a browser to reach CloudBeaver, an API, or a dashboard through localhost. section 3.2.1 section 6.8
  • Environment settings provide service configuration such as PostgreSQL credentials. Keep sensitive values out of application source rather than hardcoding them. section 3.2.2 section 3.9
  • Dependencies express startup relationships, such as a database tool or API needing PostgreSQL. They do not replace checking that a dependent service is actually ready to accept connections. section 3.2.2 section 3.9

Build up an API and database workspace

Begin with a CloudBeaver service mapped from host port 8080 to its container port so a browser can confirm the container is running. Add a PostgreSQL service with its database name, user, and password, then configure CloudBeaver to connect to it. An API service can be built from its own Dockerfile and exposed on port 8000. Run docker-compose build and docker-compose up to build and start the declared services; visit the mapped URLs to verify each increment. section 3.2.1 section 3.2.2 section 4.4.2

Read Compose startup logs when a service fails. A port-allocation message means another process already uses the host port; stop that process or select a different mapping. For connections between containers, localhost usually points to the current container, not the database container. Use the database container name in the connection string, then check application syntax, installed dependencies, and matching database credentials if the connection still fails. section 3.2.1 section 3.3.2

Listing 3.2 docker-compose.yml generated by ChatGPT
version: '3.7'   #1
 #2
services:
  nginx:
    image: nginx:latest
    container_name: nginx_container
    ports:
      - "80:80"
    volumes:
      - ./nginx:/etc/nginx/conf.d
    depends_on:
      - web

  web:
    build:
      context: .
      dockerfile: Dockerfile.fastapi    #2
    container_name: fastapi_container
    volumes:
      - ./app:/app
    expose:
      - "8000"
    depends_on:
      - db

  db:
    image: postgres:latest
    container_name: postgres_container
    environment:
      POSTGRES_USER: user             #3
      POSTGRES_PASSWORD: password      #3
      POSTGRES_DB: sample_db           #3
    volumes:
      - postgres_data:/var/lib/postgresql/data

  cloudbeaver:
    image: cloudbeaver:latest
    container_name: cloudbeaver_container
    ports:
      - "8080:8080"
    depends_on:
      - db

volumes:
  postgres_data:

Use this multi-service example as a reference for service names, port mappings, volumes, dependencies, and PostgreSQL environment settings; simplify it before adopting it. section 3.2 section 3.2.2

Compose also supports front-end deployment details. Build arguments can pass a browser-visible API URL into a dashboard build. Because browser code runs on the host browser, its URL may need localhost and an exposed host port rather than the internal service address used by containers. After changes, rebuild and restart with docker-compose down followed by docker-compose up --build. section 6.8

How Build Financial Software with Generative AI (From Scratch) covers it

How deep it goes
Walks through incremental service definitions, builds, ports, variables, dependencies, startup commands, and common connection failures.
Examples
Uses CloudBeaver and PostgreSQL containers, a FastAPI API, and a dashboard configured with a WireMock API URL.
What it assumes
Introduces containers and Compose configuration from a beginner-oriented setup while assuming an application component to containerize.
What you can do after
Operate/configure it to build, start, expose, connect, and troubleshoot a small multi-container application.
How it connects
Connects Docker Compose with Dockerfiles, PostgreSQL, FastAPI, CloudBeaver, environment variables, health checks, and microservices.

Also explained in

Compare how 15 books explain Docker Compose →

Related concepts

This explainer was generated by Manning's knowledge graph from the text of Build Financial Software with Generative AI (From Scratch). The section links point to the parts of the book it draws on.