Docker for Software Development: Two-Week Online Course
=======================================================
A two-week online course on Docker, taught on Smarter's multi-container application, with six
30-minute recorded lectures and a 90-minute live session each week. Week 1 covers images and the
Dockerfile, and week 2 covers Compose, configuration and production images. See
:doc:`../course-formats` for the format, the grading scale and the course policies, and
:doc:`../docker` for an overview of the subject.
At a Glance
-----------
.. list-table::
:widths: 25 75
* - **Students**
- Developers and operations engineers who are new to containers.
* - **Deployment**
- Each student clones the repository and runs it with Docker. ``make init`` is done before
Live session 1.
* - **Workload**
- 3 hours of instruction and 4 to 6 hours of assignments each week.
* - **Cost**
- Free.
Learning Objectives
-------------------
By the end of the course, students can:
1. Explain images, layers, containers, volumes, networks and registries.
2. Read and write multi-stage Dockerfiles.
3. Run and debug multi-container applications with Compose.
4. Configure containers through the environment, following the twelve-factor app.
5. Build small, fast and secure images, and measure them.
Technical Prerequisites
-----------------------
- **Required:** the Linux or macOS command line, files and permissions, environment variables
and processes.
- **Required:** Git: clone, branch, commit and push, and a GitHub account.
- **Required:** Docker Desktop (or Docker Engine) with at least 8 GB of memory, and the
repository built with ``make init`` before Live session 1.
- **Required:** reading YAML.
- **Helpful:** reading Python, and basic networking.
Schedule
--------
.. list-table::
:header-rows: 1
:widths: 10 18 72
* - Week
- Item
- Content
* - 1
- Lecture 1 (30 min)
- **Why containers.** Virtual machines versus containers, images, layers and registries.
:doc:`ADR 002 `.
* - 1
- Lecture 2 (30 min)
- **Inspecting containers.** ``ps``, ``images``, ``history``, ``inspect``, ``exec``, ``logs``
and ``stats``.
* - 1
- Lecture 3 (30 min)
- **The Dockerfile.** Instructions, the build cache, multi-stage builds, and Smarter's
``Dockerfile`` stage by stage.
* - 1
- Live session 1 (90 min)
- Installation triage, then a live exploration of Smarter's running containers. Pairs answer
questions about them. Start Assignment 1.
* - 2
- Lecture 4 (30 min)
- **Compose.** Services, networks, volumes, environment files and health checks, in
Smarter's ``docker-compose.yml``.
* - 2
- Lecture 5 (30 min)
- **One image, many roles.** Web server, workers and scheduler from one image;
:doc:`ADR 004 on the twelve-factor app `.
* - 2
- Lecture 6 (30 min)
- **Better images.** Layer order, slim bases, ``.dockerignore``, non-root users, secrets, and
scanning with Trivy.
* - 2
- Live session 2 (90 min)
- Capstone presentations (about 5 minutes each, with 2 minutes of questions).
Assignment 1 is due at the end of week 1, Assignment 2 in the middle of week 2, and Assignment 3
and the capstone at the start of Live session 2.
Graded Assignments
------------------
Assignment 1: Inventory and Annotated Dockerfile
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Students produce an inventory of the running containers, and annotate Smarter's ``Dockerfile``
stage by stage.
**Turn in:** the inventory table, and the annotated Dockerfile in their fork.
.. list-table::
:header-rows: 1
:widths: 22 8 35 35
* - Criterion
- Pts
- Exemplary
- Developing
* - Inventory
- 6
- Complete, gathered with ``inspect`` and ``exec``.
- Copied from the Compose file.
* - Annotation accuracy
- 8
- Every stage and instruction correct.
- Several errors.
* - Reasoning
- 4
- Explains why, including the non-root user.
- Restates instructions.
* - Clarity
- 2
- Easy to read.
- Disorganized.
Assignment 2: Request Trace
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Students follow a chat request from the web server to a Celery worker and back, with evidence, and
explain the one-image, many-roles design.
**Turn in:** a sequence diagram and evidence.
.. list-table::
:header-rows: 1
:widths: 22 8 35 35
* - Criterion
- Pts
- Exemplary
- Developing
* - Trace
- 8
- Every hop.
- Gaps.
* - Evidence
- 6
- Logs and Redis activity.
- Inferred.
* - Explanation
- 6
- Clear explanation of roles and configuration.
- Missing.
Assignment 3: Compose for a Small App
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Students write a Dockerfile and Compose file for a small provided application (a web process, a
worker and a database) using the patterns from Smarter.
**Turn in:** a Git repository that starts with ``docker compose up``.
.. list-table::
:header-rows: 1
:widths: 22 8 35 35
* - Criterion
- Pts
- Exemplary
- Developing
* - Works
- 6
- Starts from a clean clone.
- Manual steps needed.
* - Dockerfile
- 5
- Non-root, cache-friendly.
- Root, uncached.
* - Compose
- 5
- Health checks, dependencies, volumes.
- Services only.
* - Configuration
- 4
- Environment file, no secrets committed.
- Secrets committed.
Capstone Projects
-----------------
Students choose one, and present it in Live session 2.
Capstone A: A Leaner, Safer Image
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Learning objective.** Improve a real production image, and prove the improvement with
measurements.
Students change Smarter's ``Dockerfile`` on their fork (for example, a separate build stage, better
layer ordering, a tighter ``.dockerignore``) and measure size, cold and cached build time, and Trivy
findings before and after.
**What students turn in:**
- A pull request against their fork, and a measurement table with commands.
- Evidence that every container still works.
- A five-minute presentation.
**How it is graded (100 points):**
.. list-table::
:header-rows: 1
:widths: 22 8 35 35
* - Criterion
- Pts
- Exemplary
- Developing
* - Improvement
- 25
- Meaningful and measured.
- Marginal.
* - Measurement
- 25
- Repeatable, three dimensions.
- One, or not repeatable.
* - Still works
- 20
- Every role healthy.
- A role broken.
* - Dockerfile quality
- 15
- Readable, passes Hadolint.
- Hard to follow.
* - Presentation
- 15
- Clear trade-offs, on time.
- Overruns.
Capstone B: Containerize Your Own Application
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Learning objective.** Apply Smarter's container patterns to a new application.
Students containerize an application of their own or an open source one, with a web process, a
background job and a database: one image for several roles, non-root, configured through the
environment, with health checks.
**What students turn in:**
- A Git repository with the application, ``Dockerfile``, ``docker-compose.yml``, ``.dockerignore``
and ``README.md``.
- A one-page comparison with Smarter's choices.
- A five-minute presentation with a live start from a clean clone.
**How it is graded (100 points):**
.. list-table::
:header-rows: 1
:widths: 22 8 35 35
* - Criterion
- Pts
- Exemplary
- Developing
* - Works
- 25
- One command from a clean clone.
- Manual steps.
* - Dockerfile
- 20
- Multi-stage, non-root, cache-friendly.
- Single stage, root.
* - Compose
- 20
- Health checks, dependencies, volumes.
- Services only.
* - Configuration
- 15
- Twelve-factor, no secrets in the image.
- Secrets baked in.
* - Documentation and presentation
- 20
- Clear.
- Missing.
Recommended Texts
-----------------
- **Required:** Nigel Poulton, *Docker Deep Dive* (latest edition, self-published). Week 1: the
chapters on images, containers and containerizing an app. Week 2: the chapters on Compose,
networking, volumes and security.
- **Required:** `The Twelve-Factor App `__, in week 2.
- **Reference:** Docker's `building best practices `__.
- **Smarter documentation:** :doc:`/smarter-framework/technologies/docker`,
:doc:`/adr/002-docker` and :doc:`/adr/004-12-factor`.
Further Study
-------------
.. include:: further-study.txt