Bird
Raised Fist0
Dockerdevops~5 mins

docker-compose.yml structure - Commands & Configuration

Choose your learning style10 modes available
Introduction
Docker Compose helps you run multiple containers together easily. It uses a file called docker-compose.yml to define how containers work together, like setting their names, ports, and shared networks.
When you want to start a web app and a database together on your computer.
When you need to test how different services talk to each other locally.
When you want to share your app setup with teammates so they can run it exactly the same way.
When you want to stop and start all parts of your app with one command.
When you want to keep your container settings in one easy-to-read file.
Config File - docker-compose.yml
docker-compose.yml
version: '3.8'
services:
  web:
    image: nginx:1.23
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
  db:
    image: postgres:15
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: exampledb
    ports:
      - "5432:5432"

version: Defines the Compose file format version.

services: Lists the containers to run.

web: A service using the nginx image, exposing port 80 inside the container to port 8080 on the host, and sharing local html files.

db: A PostgreSQL database service with environment variables for user, password, and database name, exposing its default port.

Commands
Starts all services defined in docker-compose.yml in the background so your app and database run together.
Terminal
docker-compose up -d
Expected OutputExpected
Creating network "default" with the default driver Creating volume "default" with default driver Creating example_db_1 ... done Creating example_web_1 ... done
→
-d - Run containers in detached mode (in the background)
Shows the status of all running services defined in your docker-compose.yml file.
Terminal
docker-compose ps
Expected OutputExpected
Name Command State Ports ---------------------------------------------------------------------------- example_db_1 docker-entrypoint.sh postgres Up 0.0.0.0:5432->5432/tcp example_web_1 nginx -g 'daemon off;' Up 0.0.0.0:8080->80/tcp
Stops and removes all containers, networks, and volumes created by docker-compose up.
Terminal
docker-compose down
Expected OutputExpected
Stopping example_web_1 ... done Stopping example_db_1 ... done Removing example_web_1 ... done Removing example_db_1 ... done Removing network default
Key Concept

If you remember nothing else from this pattern, remember: docker-compose.yml defines multiple containers and how they work together in one simple file.

Common Mistakes
Using tabs instead of spaces in the docker-compose.yml file
YAML files require spaces for indentation; tabs cause parsing errors.
Always use spaces (usually 2) for indentation in docker-compose.yml.
Not exposing container ports to the host in the ports section
Without port mapping, you cannot access the service from your computer.
Map container ports to host ports using the format 'hostPort:containerPort' under ports.
Running docker-compose up without the -d flag and closing the terminal
The containers stop when the terminal closes if not run in detached mode.
Use 'docker-compose up -d' to keep containers running in the background.
Summary
docker-compose.yml defines multiple containers and their settings in one file.
Use 'docker-compose up -d' to start all services in the background.
Use 'docker-compose ps' to check running containers and 'docker-compose down' to stop and clean up.

Practice

(1/5)
1. What is the main purpose of the services section in a docker-compose.yml file?
easy
A. To define the containers that will run and their settings
B. To specify the Docker version to use
C. To list the volumes to be created
D. To set environment variables globally

Solution

  1. Step 1: Understand the role of services

    The services section lists all containers to run and their configurations.
  2. Step 2: Compare with other sections

    version sets compose file version, volumes defines shared storage, environment variables are per service or global but not the main purpose of services.
  3. Final Answer:

    To define the containers that will run and their settings -> Option A
  4. Quick Check:

    services = container definitions [OK]
Hint: Services section lists containers and their configs [OK]
Common Mistakes:
  • Confusing version with services
  • Thinking volumes are defined inside services only
  • Assuming environment variables are global by default
2. Which of the following is the correct way to specify a port mapping in docker-compose.yml under a service named web?
easy
A. port: - "80:80"
B. ports: - "80:80"
C. ports: - 80:80
D. mapping: - "80:80"

Solution

  1. Step 1: Check correct key for port mapping

    The correct key is ports (plural), not port or mapping.
  2. Step 2: Validate syntax for port mapping

    Port mappings must be strings with quotes like "80:80" to avoid YAML parsing issues.
  3. Final Answer:

    ports: - "80:80" -> Option B
  4. Quick Check:

    Use ports with quoted strings [OK]
Hint: Use 'ports' key with quoted strings for mappings [OK]
Common Mistakes:
  • Using singular 'port' instead of 'ports'
  • Not quoting port mappings causing YAML errors
  • Using wrong key like 'mapping'
3. Given this docker-compose.yml snippet:
version: '3'
services:
  app:
    image: myapp:latest
    environment:
      - DEBUG=true
    ports:
      - "5000:5000"
What will happen when you run docker-compose up?
medium
A. The container runs but port 5000 is not exposed
B. An error occurs because environment variables must be in key:value format
C. The image 'myapp:latest' is ignored and default image is used
D. A container named 'app' runs with DEBUG=true and port 5000 exposed

Solution

  1. Step 1: Analyze environment variable format

    Environment variables can be listed as strings like "DEBUG=true" in docker-compose.yml.
  2. Step 2: Check port mapping and image usage

    Port 5000 is correctly mapped and image 'myapp:latest' will be used to run the container.
  3. Final Answer:

    A container named 'app' runs with DEBUG=true and port 5000 exposed -> Option D
  4. Quick Check:

    Env vars as strings and ports mapped = container runs correctly [OK]
Hint: Env vars as strings and ports quoted work fine [OK]
Common Mistakes:
  • Thinking environment variables must be key:value pairs
  • Assuming ports need special syntax to expose
  • Believing image name is ignored if not official
4. Identify the error in this docker-compose.yml snippet:
version: '3'
services:
  db:
    image: postgres
    ports:
      - 5432:5432
    environment:
      POSTGRES_PASSWORD: example
medium
A. Port mapping should be quoted strings like "5432:5432"
B. Environment variables must be listed as a sequence, not mapping
C. The version '3' is invalid and should be '3.8'
D. The image name 'postgres' must include a tag

Solution

  1. Step 1: Check port mapping syntax

    Port mappings should be quoted strings like "5432:5432" to avoid YAML parsing errors.
  2. Step 2: Validate environment variable format

    Environment variables can be mappings like POSTGRES_PASSWORD: example, which is correct here.
  3. Final Answer:

    Port mapping should be quoted strings like "5432:5432" -> Option A
  4. Quick Check:

    Port mappings need quotes to parse correctly [OK]
Hint: Always quote port mappings to avoid YAML errors [OK]
Common Mistakes:
  • Not quoting port mappings
  • Confusing environment variable formats
  • Thinking version '3' is invalid
5. You want to run two services, web and db, where web depends on db. Which docker-compose.yml snippet correctly expresses this dependency and shares a volume named data between them?
hard
A. version: '3' services: web: image: webapp depends_on: - db db: image: postgres volumes: data: external: true
B. version: '3' services: web: image: webapp volumes: - data:/var/www/data db: image: postgres depends_on: - web volumes: - data:/var/lib/postgresql/data volumes: data:
C. version: '3' services: web: image: webapp depends_on: - db volumes: - data:/var/www/data db: image: postgres volumes: - data:/var/lib/postgresql/data volumes: data:
D. version: '3' services: web: image: webapp depends_on: - db volumes: - /data:/var/www/data db: image: postgres volumes: - /data:/var/lib/postgresql/data

Solution

  1. Step 1: Check dependency declaration

    web depends on db using depends_on with - db under web.
  2. Step 2: Verify volume sharing and declaration

    Both services use the named volume data mapped to their paths, and volumes: section declares data properly.
  3. Final Answer:

    version: '3' services: web: image: webapp depends_on: - db volumes: - data:/var/www/data db: image: postgres volumes: - data:/var/lib/postgresql/data volumes: data: -> Option C
  4. Quick Check:

    depends_on + named volume declared under volumes = correct [OK]
Hint: Use depends_on and declare shared volumes under volumes [OK]
Common Mistakes:
  • Reversing depends_on order
  • Using host paths instead of named volumes
  • Not declaring volumes section for named volumes
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard