Skip to main content
RunBook Academy

Docker & ContainersI · FoundationsCourse introduction

Welcome to Docker & Containers for Production Sysadmins

Foundation⏱ ~18 minbashdockersystemctl

What you'll learn

  • Understand the pedagogical approach and what production-readiness means here
  • Identify the verified software versions this course targets
  • Name the four things Docker changes about a host that surprise experienced Linux administrators
  • Triage a Docker host you have just inherited
  • Know how to navigate the curriculum and track progress

Prerequisites

None — start here.

Verified against Docker Engine 29.x · Docker Engine 28.x · Docker Compose 2.x · containerd 2.x · runc 1.2.x · BuildKit 0.20+ · Linux kernel 5.15+ · Ubuntu 24.04 LTS · Debian 12 (Bookworm) · 2026-08-12

Not yet marked complete on this device.

This lesson sets expectations and introduces the design system. Skim it once; then start the curriculum.

What this course is

A practical, production-oriented Docker course for Linux sysadmins. By the end, a sysadmin completing the course should be capable of independently managing business-critical Docker infrastructure while maintaining security, stability, performance, observability, recoverability, and operational resilience.

It is written for somebody who is already on call for Linux hosts. That shapes every chapter: the question is never “how do I run this container”, it is “what did installing Docker change about a machine I am responsible for, and what will wake me up”.

What it assumes you already know

Not Docker. Linux.

  • systemd — units, systemctl status, journalctl -u, and the difference between restart and reload.
  • Processes and signals — PID 1, SIGTERM versus SIGKILL, what an exit code of 137 means.
  • Filesystems — mounts, bind mounts, df and du disagreeing, and why a full filesystem breaks unrelated things.
  • Networking — interfaces, routes, ss -ltnp, and at least a reading knowledge of iptables or nftables.
  • Users and permissions — UIDs versus usernames, supplementary groups, and why group membership is an access-control decision.

Where a Docker concept rests on a kernel primitive, the course names the primitive rather than gesturing at it: the cgroup file, the namespace, the veth pair, the OCI config.json. If a term in that list is unfamiliar, the Linux course on this site covers it, and Part II of this one (Linux Internals) revisits the container-specific parts.

Four things Docker changes about a host

These are the ones that surprise experienced administrators, because each of them quietly overrides a habit that has been correct for years.

What Docker is not

Being honest about the boundary saves arguments later. Docker Engine is a single-host container runtime with a good developer experience. On one host it gives you images, isolation, resource limits, networking and volumes.

It does not give you a scheduler, cross-host networking, rolling deploys with automatic rollback, or a secrets store outside of Swarm. Compose is a way to describe a set of containers on one host, not a cluster manager. If you need workloads to move between hosts automatically, that is Swarm, Nomad or Kubernetes, and choosing one is a separate decision this course will not pretend Docker already solved.

Most estates that run Docker in production run it on a handful of carefully managed hosts, and that is a legitimate architecture rather than a stepping stone.

Triaging a host you have inherited

The first ten minutes on an unfamiliar Docker host, in order. Everything here is read-only.

Read-only / Safefirst ten minutes
docker version
docker info --format 'live-restore={{.LiveRestoreEnabled}} logdriver={{.LoggingDriver}} cgroup={{.CgroupVersion}} storage={{.Driver}}'
cat /etc/docker/daemon.json 2>/dev/null || echo 'no daemon.json - all defaults'
df -h /var/lib/docker
docker system df
docker ps -a --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}'
journalctl -u docker.service --since '24 hours ago' --no-pager | tail -40
Read-only / Safedocker info
$ docker info --format 'live-restore={{.LiveRestoreEnabled}} logdriver={{.LoggingDriver}} cgroup={{.CgroupVersion}} storage={{.Driver}}'
live-restore=false logdriver=json-file cgroup=2 storage=overlay2

Illustrative output

live-restore=false means you cannot restart the daemon in hours. logdriver=json-file with no options in daemon.json means logs are unbounded. Those two facts, gathered in ten seconds, change what you are allowed to do for the rest of the shift.

Verified against

Read-only / SafeInspect
$ docker version
Client: Docker Engine - Community
Version:           28.1.1
API version:       1.49
Go version:        go1.23.6
Git commit:        4af6f4d
Built:             Wed Jul  9 19:46:14 2025
OS/Arch:           linux/amd64
Context:           default

Server: Docker Engine - Community
Engine:
Version:          28.1.1
API version:      1.49 (minimum version 1.24)
Go version:       go1.23.6
Git commit:       4af6f4d
Built:            Wed Jul  9 19:46:14 2025
OS/Arch:          linux/amd64
Experimental:     false

Illustrative output

Severity model

Every command example is tagged with a severity badge. This is not decoration — it is a production discipline tool. Read the badge before the command.

Configuration changedaemon.json
cat > /etc/docker/daemon.json <<'EOF'
{
"log-driver": "json-file",
"log-opts": {
  "max-size": "10m",
  "max-file": "3"
}
}
EOF
Service impact possiblerestart daemon
systemctl restart docker
Destructiveremove container
docker rm -f web01
Data-loss riskdrop volume
docker volume rm pgdata

Lab

Mode B · Nested virtualisationMode C · Simulation / guided exercise

Mode B requires a Linux VM with nested virtualisation enabled and a Docker daemon installed. Mode C is a guided walkthrough you can complete without a real Docker host.

Lesson anatomy

Major lessons follow this structure:

  1. What you will learn
  2. Why this matters in production
  3. Mental model
  4. Architecture / visual explanation
  5. How to configure it
  6. How to validate it
  7. How it fails
  8. How to troubleshoot it
  9. Security and performance implications
  10. Production guidance and rollback

Two of those carry most of the weight. How it fails is where the failure modes live, usually in a “What could go wrong?” callout with the symptom, the reason the obvious diagnosis is wrong, and the fix. How to validate it always gives a command whose output distinguishes working from broken — “run it and see” is not validation anywhere in this course.

Knowledge check

Knowledge check · 6 questions

  1. Q1. Which Linux kernel feature isolates a container's view of processes?

  2. Q2. By default, a Docker container running as UID 0 is UID 0 to the host kernel too.

  3. Q3. Which of the following are required to bring a container online? Select all that apply.

  4. Q4. A host runs ufw with default deny incoming. A container is started with `-p 8080:80` and the port is reachable from the network. What is happening?

  5. Q5. On a default Docker installation, `systemctl restart docker` leaves running containers untouched.

  6. Q6. Which of these does Docker Engine on its own NOT provide? Select all that apply.

Passing score: 75%. Answers are checked in this browser.

Where next?

The first deep-dive is on Linux container primitives — namespaces, cgroups, OverlayFS, capabilities — because every later decision in Docker depends on them. See Part II (Linux Internals) of the curriculum.