Dockerize a Python Flask Web Application
Author a Flask Dockerfile from scratch with layer caching, .dockerignore, and split dev/prod variants using gunicorn for clean SIGTERM handling.

Lab overview
Python remains one of the most widely deployed languages for web APIs, and Flask is its most approachable framework for building small services. But moving a Flask app from python app.py on a laptop to a portable, reproducible container is where most developers hit friction: pip layers rebuild on every code change, the dev server hangs on shutdown, __pycache__/ directories leak into bind mounts, and flask run ends up in production because nobody explained why gunicorn matters. A well-authored Dockerfile fixes all of this with a handful of well-ordered instructions.
This lab walks through the same Dockerfile workflow real Python teams use in production. You will start with a pre-built Flask API in your workspace, write a naive Dockerfile that works but rebuilds slowly, then refactor it to leverage layer caching, add a .dockerignore, split the image into a dev variant with hot reload and a production variant that uses gunicorn as the WSGI server with a non-root user. By the end you will understand exactly why each line of a Python Dockerfile is shaped the way it is, and what changes between development and production.
Objectives
Upon completion of this beginner level lab, you will be able to:
- Author a naive Dockerfile that copies a Flask app, installs
requirements.txt, and runs the app on a non-reserved port. - Refactor the Dockerfile to copy
requirements.txtbefore the application code so pip layers stay cached across code edits. - Write a
.dockerignorethat excludes__pycache__/,*.pyc,.venv/,.git/, and.envfrom the build context. - Build a
Dockerfile.devthat enables Flask debug mode and hot reload via a bind mount, withPYTHONDONTWRITEBYTECODE=1to prevent.pycleakage to the host. - Build a
Dockerfile.prodthat runs gunicorn as a non-root user using exec-formCMDfor clean SIGTERM handling.
Who is this lab for?
This lab is designed for:
- Developers with basic Python and Flask familiarity who want to package a Python web service for production.
- Engineers who have written Dockerfiles in other languages and want to learn the Python-specific patterns around pip caching, bytecode, and WSGI servers.
- Platform learners moving from
python app.pyon a laptop to a portable, reproducible image.
No prior Docker knowledge is required, but learners should understand pip, virtual environments, and the difference between a development server and a production server.
Verified against your live environment
An automated validation engine inspects your actual resources and configurations as you work. Completion means the task was performed, not multiple choice, real-world proficiency.
More labs like this
Running Containers with docker run and kubectl
Run nginx:alpine first with docker run then with kubectl run on the same VM, and see how Kubernetes maps onto Docker concepts.
Deploy Multi-Container Apps with Docker Compose
Author a compose.yaml that runs nginx, a Python API, and Postgres as a single declarative multi-service stack.
Speed Up Docker Builds with Layer Caching and dockerignore
Refactor a slow Dockerfile to leverage layer caching, add a .dockerignore to shrink the build context, and inspect the resulting image with docker history and docker diff.
Related reading
Environment
Every lab includes
- Real environment, pre-credentialed
- Automated checks on every step
- Isolated sandbox, auto cleanup
- AI-recommended next steps
Lab curriculum
- 01
Getting Started with Docker IDE
- 02
Author a Naive Flask Dockerfile and Build It
1 automated check
- 03
Optimize the Flask Dockerfile for Layer Caching
1 automated check
- 04
Add a Dockerignore File to Shrink the Build Context
1 automated check
- 05
Build a Dockerfile Dev Variant with Hot Reload
1 automated check
- 06
Build a Dockerfile Prod Variant with Gunicorn and Non-Root User
1 automated check
Skills validated
Not the lab you were looking for?
Browse 200+ hands-on labs across AWS, Azure, Kubernetes, Docker, and cloud security.