Tech Vault

Docker and containers

A container is an app packed with everything it needs to run, kept in its own box on your server. Docker is the program that runs containers, and it's how most homelab apps get installed.

Checked 9 November 2026

Our pick

Docker Engine with Compose

Each app is described in one short text file, compose.yaml, which says what to download, which port to use and which folders hold its data. Type docker compose up -d in that folder and the app starts. Type docker compose pull and then the same command again, and it updates. Almost every self-hosted project publishes a Compose example, and Docker's own install guide sets up Compose for you.

docs.docker.com
Cost
Free
Good for
Running many small apps on one server, each kept separate and easy to remove. If you'd rather not type commands, ZimaOS has Docker built in and installs apps from its App Store or from a pasted compose file.
Watch out for
An app's data survives an update only if the compose file maps it to a folder or volume on the server. Anything left inside the container is lost when it's recreated, so check the volumes lines before you trust an app with anything important.

What a container is

Installing an app the old way scatters its files across the system, and two apps that need different versions of the same library can break each other. A container avoids that. It’s a sealed package holding one app and everything it needs to run, kept in its own space on your server. Remove it and nothing is left behind.

Docker is the program that downloads and runs containers. The package you download is called an image, and a running copy of it is a container. Projects publish their images on sites such as Docker Hub, and the same image runs the same way on any Linux machine. That’s why the install instructions for almost every self-hosted app start with Docker.

Where the data lives: understand this first

A container is meant to be thrown away. When you update an app, Docker deletes the old container and makes a new one from the new image, and anything stored inside the old container goes with it.

So every app that keeps data is given a folder on your server to write into. This is called a volume, or a bind mount when it points at a folder you chose. The app sees the folder as part of itself, but it really lives on your server’s disk, so it survives updates. That folder is the thing you back up.

Before you trust an app with photos or passwords, find out where its folder is and make sure your backups include it.

How a compose file works

Each app is described by a short text file called compose.yaml. You don’t need to write one from scratch, because projects publish them, but it helps to be able to read one. This is the official file for Uptime Kuma, a small app that checks your other apps are still up:

services:
  uptime-kuma:
    image: louislam/uptime-kuma:2
    restart: unless-stopped
    volumes:
      - ./data:/app/data
    ports:
      - "3001:3001"
  • image says what to download. The part after the colon is the tag, which picks the version: here, the version 2 series.
  • restart: unless-stopped starts the app again after a crash or a reboot, unless you stopped it yourself.
  • volumes is the data folder. The left side is a folder on the server (here, one called data next to the compose file), and the right side is where the app sees it.
  • ports connects the server to the app. The left number is the port on the server and the right is the port inside the container, so you’d open http://your-server:3001. Two apps can’t share the same left-hand number, so change the left side if it’s taken.

That file is everything ZimaOS, Dockge or Portainer need to install the app for you.

What it needs

  • A 64-bit Linux system for Docker Engine. On a Windows or Mac computer, Docker Desktop runs the same containers in a window, and it’s free for personal use, but the apps stop when the computer sleeps.
  • Memory for the apps. Each container uses only what its app needs. Small tools use very little; photo, media and AI apps want much more.
  • The right image for your chip. A Raspberry Pi needs images built for Arm chips. Most popular apps publish both kinds, and the image’s page says which it has.
  • Somewhere to keep compose files, one folder per app, alongside its data.

How Docker Engine with Compose fits in

  • One file per app. Each app’s whole setup is a short file in its own folder, easy to read, copy and back up.
  • The same few commands for everything. Start, stop and update work the same way for every app.
  • The same file everywhere. A compose file from a project’s instructions works on Ubuntu, Debian or Raspberry Pi OS, and it’s what ZimaOS imports.
  • Apps kept apart. One app’s update can’t break another app’s libraries.
  • Clean removal. Delete the container and its folder, and the app is gone.
  • Buttons if you want them. Dockge, Portainer and the other options below put a web page on top of the same files.

The easy way to set it up

ZimaOS has Docker built in, and its App Store is a catalogue of ready-made compose files. Nothing here needs the terminal:

  1. Install ZimaOS on a spare computer. The server operating systems page shows how.
  2. Install from the App Store. Search for the app and install it. Its icon appears on the dashboard.
  3. Add anything else from its compose file. Press + on the dashboard, choose Install a customized app, then Import, and paste the project’s compose file. Check the ports and folders it shows before you install.
  4. See everything in detail, if you want to, by installing Portainer from the App Store.

ZimaOS also marks apps that have an update waiting.

On a Windows or Mac computer, install Docker Desktop with its normal installer. Its window lists your containers and images with start, stop and delete buttons. Starting a compose file still takes one typed command, docker compose up -d, run in the file’s folder.

The terminal route. On Ubuntu, Debian or Raspberry Pi OS, install Docker Engine by following the steps for your system on docs.docker.com, put each compose.yaml in its own folder, and start it with that same command. The Linux command line page covers moving between folders.

Questions people ask

Is Docker safe?

Containers are kept apart from each other, but they aren’t as sealed off as a virtual machine, and anything that controls Docker can control the whole server. Use images from the project itself or from LinuxServer.io, publish only the ports you need, and reach admin pages from outside the house through remote access rather than opening them to the internet.

How do I update an app?

Download the new image and recreate the container. ZimaOS, Dockge and Portainer do it from the app’s page, and in the terminal it’s the two commands in the pick above. Data in volumes survives. Before a big version jump, read the app’s release notes and make a backup.

What does “latest” mean in an image name?

It’s a tag meaning “whatever the newest version is”. That’s convenient, but an update can jump a major version without warning. A version tag, like :2 in the example above, keeps you on one series until you choose to move.

Where do I find a compose file for an app?

In the project’s own install instructions; search its documentation for “Docker Compose”. If a project only gives a docker run command, Dockge can turn it into a compose file. LinuxServer.io publishes compose examples for every image it builds.

How is a container different from a virtual machine?

A container shares the server’s core, the kernel, and holds one app. A virtual machine carries a whole operating system of its own. Use containers for apps, and a VM when you need a different system, such as Windows.

Also good

Skip

Next