# Containerization Package your app and its environment together so it runs identically on every machine — dev, CI, and production. ## Tools **Docker** is the standard. Everything else (Podman, containerd) is compatible with Docker images. ## Key Concepts - **Image** — a snapshot of your app + OS + dependencies - **Container** — a running instance of an image - **Dockerfile** — the recipe for building an image - **Local CI pattern** — run your test suite inside a container before pushing; catches environment drift before it reaches remote CI ## Minimal Dockerfile (Python) ```dockerfile FROM python:3.12-slim WORKDIR /app COPY pyproject.toml . RUN pip install uv && uv pip install --system -e ".[dev]" COPY . . CMD ["python", "-m", "mypackage"] ``` ## Quickstart ```bash # build docker build -t myapp . # run docker run --rm myapp # local CI — run tests inside the container docker run --rm myapp pytest # interactive shell for debugging docker run --rm -it myapp bash ``` ## Tips - Use `.dockerignore` to exclude `__pycache__`, `.git`, `.venv`, `*.pyc` - Pin the base image tag (`python:3.12-slim`, not `python:latest`) - Layer ordering matters: copy dependency files before source so the install layer is cached