Dockerize an App
You have an app that runs on your laptop. It works. Then a teammate clones it, runs the same commands, and gets a wall of errors - a missing library, the wrong language version, a database that isn't there. You spend an afternoon over a screen-share fixing their machine instead of building anything.
This weekend you're going to fix that for good. You'll take a small web app, put it inside a container, and end up with something anyone can run with one command - same versions, same dependencies, same database, every time. No "works on my machine."
What you'll build
A small Python web app (Flask) running inside a Docker container, talking to a Postgres database in a second container, the two wired together with a single compose file. By the end you'll bring the whole stack up with docker compose up and shut it down with docker compose down, and you'll have an image you can tag and push to a registry for someone else to pull and run.
The stack
| Piece | What it is |
|---|---|
| Docker Engine | Runs containers on your machine |
| Flask | A tiny Python web app (the thing we containerize) |
| Postgres | The database, run as its own container |
| Docker Compose | Wires the app and database together |
Built on your machine
This is a build-on-your-machine project, not a run-in-the-browser one. Every command here you run in your own terminal. You need Docker installed before you start - get Docker Desktop (macOS, Windows) or Docker Engine (Linux) from docker.com, then confirm it's alive:
If hello-world prints a friendly message, you're set. If it can't connect to the Docker daemon, start Docker Desktop (or run sudo systemctl start docker on Linux) and try again.
You'll also want Python 3 on hand for the first couple of phases, though by the end the container holds its own Python and your machine's version stops mattering - which is the whole point.
Rough time
About a weekend, in four sittings:
- Phase 1 - the "works on my machine" problem, and your first Dockerfile that builds and runs.
- Phase 2 - a real Dockerfile: caching,
.dockerignore, a slim base, a non-root user. - Phase 3 -
docker composeto run the app and a Postgres database together. - Phase 4 - ship it: environment variables, secrets, a healthcheck, and pushing to a registry.
What you'll learn
- The difference between an image (the recipe) and a container (a running instance of it).
- How Docker's layer cache makes the difference between a 2-second rebuild and a 2-minute one.
- Why the order of lines in a Dockerfile matters more than almost anything else.
- How containers find and talk to each other on a network.
- How to pass configuration in without baking secrets into the image.
- How to hand your image to someone else so they run it with no setup at all.
Open a terminal, make a folder for this project, and turn to Phase 1.