Bird
Raised Fist0
Spring Bootframework~5 mins

docker-compose for services in Spring Boot

Choose your learning style10 modes available
Introduction

Docker Compose helps you run multiple services together easily. It lets you start all parts of your app with one command.

When your Spring Boot app needs a database like MySQL or PostgreSQL running alongside.
When you want to run your app and a cache service like Redis together for testing.
When you have multiple microservices that need to talk to each other locally.
When you want to share your full app setup with teammates or deploy it consistently.
When you want to avoid installing all dependencies manually on your machine.
Syntax
Spring Boot
version: '3.8'
services:
  service_name:
    image: image_name:tag
    ports:
      - "host_port:container_port"
    environment:
      - KEY=value
    depends_on:
      - other_service
    volumes:
      - host_path:container_path

The version defines the Docker Compose file format version.

Each service is a container with its settings like ports and environment variables.

Examples
Simple service running a Spring Boot app exposing port 8080.
Spring Boot
version: '3.8'
services:
  app:
    image: springboot-app:latest
    ports:
      - "8080:8080"
Two services: Spring Boot app built locally and a Postgres database with user and password.
Spring Boot
version: '3.8'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=dev
  db:
    image: postgres:15
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
    ports:
      - "5432:5432"
App service waits for the database service before starting.
Spring Boot
version: '3.8'
services:
  app:
    image: springboot-app:latest
    depends_on:
      - db
    ports:
      - "8080:8080"
  db:
    image: mysql:8
    environment:
      - MYSQL_ROOT_PASSWORD=rootpass
    ports:
      - "3306:3306"
Sample Program

This Docker Compose file runs a Spring Boot app and a MySQL database together. The app connects to the database using environment variables. The depends_on ensures the database starts before the app.

Spring Boot
version: '3.8'
services:
  springboot-app:
    image: springboot-app:latest
    ports:
      - "8080:8080"
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql-db:3306/mydb
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=rootpass
    depends_on:
      - mysql-db
  mysql-db:
    image: mysql:8
    environment:
      - MYSQL_ROOT_PASSWORD=rootpass
      - MYSQL_DATABASE=mydb
    ports:
      - "3306:3306"
OutputSuccess
Important Notes

Use depends_on to control startup order but it does not wait for the service to be fully ready.

Map ports carefully to avoid conflicts on your machine.

Use environment variables to pass config like database URLs and passwords securely.

Summary

Docker Compose lets you run multiple services together with one file.

It is great for running Spring Boot apps with databases or other services locally.

Use services, ports, environment, and depends_on to configure your setup.

Practice

(1/5)
1. What is the main purpose of using docker-compose with Spring Boot services?
easy
A. To run multiple related services together with one configuration file
B. To compile Java code faster
C. To replace the Spring Boot framework
D. To write unit tests automatically

Solution

  1. Step 1: Understand what docker-compose does

    Docker Compose is a tool to run multiple containers (services) together using one YAML file.
  2. Step 2: Relate to Spring Boot services

    It helps run your Spring Boot app alongside databases or other services easily.
  3. Final Answer:

    To run multiple related services together with one configuration file -> Option A
  4. Quick Check:

    docker-compose = run multiple services [OK]
Hint: Remember: docker-compose manages multiple containers easily [OK]
Common Mistakes:
  • Thinking docker-compose compiles code
  • Confusing docker-compose with testing tools
  • Believing it replaces Spring Boot
2. Which of the following is the correct way to specify a service's port mapping in a docker-compose.yml file?
easy
A. ports: - "8080:8080"
B. ports: 8080:8080
C. port: 8080->8080
D. expose: 8080:8080

Solution

  1. Step 1: Recall docker-compose port syntax

    Ports are listed as a YAML array with dash and quotes, like ports: - "hostPort:containerPort".
  2. Step 2: Check options

    ports: - "8080:8080" matches the correct YAML syntax for port mapping.
  3. Final Answer:

    ports: - "8080:8080" -> Option A
  4. Quick Check:

    Port mapping uses dash and quotes in YAML [OK]
Hint: Use dash and quotes for ports in docker-compose YAML [OK]
Common Mistakes:
  • Omitting dash for list items
  • Using wrong key 'port' instead of 'ports'
  • Confusing 'expose' with 'ports'
3. Given this docker-compose.yml snippet:
services:
  app:
    image: springboot-app
    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

What happens when you run docker-compose up?
medium
A. docker-compose throws a syntax error
B. Only app service starts, db is ignored
C. db starts but app fails due to missing environment
D. Both app and db services start, app waits for db to start

Solution

  1. Step 1: Understand depends_on behavior

    The app service depends on db, so docker-compose starts db first, then app.
  2. Step 2: Check environment and ports

    db has required environment variable, app exposes port 8080 correctly.
  3. Final Answer:

    Both app and db services start, app waits for db to start -> Option D
  4. Quick Check:

    depends_on starts dependencies first [OK]
Hint: depends_on starts services in order, no syntax errors here [OK]
Common Mistakes:
  • Assuming depends_on waits for full readiness
  • Thinking db is ignored without explicit start
  • Confusing environment variables with ports
4. You wrote this docker-compose.yml but your Spring Boot app fails to connect to the database:
services:
  app:
    image: springboot-app
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://localhost:5432/mydb
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

What is the likely problem?
medium
A. POSTGRES_PASSWORD is incorrect environment variable
B. Missing port mapping for db service
C. The app tries to connect to localhost instead of the db service hostname
D. The app image name is wrong

Solution

  1. Step 1: Check datasource URL in app environment

    The app uses jdbc URL with 'localhost', which inside container means itself, not db service.
  2. Step 2: Understand docker-compose networking

    Services communicate by service name, so URL should use 'db' hostname, not 'localhost'.
  3. Final Answer:

    The app tries to connect to localhost instead of the db service hostname -> Option C
  4. Quick Check:

    Use service name, not localhost, for inter-service DB URL [OK]
Hint: Use service names, not localhost, inside docker-compose networks [OK]
Common Mistakes:
  • Assuming localhost works inside containers
  • Forgetting to map ports for external access
  • Misnaming environment variables
5. You want to run a Spring Boot app with a MySQL database using docker-compose. You want the database to keep data even if the container stops. Which snippet correctly adds persistent storage for the database?
hard
A. volumes: - /var/lib/mysql:/db-data volumes: db-data:
B. volumes: - db-data:/var/lib/mysql volumes: db-data:
C. volumes: - db-data:/mysql/data volumes: mysql-data:
D. volumes: - /mysql/data:/db-data volumes: db-data:

Solution

  1. Step 1: Understand volume syntax for persistence

    Docker volumes map a named volume to the container path where data is stored, e.g., db-data:/var/lib/mysql.
  2. Step 2: Check volume declaration

    The named volume must be declared under top-level volumes: with the same name.
  3. Final Answer:

    volumes: - db-data:/var/lib/mysql volumes: db-data: -> Option B
  4. Quick Check:

    Named volume mapped to container path with declaration [OK]
Hint: Map named volume to container data path and declare it below [OK]
Common Mistakes:
  • Reversing host and container paths
  • Not declaring the named volume
  • Using wrong container data directory
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