📖 Scenario: You are working as a DevOps engineer for a small web application team. The team wants to deploy their app using Docker containers. You need to create a simple Docker setup that follows good production patterns to ensure the app runs reliably and can be maintained easily.
🎯 Goal: Build a Docker setup with a Dockerfile and a docker-compose.yml file that uses production patterns such as specifying a base image, setting environment variables, and defining service ports. This will help the team understand why production patterns matter for stability and scalability.
📋 What You'll Learn
Create a Dockerfile with a specific base image and environment variable
Create a docker-compose.yml file defining a service with ports and environment
Use production patterns like explicit ports and environment variables
Print the final Docker Compose configuration to verify
💡 Why This Matters
🌍 Real World
Using Docker with production patterns helps teams deploy apps that are reliable, easy to maintain, and scalable.
💼 Career
DevOps engineers often create Docker setups that follow best practices to ensure smooth production deployments.
Progress0 / 4 steps
1
Create a Dockerfile with base image
Create a file named Dockerfile with the line FROM python:3.12-slim to specify the base image.
Docker
Hint
The FROM line tells Docker which base image to use. Use the official Python 3.12 slim image.
2
Add environment variable in Dockerfile
Add a line to the Dockerfile to set an environment variable ENV APP_ENV=production below the FROM line.
Docker
Hint
Use the ENV instruction to set environment variables inside the container.
3
Create docker-compose.yml with service and ports
Create a docker-compose.yml file with a service named web that uses the current directory as build context, exposes port 8000 mapped to container port 80, and sets environment variable APP_ENV=production.
Docker
Hint
Use build: . to build from current directory. Map port 8000 on host to 80 in container. Set environment variable under environment.
4
Print the docker-compose.yml content
Write a command to print the contents of docker-compose.yml to verify the setup.
Docker
Hint
Use Python's open and print to display the file content.
Practice
(1/5)
1. Why is it important to use production patterns like health checks and restart policies in Docker containers?
easy
A. They prevent the container from using any network resources.
B. They make the container images larger and slower to start.
C. They help keep the app running smoothly and recover from failures automatically.
D. They disable logging to improve performance.
Solution
Step 1: Understand the purpose of production patterns
Production patterns like health checks and restart policies are designed to keep apps running reliably by detecting problems and restarting containers if needed.
Step 2: Analyze the effects of these patterns
These patterns do not slow down containers or disable networking/logging; instead, they improve stability and uptime.
Final Answer:
They help keep the app running smoothly and recover from failures automatically. -> Option C
Quick Check:
Production patterns = Reliable app running [OK]
Hint: Production patterns improve reliability and auto-recovery [OK]
Common Mistakes:
Thinking production patterns slow down containers
Believing they disable networking or logging
Ignoring the role of health checks
2. Which of the following Docker Compose service definitions correctly adds a restart policy for production use?
easy
A. restart: on-failure 5
B. restart: never
C. restart: sometimes
D. restart: always
Solution
Step 1: Review Docker restart policies
Valid restart policies include 'no', 'always', 'on-failure', and 'unless-stopped'. 'always' restarts the container whenever it stops.
Step 2: Identify correct syntax
'restart: always' is valid and commonly used in production. 'restart: never' is invalid, 'sometimes' is not a valid policy, and 'on-failure 5' is incorrect syntax (should be 'on-failure:5' for max retries).
Final Answer:
restart: always -> Option D
Quick Check:
Valid restart policy = restart: always [OK]
Hint: Use 'restart: always' for reliable container restarts [OK]
Common Mistakes:
Using invalid restart policies like 'sometimes'
Incorrect syntax for max retry counts
Confusing 'never' with 'no'
3. Given this Dockerfile snippet for a production app:
What happens if the health check fails repeatedly?
medium
A. Docker marks the container as unhealthy but does not restart it automatically.
B. Docker automatically restarts the container immediately.
C. The container stops running and exits.
D. Docker ignores the health check failures.
Solution
Step 1: Understand Docker health checks
Health checks monitor container health and mark status as healthy or unhealthy based on the command result.
Step 2: Analyze restart behavior
Docker does not restart containers automatically on health check failure unless combined with a restart policy. Health check failure only changes status.
Final Answer:
Docker marks the container as unhealthy but does not restart it automatically. -> Option A
Quick Check:
Health check failure = unhealthy status only [OK]
Hint: Health checks mark status; restart needs policy [OK]
Common Mistakes:
Assuming health check failure triggers restart automatically
Thinking container stops on health check failure
Ignoring the need for restart policies
4. You have a Docker Compose file with this service:
The container keeps restarting even though the app is healthy. What is the likely cause?
medium
A. The restart policy triggers on container exit, not health check failure.
B. The health check command syntax is invalid and causes failure.
C. The interval is too long, so health checks are ignored.
D. Docker Compose does not support health checks.
Solution
Step 1: Understand restart policy behavior
'restart: on-failure' restarts containers only if they exit with an error, not based on health check status.
Step 2: Analyze health check impact
Health check failures mark container unhealthy but do not cause restarts. If container restarts, it likely exited unexpectedly.
Final Answer:
The restart policy triggers on container exit, not health check failure. -> Option A
Quick Check:
Restart on-failure = restart on exit only [OK]
Hint: Restart on-failure restarts only on exit, not health check [OK]
Common Mistakes:
Confusing health check failure with container exit
Assuming Docker Compose ignores health checks
Misreading health check syntax
5. You want to deploy a multi-container Docker app in production with these goals: - Automatically restart containers on failure - Monitor container health and alert if unhealthy - Ensure containers start in correct order
Which combination of Docker Compose features best achieves this?
hard
A. Use restart: no, no healthcheck, and depends_on without conditions
B. Use restart: always, healthcheck with retries, and depends_on with condition: service_healthy
C. Use restart: on-failure, healthcheck without retries, and no depends_on
D. Use restart: unless-stopped, healthcheck with interval 1h, and depends_on with condition: service_started
Solution
Step 1: Choose restart policy for automatic recovery
'restart: always' ensures containers restart on any stop, improving reliability.
Step 2: Configure health checks with retries
Health checks with retries detect unhealthy containers and allow alerting or action.
Step 3: Use depends_on with service_healthy condition
This ensures containers start only after dependencies are healthy, maintaining correct order.
Final Answer:
Use restart: always, healthcheck with retries, and depends_on with condition: service_healthy -> Option B
Quick Check:
Restart + healthcheck + depends_on healthy = production pattern [OK]
Hint: Combine restart, healthcheck, and depends_on with health condition [OK]
Common Mistakes:
Skipping health checks or retries
Using depends_on without health condition
Choosing restart policies that don't restart on all failures
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.