📖 Scenario: You are setting up a simple web application using Docker Compose. You want to keep your application data safe and persistent even if the container stops or is removed. To do this, you will use Docker volumes.
🎯 Goal: Create a Docker Compose file that defines a service with a volume. This volume will store data outside the container so it is not lost when the container is recreated.
📋 What You'll Learn
Create a Docker Compose file named docker-compose.yml
Define a service called webapp using the nginx:latest image
Create a volume named webdata in the Compose file
Mount the volume webdata to the container path /usr/share/nginx/html
Print the content of the Compose file to verify the setup
💡 Why This Matters
🌍 Real World
Docker volumes help keep important data safe even if containers are stopped or deleted. This is useful for databases, web servers, and any app that needs to save files.
💼 Career
Understanding volumes in Docker Compose is essential for DevOps roles to manage persistent data and ensure reliable deployments.
Progress0 / 4 steps
1
Create the basic Docker Compose file
Create a file named docker-compose.yml with a version set to '3.8' and define a service called webapp using the image nginx:latest.
Docker
Hint
Start by specifying the Compose file version and add a service named webapp with the nginx:latest image.
2
Add a volume named webdata
Add a top-level volumes section to the Compose file and define a volume called webdata.
Docker
Hint
Define volumes at the bottom of the file with the name webdata.
3
Mount the volume webdata to the container path
Under the webapp service, add a volumes key that mounts the volume webdata to the container path /usr/share/nginx/html.
Docker
Hint
Use the volumes key inside the webapp service to mount the volume.
4
Print the Docker Compose file content
Write a command to display the content of docker-compose.yml to verify your volume setup.
Docker
Hint
Use cat docker-compose.yml to print the file content.
Practice
(1/5)
1. What is the main purpose of using volumes in a Docker Compose file?
easy
A. To limit container CPU usage
B. To speed up container startup time
C. To automatically update container images
D. To keep data safe outside containers so it persists
Solution
Step 1: Understand volume role in Docker
Volumes store data outside the container's writable layer, so data is not lost when containers stop or are removed.
Step 2: Compare options
Options B, C, and D relate to performance or resource limits, not data persistence.
Final Answer:
To keep data safe outside containers so it persists -> Option D
Quick Check:
Volumes = Data persistence [OK]
Hint: Volumes = persistent data storage outside containers [OK]
Common Mistakes:
Thinking volumes speed up container startup
Confusing volumes with resource limits
Assuming volumes update images automatically
2. Which of the following is the correct syntax to define a named volume in a Docker Compose file?
easy
A. services:
volumes:
- mydata:/app/data
B. volumes:
- mydata:/app/data
C. volumes:
mydata:
driver: local
D. volumes:
mydata: /app/data
Solution
Step 1: Identify volume declaration section
Named volumes are declared under the top-level 'volumes:' key with a name and optional driver.
Step 2: Check syntax correctness
volumes:
mydata:
driver: local correctly defines a named volume 'mydata' with driver 'local'. Options A, B, and D mix service and volume syntax incorrectly or have invalid mapping syntax.
Final Answer:
volumes:
mydata:
driver: local -> Option C
Quick Check:
Named volume syntax = volumes:
mydata:
driver: local [OK]
Hint: Define named volumes under top-level 'volumes:' with name and driver [OK]
Common Mistakes:
Defining volumes under services instead of top-level
A. You cannot use relative paths under 'volumes:' top-level key
B. The image name 'myapp' is invalid
C. Bind mounts must be declared under 'volumes:' top-level key
D. The service name 'app' is reserved
Solution
Step 1: Understand volume declaration rules
Top-level 'volumes:' is for named volumes only, not for bind mounts with paths.
Step 2: Identify misuse of relative path
Using './data:' under 'volumes:' top-level is invalid syntax; relative paths belong only in service volume mounts.
Final Answer:
You cannot use relative paths under 'volumes:' top-level key -> Option A
Quick Check:
Relative paths only in service volumes [OK]
Hint: Declare bind mounts only under service volumes, not top-level [OK]
Common Mistakes:
Putting bind mount paths under top-level volumes
Assuming image name causes this error
Thinking service names are restricted
5. You want to share a local folder ./config with a container's /etc/config path and also keep a database's data persistent using a named volume dbdata. Which is the correct Docker Compose snippet?
Step 1: Identify bind mount for local folder sharing
Bind mounts use local paths like './config:/etc/config' under service volumes.
Step 2: Identify named volume for database persistence
Named volumes like 'dbdata' are declared top-level and mounted as 'dbdata:/var/lib/postgresql/data'.
Step 3: Check options for correct syntax
services:
app:
image: myapp
volumes:
- ./config:/etc/config
db:
image: postgres
volumes:
- dbdata:/var/lib/postgresql/data
volumes:
dbdata: correctly uses bind mount for app and named volume for db. Options B and C swap paths incorrectly. services:
app:
image: myapp
volumes:
- ./config:/etc/config
db:
image: postgres
volumes:
- ./dbdata:/var/lib/postgresql/data
volumes:
dbdata: uses a bind mount for dbdata instead of named volume.