Bird
Raised Fist0
Dockerdevops~3 mins

Why docker-compose.yml structure? - Purpose & Use Cases

Choose your learning style10 modes available
The Big Idea

What if you could start your entire app with a single simple file instead of many confusing commands?

The Scenario

Imagine you have to start multiple apps and services on your computer, like a web server, a database, and a cache. You open many terminal windows and type long commands for each service, one by one.

The Problem

This manual way is slow and confusing. You might forget the exact command or options, mix up ports, or start services in the wrong order. It's easy to make mistakes and hard to fix them quickly.

The Solution

With a docker-compose.yml file, you write down all your services and their settings in one simple file. Then, with one command, Docker starts everything correctly and together. It saves time and avoids errors.

Before vs After
✗ Before
docker run -d -p 80:80 nginx
docker run -d -p 5432:5432 postgres
✓ After
version: '3'
services:
  web:
    image: nginx
    ports:
      - '80:80'
  db:
    image: postgres
    ports:
      - '5432:5432'
What It Enables

You can manage complex app setups easily and share them with others, making teamwork and deployment smooth.

Real Life Example

A developer shares a docker-compose.yml file so teammates can start the whole app stack with one command, avoiding setup headaches.

Key Takeaways

Manual commands for multiple services are slow and error-prone.

docker-compose.yml organizes all services in one place.

One command starts everything correctly and quickly.

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