If you've read almost any self-hosting guide, including our own home server basics guide, you've run into the word "Docker" — usually with a promise that it makes installing apps easier, and rarely with an explanation of what it actually is. This guide fills that gap: what Docker does, why it exists, and how to read your first Docker Compose file.

Advertisement placeholder Reserved for a Google AdSense unit once the site is approved. No ad code is loaded yet.

The problem Docker solves

Every app needs specific supporting software to run — a particular programming language runtime, specific library versions, particular configuration files. Installing an app the traditional way means installing all of that manually on your actual operating system, and it's easy for one app's requirements to conflict with another's, or with what your OS already has installed. This used to be called "dependency hell," and it's exactly the kind of problem that scared beginners away from self-hosting.

Docker solves this by packaging an app together with everything it needs into one self-contained unit that runs the same way on any machine, isolated from everything else on your system. You don't install the app's dependencies yourself — they're already inside the package.

Images vs. containers

These two terms get used interchangeably by beginners, but they mean different things:

TermWhat it actually is
ImageA read-only template — a frozen snapshot of an app plus everything it needs. You download an image once from a registry like Docker Hub.
ContainerA running instance of an image — the live, working copy actually doing something. You can start, stop, or delete a container without touching the image it came from.

Think of an image like an app installer file, and a container like the actual running app — except containers start in seconds and can be thrown away and recreated instantly without losing your data, as long as that data lives outside the container itself (more on that below).

Why nearly every self-hosted app uses Docker

Advertisement placeholder Reserved for a Google AdSense unit once the site is approved. No ad code is loaded yet.

Docker Compose: describing your setup in one file

Running one container is easy; running several apps that need to work together gets messy with individual commands. Docker Compose solves this with a single text file (usually named docker-compose.yml) that describes exactly what to run and how — so setting up an app becomes "paste this file, run one command" instead of a long manual walkthrough. Here's a simplified real example for Jellyfin, the media server we cover in our Jellyfin vs Plex guide:

services:
  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    ports:
      - "8096:8096"
    volumes:
      - ./config:/config
      - ./media:/media
    restart: unless-stopped

Reading it line by line:

Where do you actually run Docker?

PlatformHow Docker fits in
Proxmox VERuns inside a VM or LXC container on top of Proxmox — typically a small Ubuntu VM with Docker installed on it.
TrueNAS ScaleBuilt in — the "Apps" section is Docker-based under the hood, with a graphical install flow.
UnraidBuilt in — the Docker tab and its app store (Community Applications) are widely considered the easiest GUI-based Docker experience.
Plain Ubuntu ServerInstalled manually — the most control and the most manual setup, favored by more experienced self-hosters.

None of these are wrong choices — see our full OS comparison for help picking one based on how hands-on you want to be.

Common beginner questions

Do I need to know Linux to use Docker? Not deeply. Most day-to-day work happens through a web dashboard (built into TrueNAS and Unraid, or via a separate tool like Portainer) — you'll pick up terminal basics naturally over time, the same way most self-hosters do.

What happens when I reboot my server? With restart: unless-stopped set (as in the example above), containers start themselves back up automatically — you don't need to relaunch anything by hand.

How do I update an app? You pull the newer version of the image and recreate the container from it. Because your actual data lives in the mapped volumes, not inside the container, updating doesn't touch your files or settings.

What if I break something? Since containers are disposable, the usual fix is simply deleting and recreating the container from the same Compose file — your data in the volumes is untouched, and you're back to a clean working state in seconds.

HL
HomeLab Starter Team
We write hands-on, beginner-first guides to home servers and self-hosting. See our About page for more on how we test and choose recommendations.