Docker without fear: run any self-hosted app in a container
Most self-hosted apps say "just run this Docker command". By step 3 you'll have a website monitor running on your own PC from one line, then a private budgeting app next to it. Along the way, learn what images, containers, volumes and ports are, and the habits that keep your data safe.
docker run line, then from a compose.yaml you understand line by line- Safe defaults: private ports, pinned versions, secrets out of your files, and a five-question checklist for any README's Docker instructions
- A starter kit: compose files for Uptime Kuma and Actual Budget, plus backup and restore scripts for Windows, Mac and Linux
- A 64-bit computer with 8GB of RAM. On Windows: Windows 10 22H2 or Windows 11 23H2 or newer, with hardware virtualisation switched on (step 2 shows how to check). On Linux: Ubuntu 22.04, 24.04 or 26.04 LTS, or another distribution on Docker's supported list ↗. A recent Mac also works.
- Admin rights once, on Windows. Docker Desktop needs WSL 2 (Windows Subsystem for Linux), and turning that on the first time needs an administrator. Docker Desktop itself can then install just for your user, without admin.
- Several GB of free disk space for Docker Desktop and its Linux engine. The Uptime Kuma image in this mission is a 182MB download, and Actual Budget's is 120MB.
- Docker Desktop's licence. It's free for personal use, education, non-commercial open source and small businesses (fewer than 250 employees and less than $10 million in annual revenue). Bigger organisations need a paid plan, from $9 per user a month billed yearly (current prices are on Docker's pricing page ↗). Docker Engine on Linux is open source and free for everyone.
- The terminal basics. You'll type every command. New to it? Do the Terminal survival kit first.
- A password manager for the app logins you create. KeePassXC is free.
Learn the four words: image, container, volume, port
Every self-hosting README assumes you know these. Once they click, a long `docker run` line stops looking like a magic spell.
Docker runs apps in containers: sealed boxes that hold an app and everything it needs, sharing your computer's power but not its files. That's why one command gives you the same app on Windows, a Mac, a Linux laptop or a £5 server. Four words do most of the work:
- Image: the recipe. A read-only package you download from a registry such as Docker Hub. Its name has two halves:
louislam/uptime-kumasays who and what, and the tag after the colon,2.5.5-slim, says which version. - Container: a running copy of an image. Containers are disposable: you delete and recreate them all the time. Updating an app means throwing its container away and making a new one from a newer image.
- Volume: where the data lives. Storage that Docker manages outside the container, attached at a folder inside it. Delete the container and the volume stays. Forget the volume and your data dies with the container.
- Port: the door. An app listens on a port inside its container, and nothing outside can reach it until you publish that port.
127.0.0.1:3001:3001reads as: on this computer's private address, port 3001, forward to port 3001 inside the container.

What you'll build in steps 3 and 4. The container is disposable. The volume is the part you protect. - Image: the recipe. A read-only package you download from a registry such as Docker Hub. Its name has two halves:
Three more names you'll see. Docker Engine is the background service that actually runs containers, and it runs natively on Linux. Docker Desktop is an app for Windows and Mac that runs Docker Engine inside a small built-in Linux machine and adds a dashboard. Docker Compose reads a
compose.yamlfile, so you write an app's settings down once instead of retyping a long command.TipThe website monitoring lesson installed Uptime Kuma with Node instead. That works, but most self-hosted apps only document Docker, and Docker gives you one install, update and backup routine for all of them.
127.0.0.1:3001:3001 is your computer and which is the container, and what you'd lose by deleting a container that has no volume.